ng-virtual-list 17.0.18 → 17.0.19

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.
@@ -342,7 +342,7 @@ export class TrackBox extends CacheMap {
342
342
  }
343
343
  }
344
344
  }
345
- else if (y < scrollSize - componentSize) {
345
+ else if (y <= scrollSize - componentSize) {
346
346
  leftItemsWeights.push(componentSize);
347
347
  leftHiddenItemsWeight += componentSize;
348
348
  itemsFromStartToScrollEnd = ii;
@@ -358,7 +358,7 @@ export class TrackBox extends CacheMap {
358
358
  itemsFromStartToDisplayEnd = ii;
359
359
  totalItemsToDisplayEndWeight += componentSize;
360
360
  itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
361
- if (y < scrollSize - componentSize) {
361
+ if (y <= scrollSize - componentSize) {
362
362
  switch (itemDisplayMethod) {
363
363
  case ItemDisplayMethods.CREATE: {
364
364
  leftSizeOfAddedItems += componentSizeDelta;
@@ -624,4 +624,4 @@ export class TrackBox extends CacheMap {
624
624
  }
625
625
  }
626
626
  }
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tCb3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFRLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3ZGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBQztBQThEcEQsSUFBSyxrQkFLSjtBQUxELFdBQUssa0JBQWtCO0lBQ25CLCtEQUFNLENBQUE7SUFDTiwrREFBTSxDQUFBO0lBQ04sK0RBQU0sQ0FBQTtJQUNOLHlFQUFXLENBQUE7QUFDZixDQUFDLEVBTEksa0JBQWtCLEtBQWxCLGtCQUFrQixRQUt0QjtBQVNEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxRQUF3RjtJQUN4RyxRQUFRLENBQStEO0lBRXZFLE1BQU0sQ0FBa0Q7SUFFbEUsSUFBSSxLQUFLLENBQUMsQ0FBa0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVTLGtCQUFrQixDQUFxRTtJQUVqRyxJQUFJLGlCQUFpQixDQUFDLENBQXFFO1FBQ3ZGLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLG9CQUFv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QUMzQixPQUFPO1FBQ1gsQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixTQUFTO1lBQ2IsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFUSxPQUFPO1FBQ1osS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctdmlydHVhbC1saXN0LWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1pdGVtLm1vZGVsXCI7XHJcbmltcG9ydCB7IElkIH0gZnJvbSBcIi4uL3R5cGVzL2lkXCI7XHJcbmltcG9ydCB7IENhY2hlTWFwLCBDTWFwIH0gZnJvbSBcIi4vY2FjaGVNYXBcIjtcclxuaW1wb3J0IHsgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuaW1wb3J0IHsgSVNpemUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuaW1wb3J0IHsgSEVJR0hUX1BST1BfTkFNRSwgV0lEVEhfUFJPUF9OQU1FLCBYX1BST1BfTkFNRSwgWV9QUk9QX05BTUUgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgSVZpcnR1YWxMaXN0U3RpY2t5TWFwIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSA9ICdjaGFuZ2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljcyB7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQ6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgaXRlbVNpemU6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kOiBudW1iZXI7XHJcbiAgICBpdGVtc09uRGlzcGxheTogbnVtYmVyO1xyXG4gICAgaXRlbXNPbkRpc3BsYXlMZW5ndGg6IG51bWJlcjtcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIGxlZnRJdGVtTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZWZ0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHJlbmRlckl0ZW1zOiBudW1iZXI7XHJcbiAgICByaWdodEl0ZW1MZW5ndGg6IG51bWJlcjtcclxuICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHNjcm9sbFNpemU6IG51bWJlcjtcclxuICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zOiBudW1iZXI7XHJcbiAgICBzaXplUHJvcGVydHk6IHR5cGVvZiBIRUlHSFRfUFJPUF9OQU1FIHwgdHlwZW9mIFdJRFRIX1BST1BfTkFNRTtcclxuICAgIHNuYXA6IGJvb2xlYW47XHJcbiAgICBzbmlwcGVkUG9zOiBudW1iZXI7XHJcbiAgICBzdGFydEluZGV4OiBudW1iZXI7XHJcbiAgICBzdGFydFBvc2l0aW9uOiBudW1iZXI7XHJcbiAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0OiBudW1iZXI7XHJcbiAgICB0b3RhbExlbmd0aDogbnVtYmVyO1xyXG4gICAgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICB0eXBpY2FsSXRlbVNpemU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PiB7XHJcbiAgICBib3VuZHM6IElTaXplO1xyXG4gICAgY29sbGVjdGlvbjogQztcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXRlbXNPZmZzZXQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb246IGJvb2xlYW47XHJcbiAgICBmcm9tSXRlbUlkPzogSWQ7XHJcbiAgICBwcmV2aW91c1RvdGFsU2l6ZTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG4gICAgZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemU7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ2NvbGxlY3Rpb24nIHwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxudHlwZSBDYWNoZU1hcEV2ZW50cyA9IHR5cGVvZiBUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUU7XHJcblxyXG50eXBlIE9uQ2hhbmdlRXZlbnRMaXN0ZW5lciA9ICh2ZXJzaW9uOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG50eXBlIENhY2hlTWFwTGlzdGVuZXJzID0gT25DaGFuZ2VFdmVudExpc3RlbmVyO1xyXG5cclxuZW51bSBJdGVtRGlzcGxheU1ldGhvZHMge1xyXG4gICAgQ1JFQVRFLFxyXG4gICAgVVBEQVRFLFxyXG4gICAgREVMRVRFLFxyXG4gICAgTk9UX0NIQU5HRUQsXHJcbn1cclxuXHJcbmludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uO1xyXG4gICAgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgdHJhY2tpbmcsIGNhbGN1bGF0aW9ucyBhbmQgY2FjaGluZy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTcueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhY2tCb3ggZXh0ZW5kcyBDYWNoZU1hcDxJZCwgSVNpemUgJiB7IG1ldGhvZD86IEl0ZW1EaXNwbGF5TWV0aG9kcyB9LCBDYWNoZU1hcEV2ZW50cywgQ2FjaGVNYXBMaXN0ZW5lcnM+IHtcclxuICAgIHByb3RlY3RlZCBfdHJhY2tlciE6IFRyYWNrZXI8SVJlbmRlclZpcnR1YWxMaXN0SXRlbSwgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBpdGVtcyh2OiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pdGVtcyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50Pj4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBkaXNwbGF5Q29tcG9uZW50cyh2OiBBcnJheTxDb21wb25lbnRSZWY8TmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0cmFja0J5IHByb3BlcnR5XHJcbiAgICAgKi9cclxuICAgIHNldCB0cmFja2luZ1Byb3BlcnR5TmFtZSh2OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLnRyYWNraW5nUHJvcGVydHlOYW1lID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tlciA9IG5ldyBUcmFja2VyKHRyYWNraW5nUHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQoaWQ6IElkLCBib3VuZHM6IElTaXplKTogQ01hcDxJZCwgSVNpemU+IHtcclxuICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuX21hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICBpZiAoYj8ud2lkdGggPT09IGJvdW5kcy53aWR0aCAmJiBiLmhlaWdodCA9PT0gYm91bmRzLmhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuX21hcC5zZXQoaWQsIGJvdW5kcyk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcmV2aW91c0NvbGxlY3Rpb246IEFycmF5PHsgaWQ6IElkOyB9PiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemUgfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG4gICAgZ2V0IGNydWREZXRlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX2NydWREZXRlY3RlZDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2hhbmdlSWZOZWVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5nZXNEZXRlY3RlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl92ZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJldmlvdXNUb3RhbFNpemUgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2Nyb2xsRGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBnZXQgc2Nyb2xsRGVsdGEoKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEZWx0YTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBsaWZlQ2lyY2xlKCkge1xyXG4gICAgICAgIHRoaXMuZmlyZUNoYW5nZUlmTmVlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxpZmVDaXJjbGVEbygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGNvbGxlY3Rpb24gZm9yIGRlbGV0ZWQgaXRlbXMgYW5kIGZsdXNoZXMgdGhlIGRlbGV0ZWQgaXRlbSBjYWNoZS5cclxuICAgICAqL1xyXG4gICAgcmVzZXRDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZDsgfSwgQyBleHRlbmRzIEFycmF5PEk+PihjdXJyZW50Q29sbGVjdGlvbjogQyB8IG51bGwgfCB1bmRlZmluZWQsIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29sbGVjdGlvbiAhPT0gbnVsbCAmJiBjdXJyZW50Q29sbGVjdGlvbiA9PT0gdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQXR0ZW50aW9uISBUaGUgY29sbGVjdGlvbiBtdXN0IGJlIGltbXV0YWJsZS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZSh0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24sIGN1cnJlbnRDb2xsZWN0aW9uLCBpdGVtU2l6ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiA9IGN1cnJlbnRDb2xsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBjYWNoZSBvZiBpdGVtcyBmcm9tIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVDYWNoZTxJIGV4dGVuZHMgeyBpZDogSWQ7IH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ocHJldmlvdXNDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVudENvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBsZXQgY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghY3VycmVudENvbGxlY3Rpb24gfHwgY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXByZXZpb3VzQ29sbGVjdGlvbiB8fCBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3VycmVudENvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkRpY3Q6IHsgW2lkOiBJZF06IEkgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25EaWN0W2l0ZW0uaWRdID0gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBub3RDaGFuZ2VkTWFwOiB7IFtpZDogSWRdOiBJIH0gPSB7fSwgZGVsZXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge30sIGRlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fSwgdXBkYXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uRGljdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sbGVjdGlvbkRpY3RbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENoYW5nZWRNYXBbaXRlbS5pZF0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IC4uLih0aGlzLl9tYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSB9KSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoaWQsIHsgLi4uKHRoaXMuX21hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplIH0pLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBkZWxldGVkSXRlbXNNYXBbaV0gPSB0aGlzLl9tYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtLmlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiAhZGVsZXRlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIXVwZGF0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmICFub3RDaGFuZ2VkTWFwLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGNydWREZXRlY3RlZDtcclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSBkZWxldGVkSXRlbXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgcG9zaXRpb24gb2YgYSBjb2xsZWN0aW9uIGVsZW1lbnQgYnkgdGhlIGdpdmVuIElkXHJcbiAgICAgKi9cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihpZDogSWQsIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEksIEM+KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGZyb21JdGVtSWQ6IGlkLCBzdGlja3lNYXAsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICBjb25zdCB7IHNjcm9sbFNpemUgfSA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZTogdGhpcy5fY3J1ZERldGVjdGVkIHx8IG9wdC5keW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemU6IHRoaXMuX3ByZXZpb3VzVG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcnVkRGV0ZWN0ZWQ6IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwOiB0aGlzLl9kZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNjcm9sbFNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xsZWN0aW9uIG9mIGRpc3BsYXkgb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBvcHRpb25zOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSwgQz4pOiBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHsgc3RpY2t5TWFwLCAuLi5vcHRpb25zIH0sIGNydWREZXRlY3RlZCA9IHRoaXMuX2NydWREZXRlY3RlZCwgZGVsZXRlZEl0ZW1zTWFwID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgICAgIGlmIChvcHQuZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGl0ZW1zLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbHRhICs9IG1ldHJpY3MuZGVsdGE7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVG90YWxTaXplID0gbWV0cmljcy50b3RhbFNpemU7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbGV0ZWRJdGVtc01hcCA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLl9jcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdC5keW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5SXRlbXMgPSB0aGlzLmdlbmVyYXRlRGlzcGxheUNvbGxlY3Rpb24oaXRlbXMsIHN0aWNreU1hcCwgeyAuLi5tZXRyaWNzLCB9KTtcclxuICAgICAgICByZXR1cm4geyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZTogbWV0cmljcy50b3RhbFNpemUsIGRlbHRhOiBtZXRyaWNzLmRlbHRhLCBjcnVkRGV0ZWN0ZWQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gYnkgc2Nyb2xsU2l6ZVxyXG4gICAgICovXHJcbiAgICBnZXROZWFyZXN0SXRlbTxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihzY3JvbGxTaXplOiBudW1iZXIsIGl0ZW1zOiBDLCBpdGVtU2l6ZTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuKTogSSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudEZyb21TdGFydChzY3JvbGxTaXplLCBpdGVtcywgdGhpcy5fbWFwLCBpdGVtU2l6ZSwgaXNWZXJ0aWNhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBzY3JvbGxTaXplXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0RWxlbWVudEZyb21TdGFydDxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihzY3JvbGxTaXplOiBudW1iZXIsIGNvbGxlY3Rpb246IEMsIG1hcDogQ01hcDxJZCwgSVNpemU+LCB0eXBpY2FsSXRlbVNpemU6IG51bWJlcixcclxuICAgICAgICBpc1ZlcnRpY2FsOiBib29sZWFuKTogSSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUU7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplID0gMDtcclxuICAgICAgICAgICAgaWYgKG1hcC5oYXMoaXRlbS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoaXRlbS5pZCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2l6ZSA9IGJvdW5kcyA/IGJvdW5kc1tzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNjcm9sbFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGVudHJ5IGludG8gdGhlIG92ZXJzY3JvbGwgYXJlYSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG92ZXJzY3JvbGwgZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50TnVtVG9FbmQ8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaTogbnVtYmVyLCBjb2xsZWN0aW9uOiBDLCBtYXA6IENNYXA8SWQsIElTaXplPiwgdHlwaWNhbEl0ZW1TaXplOiBudW1iZXIsXHJcbiAgICAgICAgc2l6ZTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuLCBpbmRleE9mZnNldDogbnVtYmVyID0gMCk6IHsgbnVtOiBudW1iZXIsIG9mZnNldDogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGogPSBjb2xsZWN0aW9uLmxlbmd0aCAtIGluZGV4T2Zmc2V0IC0gMTsgaiA+PSBpOyBqLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25bal07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBib3VuZHMgPyBib3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgbnVtKys7XHJcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBudW06IDAsIG9mZnNldCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG51bSwgb2Zmc2V0IH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGxpc3QgbWV0cmljc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVjYWxjdWxhdGVNZXRyaWNzPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KG9wdGlvbnM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+KTogSU1ldHJpY3Mge1xyXG4gICAgICAgIGNvbnN0IHsgZnJvbUl0ZW1JZCwgYm91bmRzLCBjb2xsZWN0aW9uLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zT2Zmc2V0LCBzY3JvbGxTaXplLCBzbmFwLCBzdGlja3lNYXAsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sXHJcbiAgICAgICAgICAgIHByZXZpb3VzVG90YWxTaXplLCBjcnVkRGV0ZWN0ZWQsIGRlbGV0ZWRJdGVtc01hcCB9ID0gb3B0aW9ucyBhcyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiAmIHtcclxuICAgICAgICAgICAgICAgIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcywgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUUsIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsIHR5cGljYWxJdGVtU2l6ZSA9IGl0ZW1TaXplLFxyXG4gICAgICAgICAgICB3ID0gaXNWZXJ0aWNhbCA/IHdpZHRoIDogdHlwaWNhbEl0ZW1TaXplLCBoID0gaXNWZXJ0aWNhbCA/IHR5cGljYWxJdGVtU2l6ZSA6IGhlaWdodCxcclxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwLCBzbmFwc2hvdCA9IHRoaXMuX3NuYXBzaG90LFxyXG4gICAgICAgICAgICBjaGVja092ZXJzY3JvbGxJdGVtc0xpbWl0ID0gTWF0aC5jZWlsKHNpemUgLyB0eXBpY2FsSXRlbVNpemUpLFxyXG4gICAgICAgICAgICBzbmlwcGVkUG9zID0gTWF0aC5mbG9vcihzY3JvbGxTaXplKSxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0czogQXJyYXk8bnVtYmVyPiA9IFtdLFxyXG4gICAgICAgICAgICBpc0Zyb21JZCA9IGZyb21JdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGZyb21JdGVtSWQgPT09ICdudW1iZXInICYmIGZyb21JdGVtSWQgPiAtMSlcclxuICAgICAgICAgICAgICAgIHx8ICh0eXBlb2YgZnJvbUl0ZW1JZCA9PT0gJ3N0cmluZycgJiYgZnJvbUl0ZW1JZCA+ICctMScpO1xyXG5cclxuICAgICAgICBsZXQgbGVmdEl0ZW1zT2Zmc2V0ID0gMCwgcmlnaHRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24pIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcmVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zT2Zmc2V0ID0gaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIC0xOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gcmlnaHRJdGVtc09mZnNldCA9IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gcmlnaHRJdGVtc09mZnNldCA9IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlciA9IC0xLCBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSAwLCBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IC0xLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IDAsIHJpZ2h0SXRlbUxlbmd0aCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IDAsIHJpZ2h0SXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1CeUlkOiBJIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBpdGVtQnlJZFBvczogbnVtYmVyID0gMCxcclxuICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleDogbnVtYmVyID0gLTEsXHJcbiAgICAgICAgICAgIGlzVGFyZ2V0SW5PdmVyc2Nyb2xsOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBpdGVtQnlJZFBvcyxcclxuICAgICAgICAgICAgdG90YWxTaXplID0gMCxcclxuICAgICAgICAgICAgc3RhcnRJbmRleDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgZHluYW1pYyBvciB0aGVyZSBhcmUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGVuIGl0IHN3aXRjaGVzIHRvIHRoZSBsb25nIGFsZ29yaXRobS5cclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgbGV0IHkgPSAwLCBzdGlja3lDb2xsZWN0aW9uSXRlbTogSSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgc3RpY2t5Q29tcG9uZW50U2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDEsIGNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbltpXSwgaWQgPSBjb2xsZWN0aW9uSXRlbS5pZDtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50U2l6ZSA9IDAsIGNvbXBvbmVudFNpemVEZWx0YSA9IDAsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiB0eXBpY2FsSXRlbVNpemUsIGhlaWdodDogdHlwaWNhbEl0ZW1TaXplIH07XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZSA9IGJvdW5kc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EaXNwbGF5TWV0aG9kID0gYm91bmRzPy5tZXRob2QgPz8gSXRlbURpc3BsYXlNZXRob2RzLlVQREFURTtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1EaXNwbGF5TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3RCb3VuZHMgPSBzbmFwc2hvdC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50U25hcHNob3RTaXplID0gY29tcG9uZW50U2l6ZSAtIChzbmFwc2hvdEJvdW5kcyA/IHNuYXBzaG90Qm91bmRzW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZURlbHRhID0gY29tcG9uZW50U25hcHNob3RTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldChpZCwgeyAuLi5ib3VuZHMsIG1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplRGVsdGEgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmJvdW5kcywgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZEl0ZW1zTWFwLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwW2ldLCBzaXplID0gYm91bmRzW3NpemVQcm9wZXJ0eV0gPz8gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDwgc2Nyb2xsU2l6ZSAtIHNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gY29tcG9uZW50U2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT09IGZyb21JdGVtSWQgJiYgc3RpY2t5TWFwICYmIHN0aWNreU1hcFtpZF0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lDb21wb25lbnRTaXplID0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbkl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5Q29sbGVjdGlvbkl0ZW0gJiYgc3RpY2t5TWFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBudW0gfSA9IHRoaXMuZ2V0RWxlbWVudE51bVRvRW5kKGksIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gc2l6ZSAtIGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0aWNreU1hcCAmJiAhc3RpY2t5TWFwW2NvbGxlY3Rpb25JdGVtLmlkXSAmJiB5ID49IHNjcm9sbFNpemUgJiYgeSA8IHNjcm9sbFNpemUgKyBzdGlja3lDb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwcGVkWSA9IHNjcm9sbFNpemUgLSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IChzbmFwcGVkWSAtIHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHNuYXBwZWRZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IHN0aWNreUNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZCA9IGNvbGxlY3Rpb25JdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWRQb3MgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPCBzY3JvbGxTaXplIC0gY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodHMucHVzaChjb21wb25lbnRTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRnJvbUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CeUlkID09PSB1bmRlZmluZWQgfHwgeSA8IGl0ZW1CeUlkUG9zICsgc2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSBpaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5IDw9IHNjcm9sbFNpemUgKyBzaXplICsgY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgcmlnaHRJdGVtc09mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzY3JvbGxTaXplIC0gY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1EaXNwbGF5TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkRFTEVURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHkgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzVGFyZ2V0SW5PdmVyc2Nyb2xsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IG51bSB9ID0gdGhpcy5nZXRFbGVtZW50TnVtVG9FbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5sZW5ndGggLSAoY2hlY2tPdmVyc2Nyb2xsSXRlbXNMaW1pdCA8IDAgPyAwIDogY29sbGVjdGlvbi5sZW5ndGggLSBjaGVja092ZXJzY3JvbGxJdGVtc0xpbWl0KSxcclxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLCBtYXAsIHR5cGljYWxJdGVtU2l6ZSwgc2l6ZSwgaXNWZXJ0aWNhbCwgY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbGVjdGlvbi5sZW5ndGggLSAodGFyZ2V0RGlzcGxheUl0ZW1JbmRleCArIDEpKSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVtID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgLT0gbnVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA8PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDw9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IGlzRnJvbUlkID8gaXRlbUJ5SWRQb3MgOiBzY3JvbGxTaXplO1xyXG5cclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5zcGxpY2UoMCwgbGVmdEl0ZW1zV2VpZ2h0cy5sZW5ndGggLSBsZWZ0SXRlbXNPZmZzZXQpO1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgKz0gdjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsIGxlZnRJdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgcmlnaHRJdGVtc09mZnNldCA+IHRvdGFsTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHRvdGFsTGVuZ3RoIC0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgOiByaWdodEl0ZW1zT2Zmc2V0O1xyXG5cclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAvLyBCdWZmZXIgb3B0aW1pemF0aW9uIGRvZXMgbm90IHdvcmsgb24gZmFzdCBsaW5lYXIgYWxnb3JpdGhtXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY3J1ZERldGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgeSA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW0gPSBjb2xsZWN0aW9uW2ldLCBpZCA9IGNvbGxlY3Rpb25JdGVtLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRTaXplID0gdHlwaWNhbEl0ZW1TaXplLCBpdGVtRGlzcGxheU1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzID0gSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGlkKSE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1EaXNwbGF5TWV0aG9kID0gYm91bmRzPy5tZXRob2QgPz8gSXRlbURpc3BsYXlNZXRob2RzLlVQREFURTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1EaXNwbGF5TWV0aG9kID09PSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmJvdW5kcywgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kZWxldGVkSXRlbXNNYXAuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwW2ldLCBzaXplID0gYm91bmRzW3NpemVQcm9wZXJ0eV0gPz8gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IHNjcm9sbFNpemUgLSBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICs9IHNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDwgc2Nyb2xsU2l6ZSAtIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtRGlzcGxheU1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuREVMRVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHkgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gTWF0aC5mbG9vcihzY3JvbGxTaXplIC8gdHlwaWNhbEl0ZW1TaXplKTtcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSBNYXRoLmNlaWwoKHNjcm9sbFNpemUgKyBzaXplKSAvIHR5cGljYWxJdGVtU2l6ZSk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgaXRlbXNPZmZzZXQpO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIGl0ZW1zT2Zmc2V0ID4gdG90YWxMZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgPSBsZWZ0SXRlbUxlbmd0aCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCA9IHJpZ2h0SXRlbUxlbmd0aCAqIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgKiB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHRvdGFsTGVuZ3RoICogdHlwaWNhbEl0ZW1TaXplO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgayA9IHRvdGFsU2l6ZSAhPT0gMCA/IHByZXZpb3VzVG90YWxTaXplIC8gdG90YWxTaXplIDogMDtcclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemUgKiBrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtIGxlZnRJdGVtTGVuZ3RoLCB0b3RhbExlbmd0aCA+IDAgPyB0b3RhbExlbmd0aCAtIDEgOiAwKTtcclxuXHJcbiAgICAgICAgY29uc3QgaXRlbXNPbkRpc3BsYXkgPSB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0IC0gbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIC0gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGxlZnRIaWRkZW5JdGVtc1dlaWdodCAtIGxlZnRJdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXMgPSBpdGVtc09uRGlzcGxheUxlbmd0aCArIGxlZnRJdGVtTGVuZ3RoICsgcmlnaHRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICBkZWx0YSA9IGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKyBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyAtIGxlZnRTaXplT2ZEZWxldGVkSXRlbXM7XHJcblxyXG4gICAgICAgIGNvbnN0IG1ldHJpY3M6IElNZXRyaWNzID0ge1xyXG4gICAgICAgICAgICBkZWx0YSxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1XaWR0aDogdyxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQ6IGgsXHJcbiAgICAgICAgICAgIHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5LFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyxcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyxcclxuICAgICAgICAgICAgc2l6ZVByb3BlcnR5LFxyXG4gICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICBzbmlwcGVkUG9zLFxyXG4gICAgICAgICAgICBzdGFydEluZGV4LFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0LFxyXG4gICAgICAgICAgICB0b3RhbExlbmd0aCxcclxuICAgICAgICAgICAgdG90YWxTaXplLFxyXG4gICAgICAgICAgICB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJEZWx0YURpcmVjdGlvbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFyU2Nyb2xsRGlyZWN0aW9uQ2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRlbHRhKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhclNjcm9sbERpcmVjdGlvbkNhY2hlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5idW1wVmVyc2lvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBtZXRyaWNzOiBJTWV0cmljcyk6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtczogcmVuZGVySXRlbXNMZW5ndGgsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIHNpemVQcm9wZXJ0eSxcclxuICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgc25pcHBlZFBvcyxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgdG90YWxMZW5ndGgsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICB9ID0gbWV0cmljcyxcclxuICAgICAgICAgICAgZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uID0gW107XHJcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxTbmlwcGVkUG9zaXRpb24gPSBzbmlwcGVkUG9zO1xyXG4gICAgICAgICAgICBsZXQgcG9zID0gc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zID0gcmVuZGVySXRlbXNMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBzdGlja3lJdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBuZXh0U3RpY2t5OiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBzdGlja3lJdGVtSW5kZXggPSAtMSxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzbmFwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA+IDAgPyBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIDogMCwgdG90YWxMZW5ndGggLSAxKTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1zW2ldLmlkLCBzdGlja3kgPSBzdGlja3lNYXBbaWRdLCBzaXplID0gZHluYW1pY1NpemUgPyB0aGlzLmdldChpZCk/LltzaXplUHJvcGVydHldIHx8IHR5cGljYWxJdGVtU2l6ZSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGlzVmVydGljYWwgPyAwIDogYWN0dWFsU25pcHBlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaXNWZXJ0aWNhbCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbSA9IHsgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgY29uZmlnIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gc2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKHN0aWNreUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpID0gc3RhcnRJbmRleDtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChyZW5kZXJJdGVtcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpID49IHRvdGFsTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtc1tpXS5pZCwgc2l6ZSA9IGR5bmFtaWNTaXplID8gdGhpcy5nZXQoaWQpPy5bc2l6ZVByb3BlcnR5XSB8fCB0eXBpY2FsSXRlbVNpemUgOiB0eXBpY2FsSXRlbVNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlkICE9PSBzdGlja3lJdGVtPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNuYXBwZWQgPSBzbmFwICYmIHN0aWNreU1hcFtpZF0gPiAwICYmIHBvcyA8PSBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGlzVmVydGljYWwgPyAwIDogcG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaXNWZXJ0aWNhbCA/IHBvcyA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3k6IHN0aWNreU1hcFtpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkT3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtID0geyBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBjb25maWcgfTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRTdGlja3kgJiYgc3RpY2t5SXRlbUluZGV4IDwgaSAmJiBzdGlja3lNYXBbaWRdID4gMCAmJiBwb3MgPD0gc2Nyb2xsU2l6ZSArIHNpemUgKyBzdGlja3lJdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnggPSBpc1ZlcnRpY2FsID8gMCA6IHNuYXBwZWQgPyBhY3R1YWxTbmlwcGVkUG9zaXRpb24gOiBwb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVuZGVySXRlbXMgLT0gMTtcclxuICAgICAgICAgICAgICAgIHBvcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBheGlzID0gaXNWZXJ0aWNhbCA/IFlfUFJPUF9OQU1FIDogWF9QUk9QX05BTUU7XHJcblxyXG4gICAgICAgICAgICBpZiAobmV4dFN0aWNreSAmJiBzdGlja3lJdGVtICYmIG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gPD0gc2Nyb2xsU2l6ZSArIHN0aWNreUl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSA+IHNjcm9sbFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSAtIHN0aWNreUl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWQgPSBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc25hcHBlZE91dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc3RpY2t5ID0gMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRyYWNraW5nIGJ5IHByb3BOYW1lXHJcbiAgICAgKi9cclxuICAgIHRyYWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5faXRlbXMgfHwgIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudHJhY2sodGhpcy5faXRlbXMsIHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLCB0aGlzLnNjcm9sbERpcmVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCh2OiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLmRpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50PzogTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLnVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJdGVtQm91bmRzKGlkOiBJZCk6IElTaXplIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXSwgaXRlbUlkID0gY29tcG9uZW50Lmluc3RhbmNlLml0ZW1JZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBjb21wb25lbnQuaW5zdGFuY2UuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1JZCwgYm91bmRzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90cmFja2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
627
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tCb3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFRLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3ZGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBQztBQThEcEQsSUFBSyxrQkFLSjtBQUxELFdBQUssa0JBQWtCO0lBQ25CLCtEQUFNLENBQUE7SUFDTiwrREFBTSxDQUFBO0lBQ04sK0RBQU0sQ0FBQTtJQUNOLHlFQUFXLENBQUE7QUFDZixDQUFDLEVBTEksa0JBQWtCLEtBQWxCLGtCQUFrQixRQUt0QjtBQVNEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxRQUF3RjtJQUN4RyxRQUFRLENBQStEO0lBRXZFLE1BQU0sQ0FBa0Q7SUFFbEUsSUFBSSxLQUFLLENBQUMsQ0FBa0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVTLGtCQUFrQixDQUFxRTtJQUVqRyxJQUFJLGlCQUFpQixDQUFDLENBQXFFO1FBQ3ZGLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLG9CQUFv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QUMzQixPQUFPO1FBQ1gsQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixTQUFTO1lBQ2IsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFUSxPQUFPO1FBQ1osS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctdmlydHVhbC1saXN0LWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1pdGVtLm1vZGVsXCI7XHJcbmltcG9ydCB7IElkIH0gZnJvbSBcIi4uL3R5cGVzL2lkXCI7XHJcbmltcG9ydCB7IENhY2hlTWFwLCBDTWFwIH0gZnJvbSBcIi4vY2FjaGVNYXBcIjtcclxuaW1wb3J0IHsgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuaW1wb3J0IHsgSVNpemUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuaW1wb3J0IHsgSEVJR0hUX1BST1BfTkFNRSwgV0lEVEhfUFJPUF9OQU1FLCBYX1BST1BfTkFNRSwgWV9QUk9QX05BTUUgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgSVZpcnR1YWxMaXN0U3RpY2t5TWFwIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSA9ICdjaGFuZ2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljcyB7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQ6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgaXRlbVNpemU6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kOiBudW1iZXI7XHJcbiAgICBpdGVtc09uRGlzcGxheTogbnVtYmVyO1xyXG4gICAgaXRlbXNPbkRpc3BsYXlMZW5ndGg6IG51bWJlcjtcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIGxlZnRJdGVtTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZWZ0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHJlbmRlckl0ZW1zOiBudW1iZXI7XHJcbiAgICByaWdodEl0ZW1MZW5ndGg6IG51bWJlcjtcclxuICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHNjcm9sbFNpemU6IG51bWJlcjtcclxuICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zOiBudW1iZXI7XHJcbiAgICBzaXplUHJvcGVydHk6IHR5cGVvZiBIRUlHSFRfUFJPUF9OQU1FIHwgdHlwZW9mIFdJRFRIX1BST1BfTkFNRTtcclxuICAgIHNuYXA6IGJvb2xlYW47XHJcbiAgICBzbmlwcGVkUG9zOiBudW1iZXI7XHJcbiAgICBzdGFydEluZGV4OiBudW1iZXI7XHJcbiAgICBzdGFydFBvc2l0aW9uOiBudW1iZXI7XHJcbiAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0OiBudW1iZXI7XHJcbiAgICB0b3RhbExlbmd0aDogbnVtYmVyO1xyXG4gICAgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICB0eXBpY2FsSXRlbVNpemU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PiB7XHJcbiAgICBib3VuZHM6IElTaXplO1xyXG4gICAgY29sbGVjdGlvbjogQztcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXRlbXNPZmZzZXQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb246IGJvb2xlYW47XHJcbiAgICBmcm9tSXRlbUlkPzogSWQ7XHJcbiAgICBwcmV2aW91c1RvdGFsU2l6ZTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG4gICAgZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemU7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ2NvbGxlY3Rpb24nIHwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxudHlwZSBDYWNoZU1hcEV2ZW50cyA9IHR5cGVvZiBUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUU7XHJcblxyXG50eXBlIE9uQ2hhbmdlRXZlbnRMaXN0ZW5lciA9ICh2ZXJzaW9uOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG50eXBlIENhY2hlTWFwTGlzdGVuZXJzID0gT25DaGFuZ2VFdmVudExpc3RlbmVyO1xyXG5cclxuZW51bSBJdGVtRGlzcGxheU1ldGhvZHMge1xyXG4gICAgQ1JFQVRFLFxyXG4gICAgVVBEQVRFLFxyXG4gICAgREVMRVRFLFxyXG4gICAgTk9UX0NIQU5HRUQsXHJcbn1cclxuXHJcbmludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uO1xyXG4gICAgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgdHJhY2tpbmcsIGNhbGN1bGF0aW9ucyBhbmQgY2FjaGluZy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTcueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhY2tCb3ggZXh0ZW5kcyBDYWNoZU1hcDxJZCwgSVNpemUgJiB7IG1ldGhvZD86IEl0ZW1EaXNwbGF5TWV0aG9kcyB9LCBDYWNoZU1hcEV2ZW50cywgQ2FjaGVNYXBMaXN0ZW5lcnM+IHtcclxuICAgIHByb3RlY3RlZCBfdHJhY2tlciE6IFRyYWNrZXI8SVJlbmRlclZpcnR1YWxMaXN0SXRlbSwgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBpdGVtcyh2OiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pdGVtcyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50Pj4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBkaXNwbGF5Q29tcG9uZW50cyh2OiBBcnJheTxDb21wb25lbnRSZWY8TmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0cmFja0J5IHByb3BlcnR5XHJcbiAgICAgKi9cclxuICAgIHNldCB0cmFja2luZ1Byb3BlcnR5TmFtZSh2OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLnRyYWNraW5nUHJvcGVydHlOYW1lID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tlciA9IG5ldyBUcmFja2VyKHRyYWNraW5nUHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQoaWQ6IElkLCBib3VuZHM6IElTaXplKTogQ01hcDxJZCwgSVNpemU+IHtcclxuICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuX21hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICBpZiAoYj8ud2lkdGggPT09IGJvdW5kcy53aWR0aCAmJiBiLmhlaWdodCA9PT0gYm91bmRzLmhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuX21hcC5zZXQoaWQsIGJvdW5kcyk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9wcmV2aW91c0NvbGxlY3Rpb246IEFycmF5PHsgaWQ6IElkOyB9PiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemUgfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG4gICAgZ2V0IGNydWREZXRlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX2NydWREZXRlY3RlZDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2hhbmdlSWZOZWVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYW5nZXNEZXRlY3RlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl92ZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJldmlvdXNUb3RhbFNpemUgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2Nyb2xsRGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBnZXQgc2Nyb2xsRGVsdGEoKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEZWx0YTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBsaWZlQ2lyY2xlKCkge1xyXG4gICAgICAgIHRoaXMuZmlyZUNoYW5nZUlmTmVlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxpZmVDaXJjbGVEbygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGNvbGxlY3Rpb24gZm9yIGRlbGV0ZWQgaXRlbXMgYW5kIGZsdXNoZXMgdGhlIGRlbGV0ZWQgaXRlbSBjYWNoZS5cclxuICAgICAqL1xyXG4gICAgcmVzZXRDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZDsgfSwgQyBleHRlbmRzIEFycmF5PEk+PihjdXJyZW50Q29sbGVjdGlvbjogQyB8IG51bGwgfCB1bmRlZmluZWQsIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29sbGVjdGlvbiAhPT0gbnVsbCAmJiBjdXJyZW50Q29sbGVjdGlvbiA9PT0gdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQXR0ZW50aW9uISBUaGUgY29sbGVjdGlvbiBtdXN0IGJlIGltbXV0YWJsZS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZSh0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24sIGN1cnJlbnRDb2xsZWN0aW9uLCBpdGVtU2l6ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiA9IGN1cnJlbnRDb2xsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBjYWNoZSBvZiBpdGVtcyBmcm9tIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVDYWNoZTxJIGV4dGVuZHMgeyBpZDogSWQ7IH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ocHJldmlvdXNDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVudENvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBsZXQgY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghY3VycmVudENvbGxlY3Rpb24gfHwgY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXByZXZpb3VzQ29sbGVjdGlvbiB8fCBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3VycmVudENvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkRpY3Q6IHsgW2lkOiBJZF06IEkgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25EaWN0W2l0ZW0uaWRdID0gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBub3RDaGFuZ2VkTWFwOiB7IFtpZDogSWRdOiBJIH0gPSB7fSwgZGVsZXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge30sIGRlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fSwgdXBkYXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uRGljdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sbGVjdGlvbkRpY3RbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENoYW5nZWRNYXBbaXRlbS5pZF0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IC4uLih0aGlzLl9tYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSB9KSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoaWQsIHsgLi4uKHRoaXMuX21hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplIH0pLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBkZWxldGVkSXRlbXNNYXBbaV0gPSB0aGlzLl9tYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtLmlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiAhZGVsZXRlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIXVwZGF0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmICFub3RDaGFuZ2VkTWFwLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGNydWREZXRlY3RlZDtcclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSBkZWxldGVkSXRlbXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgcG9zaXRpb24gb2YgYSBjb2xsZWN0aW9uIGVsZW1lbnQgYnkgdGhlIGdpdmVuIElkXHJcbiAgICAgKi9cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihpZDogSWQsIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEksIEM+KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGZyb21JdGVtSWQ6IGlkLCBzdGlja3lNYXAsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICBjb25zdCB7IHNjcm9sbFNpemUgfSA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZTogdGhpcy5fY3J1ZERldGVjdGVkIHx8IG9wdC5keW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemU6IHRoaXMuX3ByZXZpb3VzVG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcnVkRGV0ZWN0ZWQ6IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwOiB0aGlzLl9kZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNjcm9sbFNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xsZWN0aW9uIG9mIGRpc3BsYXkgb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBvcHRpb25zOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSwgQz4pOiBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHsgc3RpY2t5TWFwLCAuLi5vcHRpb25zIH0sIGNydWREZXRlY3RlZCA9IHRoaXMuX2NydWREZXRlY3RlZCwgZGVsZXRlZEl0ZW1zTWFwID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgICAgIGlmIChvcHQuZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGl0ZW1zLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbHRhICs9IG1ldHJpY3MuZGVsdGE7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVG90YWxTaXplID0gbWV0cmljcy50b3RhbFNpemU7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbGV0ZWRJdGVtc01hcCA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLl9jcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdC5keW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5SXRlbXMgPSB0aGlzLmdlbmVyYXRlRGlzcGxheUNvbGxlY3Rpb24oaXRlbXMsIHN0aWNreU1hcCwgeyAuLi5tZXRyaWNzLCB9KTtcclxuICAgICAgICByZXR1cm4geyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZTogbWV0cmljcy50b3RhbFNpemUsIGRlbHRhOiBtZXRyaWNzLmRlbHRhLCBjcnVkRGV0ZWN0ZWQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gYnkgc2Nyb2xsU2l6ZVxyXG4gICAgICovXHJcbiAgICBnZXROZWFyZXN0SXRlbTxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihzY3JvbGxTaXplOiBudW1iZXIsIGl0ZW1zOiBDLCBpdGVtU2l6ZTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuKTogSSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudEZyb21TdGFydChzY3JvbGxTaXplLCBpdGVtcywgdGhpcy5fbWFwLCBpdGVtU2l6ZSwgaXNWZXJ0aWNhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBzY3JvbGxTaXplXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0RWxlbWVudEZyb21TdGFydDxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihzY3JvbGxTaXplOiBudW1iZXIsIGNvbGxlY3Rpb246IEMsIG1hcDogQ01hcDxJZCwgSVNpemU+LCB0eXBpY2FsSXRlbVNpemU6IG51bWJlcixcclxuICAgICAgICBpc1ZlcnRpY2FsOiBib29sZWFuKTogSSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUU7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplID0gMDtcclxuICAgICAgICAgICAgaWYgKG1hcC5oYXMoaXRlbS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoaXRlbS5pZCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2l6ZSA9IGJvdW5kcyA/IGJvdW5kc1tzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNjcm9sbFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGVudHJ5IGludG8gdGhlIG92ZXJzY3JvbGwgYXJlYSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG92ZXJzY3JvbGwgZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50TnVtVG9FbmQ8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaTogbnVtYmVyLCBjb2xsZWN0aW9uOiBDLCBtYXA6IENNYXA8SWQsIElTaXplPiwgdHlwaWNhbEl0ZW1TaXplOiBudW1iZXIsXHJcbiAgICAgICAgc2l6ZTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuLCBpbmRleE9mZnNldDogbnVtYmVyID0gMCk6IHsgbnVtOiBudW1iZXIsIG9mZnNldDogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGogPSBjb2xsZWN0aW9uLmxlbmd0aCAtIGluZGV4T2Zmc2V0IC0gMTsgaiA+PSBpOyBqLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25bal07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBib3VuZHMgPyBib3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgbnVtKys7XHJcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBudW06IDAsIG9mZnNldCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG51bSwgb2Zmc2V0IH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGxpc3QgbWV0cmljc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVjYWxjdWxhdGVNZXRyaWNzPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KG9wdGlvbnM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+KTogSU1ldHJpY3Mge1xyXG4gICAgICAgIGNvbnN0IHsgZnJvbUl0ZW1JZCwgYm91bmRzLCBjb2xsZWN0aW9uLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zT2Zmc2V0LCBzY3JvbGxTaXplLCBzbmFwLCBzdGlja3lNYXAsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sXHJcbiAgICAgICAgICAgIHByZXZpb3VzVG90YWxTaXplLCBjcnVkRGV0ZWN0ZWQsIGRlbGV0ZWRJdGVtc01hcCB9ID0gb3B0aW9ucyBhcyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiAmIHtcclxuICAgICAgICAgICAgICAgIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcywgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUUsIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsIHR5cGljYWxJdGVtU2l6ZSA9IGl0ZW1TaXplLFxyXG4gICAgICAgICAgICB3ID0gaXNWZXJ0aWNhbCA/IHdpZHRoIDogdHlwaWNhbEl0ZW1TaXplLCBoID0gaXNWZXJ0aWNhbCA/IHR5cGljYWxJdGVtU2l6ZSA6IGhlaWdodCxcclxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwLCBzbmFwc2hvdCA9IHRoaXMuX3NuYXBzaG90LFxyXG4gICAgICAgICAgICBjaGVja092ZXJzY3JvbGxJdGVtc0xpbWl0ID0gTWF0aC5jZWlsKHNpemUgLyB0eXBpY2FsSXRlbVNpemUpLFxyXG4gICAgICAgICAgICBzbmlwcGVkUG9zID0gTWF0aC5mbG9vcihzY3JvbGxTaXplKSxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0czogQXJyYXk8bnVtYmVyPiA9IFtdLFxyXG4gICAgICAgICAgICBpc0Zyb21JZCA9IGZyb21JdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGZyb21JdGVtSWQgPT09ICdudW1iZXInICYmIGZyb21JdGVtSWQgPiAtMSlcclxuICAgICAgICAgICAgICAgIHx8ICh0eXBlb2YgZnJvbUl0ZW1JZCA9PT0gJ3N0cmluZycgJiYgZnJvbUl0ZW1JZCA+ICctMScpO1xyXG5cclxuICAgICAgICBsZXQgbGVmdEl0ZW1zT2Zmc2V0ID0gMCwgcmlnaHRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24pIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjcm9sbERpcmVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zT2Zmc2V0ID0gaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIC0xOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gcmlnaHRJdGVtc09mZnNldCA9IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gcmlnaHRJdGVtc09mZnNldCA9IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlciA9IC0xLCBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSAwLCBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IC0xLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IDAsIHJpZ2h0SXRlbUxlbmd0aCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IDAsIHJpZ2h0SXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1CeUlkOiBJIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBpdGVtQnlJZFBvczogbnVtYmVyID0gMCxcclxuICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleDogbnVtYmVyID0gLTEsXHJcbiAgICAgICAgICAgIGlzVGFyZ2V0SW5PdmVyc2Nyb2xsOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBpdGVtQnlJZFBvcyxcclxuICAgICAgICAgICAgdG90YWxTaXplID0gMCxcclxuICAgICAgICAgICAgc3RhcnRJbmRleDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgZHluYW1pYyBvciB0aGVyZSBhcmUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGVuIGl0IHN3aXRjaGVzIHRvIHRoZSBsb25nIGFsZ29yaXRobS5cclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgbGV0IHkgPSAwLCBzdGlja3lDb2xsZWN0aW9uSXRlbTogSSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgc3RpY2t5Q29tcG9uZW50U2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDEsIGNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbltpXSwgaWQgPSBjb2xsZWN0aW9uSXRlbS5pZDtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50U2l6ZSA9IDAsIGNvbXBvbmVudFNpemVEZWx0YSA9IDAsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiB0eXBpY2FsSXRlbVNpemUsIGhlaWdodDogdHlwaWNhbEl0ZW1TaXplIH07XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZSA9IGJvdW5kc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EaXNwbGF5TWV0aG9kID0gYm91bmRzPy5tZXRob2QgPz8gSXRlbURpc3BsYXlNZXRob2RzLlVQREFURTtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1EaXNwbGF5TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3RCb3VuZHMgPSBzbmFwc2hvdC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50U25hcHNob3RTaXplID0gY29tcG9uZW50U2l6ZSAtIChzbmFwc2hvdEJvdW5kcyA/IHNuYXBzaG90Qm91bmRzW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZURlbHRhID0gY29tcG9uZW50U25hcHNob3RTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldChpZCwgeyAuLi5ib3VuZHMsIG1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplRGVsdGEgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmJvdW5kcywgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZEl0ZW1zTWFwLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwW2ldLCBzaXplID0gYm91bmRzW3NpemVQcm9wZXJ0eV0gPz8gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDwgc2Nyb2xsU2l6ZSAtIHNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gY29tcG9uZW50U2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT09IGZyb21JdGVtSWQgJiYgc3RpY2t5TWFwICYmIHN0aWNreU1hcFtpZF0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lDb21wb25lbnRTaXplID0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbkl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5Q29sbGVjdGlvbkl0ZW0gJiYgc3RpY2t5TWFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBudW0gfSA9IHRoaXMuZ2V0RWxlbWVudE51bVRvRW5kKGksIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gc2l6ZSAtIGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0aWNreU1hcCAmJiAhc3RpY2t5TWFwW2NvbGxlY3Rpb25JdGVtLmlkXSAmJiB5ID49IHNjcm9sbFNpemUgJiYgeSA8IHNjcm9sbFNpemUgKyBzdGlja3lDb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwcGVkWSA9IHNjcm9sbFNpemUgLSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IChzbmFwcGVkWSAtIHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHNuYXBwZWRZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IHN0aWNreUNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZCA9IGNvbGxlY3Rpb25JdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWRQb3MgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPD0gc2Nyb2xsU2l6ZSAtIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnB1c2goY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnlJZCA9PT0gdW5kZWZpbmVkIHx8IHkgPCBpdGVtQnlJZFBvcyArIHNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8PSBzY3JvbGxTaXplICsgc2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDw9IHNjcm9sbFNpemUgLSBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuREVMRVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgeSArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRJbk92ZXJzY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbnVtIH0gPSB0aGlzLmdldEVsZW1lbnROdW1Ub0VuZChcclxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmxlbmd0aCAtIChjaGVja092ZXJzY3JvbGxJdGVtc0xpbWl0IDwgMCA/IDAgOiBjb2xsZWN0aW9uLmxlbmd0aCAtIGNoZWNrT3ZlcnNjcm9sbEl0ZW1zTGltaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsLCBjb2xsZWN0aW9uLmxlbmd0aCAtIChjb2xsZWN0aW9uLmxlbmd0aCAtICh0YXJnZXREaXNwbGF5SXRlbUluZGV4ICsgMSkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChudW0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtPSBudW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIDw9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPD0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXNGcm9tSWQgPyBpdGVtQnlJZFBvcyA6IHNjcm9sbFNpemU7XHJcblxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnNwbGljZSgwLCBsZWZ0SXRlbXNXZWlnaHRzLmxlbmd0aCAtIGxlZnRJdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodHMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCArPSB2O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgbGVmdEl0ZW1zT2Zmc2V0KTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0ID4gdG90YWxMZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgIC8vIEJ1ZmZlciBvcHRpbWl6YXRpb24gZG9lcyBub3Qgd29yayBvbiBmYXN0IGxpbmVhciBhbGdvcml0aG1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjcnVkRGV0ZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGNvbGxlY3Rpb25baV0sIGlkID0gY29sbGVjdGlvbkl0ZW0uaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudFNpemUgPSB0eXBpY2FsSXRlbVNpemUsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoaWQpITtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURpc3BsYXlNZXRob2QgPSBib3VuZHM/Lm1ldGhvZCA/PyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbURpc3BsYXlNZXRob2QgPT09IEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIHsgLi4uYm91bmRzLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWRJdGVtc01hcC5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLl9kZWxldGVkSXRlbXNNYXBbaV0sIHNpemUgPSBib3VuZHNbc2l6ZVByb3BlcnR5XSA/PyB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5IDwgc2Nyb2xsU2l6ZSAtIHNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKz0gc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzY3JvbGxTaXplIC0gY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1EaXNwbGF5TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5ERUxFVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgeSArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSBNYXRoLmZsb29yKHNjcm9sbFNpemUgLyB0eXBpY2FsSXRlbVNpemUpO1xyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IE1hdGguY2VpbCgoc2Nyb2xsU2l6ZSArIHNpemUpIC8gdHlwaWNhbEl0ZW1TaXplKTtcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLCBpdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgaXRlbXNPZmZzZXQgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IGxlZnRJdGVtTGVuZ3RoICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ID0gcmlnaHRJdGVtTGVuZ3RoICogdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAqIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gdG90YWxMZW5ndGggKiB0eXBpY2FsSXRlbVNpemU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBrID0gdG90YWxTaXplICE9PSAwID8gcHJldmlvdXNUb3RhbFNpemUgLyB0b3RhbFNpemUgOiAwO1xyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSAqIGs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApO1xyXG5cclxuICAgICAgICBjb25zdCBpdGVtc09uRGlzcGxheSA9IHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgLSBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgLSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC0gbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyA9IGl0ZW1zT25EaXNwbGF5TGVuZ3RoICsgbGVmdEl0ZW1MZW5ndGggKyByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIGRlbHRhID0gbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyArIGxlZnRTaXplT2ZBZGRlZEl0ZW1zIC0gbGVmdFNpemVPZkRlbGV0ZWRJdGVtcztcclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljczogSU1ldHJpY3MgPSB7XHJcbiAgICAgICAgICAgIGRlbHRhLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoOiB3LFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodDogaCxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXksXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zLFxyXG4gICAgICAgICAgICBzaXplUHJvcGVydHksXHJcbiAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgIHNuaXBwZWRQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gbWV0cmljcztcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRlbHRhRGlyZWN0aW9uKCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJTY3JvbGxEaXJlY3Rpb25DYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyRGVsdGEoY2xlYXJEaXJlY3Rpb25EZXRlY3RvciA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xyXG5cclxuICAgICAgICBpZiAoY2xlYXJEaXJlY3Rpb25EZXRlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2Nyb2xsRGlyZWN0aW9uQ2FjaGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJ1bXBWZXJzaW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRGlzcGxheUNvbGxlY3Rpb248SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaXRlbXM6IEMsIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgIG1ldHJpY3M6IElNZXRyaWNzKTogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zOiByZW5kZXJJdGVtc0xlbmd0aCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVByb3BlcnR5LFxyXG4gICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICBzbmlwcGVkUG9zLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0b3RhbExlbmd0aCxcclxuICAgICAgICAgICAgc3RhcnRJbmRleCxcclxuICAgICAgICAgICAgdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgIH0gPSBtZXRyaWNzLFxyXG4gICAgICAgICAgICBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gPSBbXTtcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA9IHNuaXBwZWRQb3M7XHJcbiAgICAgICAgICAgIGxldCBwb3MgPSBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySXRlbXMgPSByZW5kZXJJdGVtc0xlbmd0aCxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIG5leHRTdGlja3k6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIHN0aWNreUl0ZW1JbmRleCA9IC0xLFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID4gMCA/IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgOiAwLCB0b3RhbExlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbXNbaV0uaWQsIHN0aWNreSA9IHN0aWNreU1hcFtpZF0sIHNpemUgPSBkeW5hbWljU2l6ZSA/IHRoaXMuZ2V0KGlkKT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGlja3kgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaXNWZXJ0aWNhbCA/IDAgOiBhY3R1YWxTbmlwcGVkUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpc1ZlcnRpY2FsID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBub3JtYWxpemVkSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZE91dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtID0geyBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBjb25maWcgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goc3RpY2t5SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGkgPSBzdGFydEluZGV4O1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHJlbmRlckl0ZW1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gdG90YWxMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1zW2ldLmlkLCBzaXplID0gZHluYW1pY1NpemUgPyB0aGlzLmdldChpZCk/LltzaXplUHJvcGVydHldIHx8IHR5cGljYWxJdGVtU2l6ZSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT09IHN0aWNreUl0ZW0/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc25hcHBlZCA9IHNuYXAgJiYgc3RpY2t5TWFwW2lkXSA+IDAgJiYgcG9zIDw9IHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaXNWZXJ0aWNhbCA/IDAgOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpc1ZlcnRpY2FsID8gcG9zIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBub3JtYWxpemVkSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBub3JtYWxpemVkSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreTogc3RpY2t5TWFwW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gPSB7IGlkLCBtZWFzdXJlcywgZGF0YTogaXRlbURhdGEsIGNvbmZpZyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dFN0aWNreSAmJiBzdGlja3lJdGVtSW5kZXggPCBpICYmIHN0aWNreU1hcFtpZF0gPiAwICYmIHBvcyA8PSBzY3JvbGxTaXplICsgc2l6ZSArIHN0aWNreUl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueCA9IGlzVmVydGljYWwgPyAwIDogc25hcHBlZCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IHBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy55ID0gaXNWZXJ0aWNhbCA/IHNuYXBwZWQgPyBhY3R1YWxTbmlwcGVkUG9zaXRpb24gOiBwb3MgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHNuYXBwZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJJdGVtcyAtPSAxO1xyXG4gICAgICAgICAgICAgICAgcG9zICs9IHNpemU7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGF4aXMgPSBpc1ZlcnRpY2FsID8gWV9QUk9QX05BTUUgOiBYX1BST1BfTkFNRTtcclxuXHJcbiAgICAgICAgICAgIGlmIChuZXh0U3RpY2t5ICYmIHN0aWNreUl0ZW0gJiYgbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSA8PSBzY3JvbGxTaXplICsgc3RpY2t5SXRlbVNpemUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdID4gc2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIC0gc3RpY2t5SXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc25hcHBlZCA9IG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkT3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zdGlja3kgPSAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlzcGxheUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdHJhY2tpbmcgYnkgcHJvcE5hbWVcclxuICAgICAqL1xyXG4gICAgdHJhY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pdGVtcyB8fCAhdGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci50cmFjayh0aGlzLl9pdGVtcywgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMsIHRoaXMuc2Nyb2xsRGlyZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKHY6IHsgW2lkOiBudW1iZXJdOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgdW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQ/OiBOZ1ZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1Cb3VuZHMoaWQ6IElkKTogSVNpemUgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY2FjaGVFbGVtZW50cygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzW2ldLCBpdGVtSWQgPSBjb21wb25lbnQuaW5zdGFuY2UuaXRlbUlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGNvbXBvbmVudC5pbnN0YW5jZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXQoaXRlbUlkLCBib3VuZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJhY2tlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -906,7 +906,7 @@ class TrackBox extends CacheMap {
906
906
  }
907
907
  }
908
908
  }
909
- else if (y < scrollSize - componentSize) {
909
+ else if (y <= scrollSize - componentSize) {
910
910
  leftItemsWeights.push(componentSize);
911
911
  leftHiddenItemsWeight += componentSize;
912
912
  itemsFromStartToScrollEnd = ii;
@@ -922,7 +922,7 @@ class TrackBox extends CacheMap {
922
922
  itemsFromStartToDisplayEnd = ii;
923
923
  totalItemsToDisplayEndWeight += componentSize;
924
924
  itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
925
- if (y < scrollSize - componentSize) {
925
+ if (y <= scrollSize - componentSize) {
926
926
  switch (itemDisplayMethod) {
927
927
  case ItemDisplayMethods.CREATE: {
928
928
  leftSizeOfAddedItems += componentSizeDelta;
@@ -1 +1 @@
1
- {"version":3,"file":"ng-virtual-list.mjs","sources":["../../../projects/ng-virtual-list/src/lib/enums/directions.ts","../../../projects/ng-virtual-list/src/lib/const/index.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.html","../../../projects/ng-virtual-list/src/lib/utils/isDirection.ts","../../../projects/ng-virtual-list/src/lib/utils/debounce.ts","../../../projects/ng-virtual-list/src/lib/utils/toggleClassName.ts","../../../projects/ng-virtual-list/src/lib/utils/tracker.ts","../../../projects/ng-virtual-list/src/lib/utils/eventEmitter.ts","../../../projects/ng-virtual-list/src/lib/utils/cacheMap.ts","../../../projects/ng-virtual-list/src/lib/utils/trackBox.ts","../../../projects/ng-virtual-list/src/lib/utils/scrollEvent.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.html","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.module.ts","../../../projects/ng-virtual-list/src/public-api.ts","../../../projects/ng-virtual-list/src/ng-virtual-list.ts"],"sourcesContent":["/**\r\n * Axis of the arrangement of virtual list elements.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/enums/directions.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport enum Directions {\r\n /**\r\n * Horizontal axis.\r\n */\r\n HORIZONTAL = 'horizontal',\r\n /**\r\n * Vertical axis.\r\n */\r\n VERTICAL = 'vertical',\r\n}","import { Directions } from \"../enums/directions\";\r\n\r\nexport const DEFAULT_ITEM_SIZE = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DEFAULT_SNAP = false;\r\n\r\nexport const DEFAULT_ENABLED_BUFFER_OPTIMIZATION = false;\r\n\r\nexport const DEFAULT_DYNAMIC_SIZE = false;\r\n\r\nexport const TRACK_BY_PROPERTY_NAME = 'id';\r\n\r\nexport const DEFAULT_DIRECTION = Directions.VERTICAL;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n\r\nexport const MAX_SCROLL_TO_ITERATIONS = 5;\r\n\r\n// presets\r\n\r\nexport const BEHAVIOR_AUTO = 'auto';\r\n\r\nexport const BEHAVIOR_INSTANT = 'instant';\r\n\r\nexport const BEHAVIOR_SMOOTH = 'smooth';\r\n\r\nexport const VISIBILITY_VISIBLE = 'visible';\r\n\r\nexport const VISIBILITY_HIDDEN = 'hidden';\r\n\r\nexport const SIZE_100_PERSENT = '100%';\r\n\r\nexport const SIZE_AUTO = 'auto';\r\n\r\nexport const POSITION_ABSOLUTE = 'absolute';\r\n\r\nexport const POSITION_STICKY = 'sticky';\r\n\r\nexport const TRANSLATE_3D = 'translate3d';\r\n\r\nexport const ZEROS_TRANSLATE_3D = `${TRANSLATE_3D}(0,0,0)`;\r\n\r\nexport const TOP_PROP_NAME = 'top';\r\n\r\nexport const LEFT_PROP_NAME = 'left';\r\n\r\nexport const X_PROP_NAME = 'x';\r\n\r\nexport const Y_PROP_NAME = 'y';\r\n\r\nexport const WIDTH_PROP_NAME = 'width';\r\n\r\nexport const HEIGHT_PROP_NAME = 'height';\r\n\r\nexport const PX = 'px';\r\n\r\nexport const SCROLL = 'scroll';\r\n\r\nexport const SCROLL_END = 'scrollend';\r\n\r\nexport const CLASS_LIST_VERTICAL = 'vertical';\r\n\r\nexport const CLASS_LIST_HORIZONTAL = 'horizontal';\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { ISize } from '../types';\r\nimport {\r\n POSITION_ABSOLUTE, POSITION_STICKY, PX, SIZE_100_PERSENT, SIZE_AUTO, TRANSLATE_3D, VISIBILITY_HIDDEN,\r\n VISIBILITY_VISIBLE, ZEROS_TRANSLATE_3D,\r\n} from '../const';\r\n\r\n/**\r\n * Virtual list item component\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list-item',\r\n standalone: false,\r\n templateUrl: './ng-virtual-list-item.component.html',\r\n styleUrl: './ng-virtual-list-item.component.scss',\r\n host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgVirtualListItemComponent {\r\n private static __nextId: number = 0;\r\n\r\n private _id!: number;\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n private _cdr = inject(ChangeDetectorRef);\r\n\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n private _data: IRenderVirtualListItem | undefined = undefined;\r\n set item(v: IRenderVirtualListItem | undefined) {\r\n if (this._data === v) {\r\n return;\r\n }\r\n\r\n const data = this._data = v;\r\n\r\n if (data) {\r\n const styles = this._elementRef.nativeElement.style;\r\n styles.zIndex = String(data.config.sticky);\r\n if (data.config.snapped) {\r\n styles.transform = ZEROS_TRANSLATE_3D;\r\n styles.position = POSITION_STICKY;\r\n } else {\r\n styles.position = POSITION_ABSOLUTE;\r\n styles.transform = `${TRANSLATE_3D}(${data.config.isVertical ? 0 : data.measures.x}${PX}, ${data.config.isVertical ? data.measures.y : 0}${PX} , 0)`;\r\n }\r\n styles.height = data.config.isVertical ? data.config.dynamic ? SIZE_AUTO : `${data.measures.height}${PX}` : SIZE_100_PERSENT;\r\n styles.width = data.config.isVertical ? SIZE_100_PERSENT : data.config.dynamic ? SIZE_AUTO : `${data.measures.width}${PX}`;\r\n }\r\n\r\n this.data.set(v);\r\n\r\n this._cdr.markForCheck();\r\n }\r\n\r\n get item() {\r\n return this._data;\r\n }\r\n\r\n get itemId() {\r\n return this._data?.id;\r\n }\r\n\r\n itemRenderer = signal<TemplateRef<any> | undefined>(undefined);\r\n\r\n set renderer(v: TemplateRef<any> | undefined) {\r\n this.itemRenderer.set(v);\r\n }\r\n\r\n private _elementRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\r\n get element() {\r\n return this._elementRef.nativeElement;\r\n }\r\n\r\n constructor() {\r\n this._id = NgVirtualListItemComponent.__nextId = NgVirtualListItemComponent.__nextId === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListItemComponent.__nextId + 1;\r\n }\r\n\r\n getBounds(): ISize {\r\n const el: HTMLElement = this._elementRef.nativeElement,\r\n { width, height } = el.getBoundingClientRect();\r\n return { width, height };\r\n }\r\n\r\n show() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_VISIBLE) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_VISIBLE;\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_HIDDEN) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_HIDDEN;\r\n styles.transform = ZEROS_TRANSLATE_3D;\r\n }\r\n}\r\n","@if (data(); as item) {\r\n <li #listItem part=\"item\" class=\"ngvl-item__container\" [ngClass]=\"{'snapped': item.config.snapped,\r\n 'snapped-out': item.config.snappedOut}\">\r\n @if (itemRenderer(); as renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\"\r\n [ngTemplateOutletContext]=\"{data: item.data || {}, config: item.config}\" />\r\n }\r\n </li>\r\n}","import { Direction, Directions } from \"../enums\";\r\n\r\nconst HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'],\r\n VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical'];\r\n\r\n/**\r\n * Determines the axis membership of a virtual list\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/isDirection.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const isDirection = (src: Direction, expected: Direction): boolean => {\r\n if (HORIZONTAL_ALIASES.includes(expected)) {\r\n return HORIZONTAL_ALIASES.includes(src);\r\n }\r\n return VERTICAL_ALIASES.includes(src);\r\n}","/**\r\n * Simple debounce function.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/debounce.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const debounce = (cb: (...args: Array<any>) => void, debounceTime: number = 0) => {\r\n let timeout: any;\r\n const dispose = () => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n const execute = (...args: Array<any>) => {\r\n dispose();\r\n\r\n timeout = setTimeout(() => {\r\n cb(...args);\r\n }, debounceTime);\r\n };\r\n return {\r\n /**\r\n * Call handling method\r\n */\r\n execute,\r\n /**\r\n * Method of destroying handlers\r\n */\r\n dispose,\r\n };\r\n};\r\n","\r\n/**\r\n * Switch css classes\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/toggleClassName.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const toggleClassName = (el: HTMLElement, className: string, remove = false) => {\r\n if (!el.classList.contains(className)) {\r\n el.classList.add(className);\r\n } else if (remove) {\r\n el.classList.remove(className);\r\n }\r\n};\r\n","import { ComponentRef } from \"@angular/core\";\r\nimport { ScrollDirection } from \"../models\";\r\n\r\ntype TrackingPropertyId = string | number;\r\n\r\ninterface IVirtualListItemComponent<I = any> {\r\n id: number;\r\n item: I;\r\n show: () => void;\r\n hide: () => void;\r\n}\r\n\r\n/**\r\n * Tracks display items by property\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/tracker.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class Tracker<I = any, C extends IVirtualListItemComponent = any> {\r\n /**\r\n * display objects dictionary of indexes by id\r\n */\r\n private _displayObjectIndexMapById: { [id: number]: number } = {};\r\n\r\n set displayObjectIndexMapById(v: { [id: number]: number }) {\r\n if (this._displayObjectIndexMapById === v) {\r\n return;\r\n }\r\n\r\n this._displayObjectIndexMapById = v;\r\n }\r\n\r\n get displayObjectIndexMapById() {\r\n return this._displayObjectIndexMapById;\r\n }\r\n\r\n /**\r\n * Dictionary displayItems propertyNameId by items propertyNameId\r\n */\r\n private _trackMap: { [id: TrackingPropertyId]: number } | null = {};\r\n\r\n get trackMap() {\r\n return this._trackMap;\r\n }\r\n\r\n private _trackingPropertyName!: string;\r\n\r\n set trackingPropertyName(v: string) {\r\n this._trackingPropertyName = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n this._trackingPropertyName = trackingPropertyName;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(items: Array<any>, components: Array<ComponentRef<C>>,\r\n direction: ScrollDirection): void {\r\n if (!items) {\r\n return;\r\n }\r\n\r\n const idPropName = this._trackingPropertyName, untrackedItems = [...components], isDown = direction === 0 || direction === 1;\r\n\r\n for (let i = isDown ? 0 : items.length - 1, l = isDown ? items.length : 0; isDown ? i < l : i >= l; isDown ? i++ : i--) {\r\n const item = items[i], itemTrackingProperty = item[idPropName];\r\n\r\n if (this._trackMap) {\r\n if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {\r\n const diId = this._trackMap[itemTrackingProperty],\r\n compIndex = this._displayObjectIndexMapById[diId], comp = components[compIndex];\r\n\r\n const compId = comp?.instance?.id;\r\n if (comp !== undefined && compId == diId) {\r\n const indexByUntrackedItems = untrackedItems.findIndex(v => {\r\n return v.instance.id == compId;\r\n });\r\n if (indexByUntrackedItems > -1) {\r\n comp.instance.item = item;\r\n comp.instance.show();\r\n untrackedItems.splice(indexByUntrackedItems, 1);\r\n continue;\r\n }\r\n }\r\n delete this._trackMap[itemTrackingProperty];\r\n }\r\n }\r\n\r\n if (untrackedItems.length > 0) {\r\n const el = untrackedItems.shift(), item = items[i];\r\n if (el) {\r\n el.instance.item = item;\r\n\r\n if (this._trackMap) {\r\n this._trackMap[itemTrackingProperty] = el.instance.id;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (untrackedItems.length) {\r\n for (let i = 0, l = untrackedItems.length; i < l; i++) {\r\n const comp = untrackedItems[i];\r\n comp.instance.hide();\r\n }\r\n }\r\n }\r\n\r\n untrackComponentByIdProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n if (this._trackMap && (component as any)[propertyIdName] !== undefined) {\r\n delete this._trackMap[propertyIdName];\r\n }\r\n }\r\n\r\n dispose() {\r\n this._trackMap = null;\r\n }\r\n}","export type TEventHandler = (...args: Array<any>) => void;\r\n\r\n/**\r\n * Simple event emitter\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/eventEmitter.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class EventEmitter<E = string, H = TEventHandler> {\r\n private _listeners: {\r\n [eventName: string]: Array<TEventHandler>,\r\n } = {};\r\n\r\n protected _disposed: boolean = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Emits the event\r\n */\r\n dispatch(event: E, ...args: Array<any>): void {\r\n const ctx = this;\r\n const listeners = this._listeners[event as string];\r\n if (Array.isArray(listeners)) {\r\n for (let i = 0, l = listeners.length; i < l; i++) {\r\n const listener = listeners[i];\r\n if (listener) {\r\n listener.apply(ctx, args);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emits the event async\r\n */\r\n dispatchAsync(event: E, ...args: Array<any>): void {\r\n queueMicrotask(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this.dispatch(event, ...args);\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if the event listener is already subscribed.\r\n */\r\n hasEventListener(eventName: E, handler: H): boolean {\r\n const event = eventName as string;\r\n if (this._listeners.hasOwnProperty(event)) {\r\n const listeners = this._listeners[event];\r\n const index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n return true;\r\n }\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n addEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(handler as TEventHandler);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n removeEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n return;\r\n }\r\n const listeners = this._listeners[event], index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n\r\n if (listeners.length === 0) {\r\n delete this._listeners[event];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners\r\n */\r\n removeAllListeners() {\r\n const events = Object.keys(this._listeners);\r\n while (events.length > 0) {\r\n const event = events.pop();\r\n if (event) {\r\n const listeners = this._listeners[event];\r\n if (Array.isArray(listeners)) {\r\n while (listeners.length > 0) {\r\n const listener = listeners.pop();\r\n if (listener) {\r\n this.removeEventListener(event as E, listener as H);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method of destroying handlers\r\n */\r\n dispose() {\r\n this._disposed = true;\r\n\r\n this.removeAllListeners();\r\n }\r\n}","import { ScrollDirection } from \"../models\";\r\nimport { debounce } from \"./debounce\";\r\nimport { EventEmitter, TEventHandler } from \"./eventEmitter\";\r\n\r\nexport class CMap<K = string, V = any> {\r\n private _dict: { [k: string | number]: V } = {};\r\n\r\n constructor(dict?: CMap<K, V>) {\r\n if (dict) {\r\n this._dict = { ...dict._dict };\r\n }\r\n }\r\n\r\n get(key: K) {\r\n const k = String(key);\r\n return this._dict[k];\r\n }\r\n set(key: K, value: V) {\r\n const k = String(key);\r\n this._dict[k] = value;\r\n return this;\r\n }\r\n has(key: K) {\r\n return this._dict.hasOwnProperty(String(key));\r\n }\r\n delete(key: K) {\r\n const k = String(key);\r\n delete this._dict[k];\r\n }\r\n clear() {\r\n this._dict = {};\r\n }\r\n}\r\n\r\nexport interface ICacheMap<I = any, B = any> {\r\n set: (id: I, bounds: B) => CMap<I, B>;\r\n has: (id: I) => boolean;\r\n get: (id: I) => B | undefined;\r\n}\r\n\r\nexport const CACHE_BOX_CHANGE_EVENT_NAME = 'change';\r\n\r\ntype CacheMapEvents = typeof CACHE_BOX_CHANGE_EVENT_NAME;\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\nconst MAX_SCROLL_DIRECTION_POOL = 50, CLEAR_SCROLL_DIRECTION_TO = 10,\r\n DIR_BACK = '-1', DIR_NONE = '0', DIR_FORWARD = '1';\r\n\r\n/**\r\n * Cache map.\r\n * Emits a change event on each mutation.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/cacheMap.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class CacheMap<I = string | number, B = any, E extends string = CacheMapEvents, L extends TEventHandler = CacheMapListeners>\r\n extends EventEmitter<E, L> implements ICacheMap {\r\n protected _map = new CMap<I, B>();\r\n\r\n protected _snapshot = new CMap<I, B>();\r\n\r\n protected _version: number = 0;\r\n\r\n protected _previousVersion = this._version;\r\n\r\n protected _lifeCircleTimeout: any;\r\n\r\n protected _delta: number = 0;\r\n\r\n get delta() {\r\n return this._delta;\r\n }\r\n\r\n protected _deltaDirection: ScrollDirection = 0;\r\n set deltaDirection(v: ScrollDirection) {\r\n this._deltaDirection = v;\r\n\r\n this._scrollDirection = this.calcScrollDirection(v);\r\n }\r\n get deltaDirection() {\r\n return this._deltaDirection;\r\n }\r\n\r\n private _scrollDirectionCache: Array<ScrollDirection> = [];\r\n private _scrollDirection: ScrollDirection = 0;\r\n get scrollDirection() {\r\n return this._scrollDirection;\r\n }\r\n\r\n get version() {\r\n return this._version;\r\n }\r\n\r\n private _clearScrollDirectionDebounce = debounce(() => {\r\n while (this._scrollDirectionCache.length > CLEAR_SCROLL_DIRECTION_TO) {\r\n this._scrollDirectionCache.shift();\r\n }\r\n }, 10);\r\n\r\n constructor() {\r\n super();\r\n this.lifeCircle();\r\n }\r\n\r\n protected changesDetected() {\r\n return this._version !== this._previousVersion;\r\n }\r\n\r\n protected stopLifeCircle() {\r\n clearTimeout(this._lifeCircleTimeout);\r\n }\r\n\r\n protected nextTick(cb: () => void) {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._lifeCircleTimeout = setTimeout(() => {\r\n cb();\r\n });\r\n return this._lifeCircleTimeout;\r\n }\r\n\r\n protected lifeCircle() {\r\n this.fireChangeIfNeed();\r\n\r\n this.lifeCircleDo();\r\n }\r\n\r\n protected lifeCircleDo() {\r\n this._previousVersion = this._version;\r\n\r\n this.nextTick(() => {\r\n this.lifeCircle();\r\n });\r\n }\r\n\r\n clearScrollDirectionCache() {\r\n this._clearScrollDirectionDebounce.execute();\r\n }\r\n\r\n private calcScrollDirection(v: ScrollDirection): ScrollDirection {\r\n while (this._scrollDirectionCache.length >= MAX_SCROLL_DIRECTION_POOL) {\r\n this._scrollDirectionCache.shift();\r\n }\r\n this._scrollDirectionCache.push(v);\r\n const dict: { [x: string]: number } = { [DIR_BACK]: 0, [DIR_NONE]: 0, [DIR_FORWARD]: 0 };\r\n for (let i = 0, l = this._scrollDirectionCache.length, li = l - 1; i < l; i++) {\r\n const dir = String(this._scrollDirectionCache[i]);\r\n dict[dir] += 1;\r\n if (i === li) {\r\n for (let d in dict) {\r\n if (d === String(v)) {\r\n continue;\r\n }\r\n dict[d] -= 1;\r\n }\r\n }\r\n }\r\n\r\n if (dict[DIR_BACK] > dict[DIR_NONE] && dict[DIR_BACK] > dict[DIR_FORWARD]) {\r\n return -1;\r\n } else if (dict[DIR_FORWARD] > dict[DIR_BACK] && dict[DIR_FORWARD] > dict[DIR_NONE]) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n protected bumpVersion() {\r\n if (this.changesDetected()) {\r\n return;\r\n }\r\n const v = this._version === Number.MAX_SAFE_INTEGER ? 0 : this._version + 1;\r\n this._version = v;\r\n }\r\n\r\n protected fireChangeIfNeed() {\r\n if (this.changesDetected()) {\r\n this.dispatch(CACHE_BOX_CHANGE_EVENT_NAME as E, this.version);\r\n }\r\n }\r\n\r\n set(id: I, bounds: B): CMap<I, B> {\r\n if (this._map.has(id)) {\r\n const b: any = this._map.get(id), bb: any = bounds;\r\n if (b.width === bb.width && b.height === bb.height) {\r\n return this._map;\r\n }\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n return v;\r\n }\r\n\r\n has(id: I): boolean {\r\n return this._map.has(id);\r\n }\r\n\r\n get(id: I): B | undefined {\r\n return this._map.get(id);\r\n }\r\n\r\n snapshot() {\r\n this._snapshot = new CMap(this._map);\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n this.stopLifeCircle();\r\n\r\n this._snapshot.clear();\r\n\r\n this._map.clear();\r\n }\r\n}","import { ComponentRef } from \"@angular/core\";\r\nimport { NgVirtualListItemComponent } from \"../components/ng-virtual-list-item.component\";\r\nimport { IRenderVirtualListCollection } from \"../models/render-collection.model\";\r\nimport { IRenderVirtualListItem } from \"../models/render-item.model\";\r\nimport { Id } from \"../types/id\";\r\nimport { CacheMap, CMap } from \"./cacheMap\";\r\nimport { Tracker } from \"./tracker\";\r\nimport { ISize } from \"../types\";\r\nimport { HEIGHT_PROP_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME } from \"../const\";\r\nimport { IVirtualListStickyMap } from \"../models\";\r\n\r\nexport const TRACK_BOX_CHANGE_EVENT_NAME = 'change';\r\n\r\nexport interface IMetrics {\r\n delta: number;\r\n normalizedItemWidth: number;\r\n normalizedItemHeight: number;\r\n width: number;\r\n height: number;\r\n dynamicSize: boolean;\r\n itemSize: number;\r\n itemsFromStartToScrollEnd: number;\r\n itemsFromStartToDisplayEnd: number;\r\n itemsOnDisplay: number;\r\n itemsOnDisplayLength: number;\r\n isVertical: boolean;\r\n leftHiddenItemsWeight: number;\r\n leftItemLength: number;\r\n leftItemsWeight: number;\r\n renderItems: number;\r\n rightItemLength: number;\r\n rightItemsWeight: number;\r\n scrollSize: number;\r\n leftSizeOfAddedItems: number;\r\n sizeProperty: typeof HEIGHT_PROP_NAME | typeof WIDTH_PROP_NAME;\r\n snap: boolean;\r\n snippedPos: number;\r\n startIndex: number;\r\n startPosition: number;\r\n totalItemsToDisplayEndWeight: number;\r\n totalLength: number;\r\n totalSize: number;\r\n typicalItemSize: number;\r\n}\r\n\r\nexport interface IRecalculateMetricsOptions<I extends { id: Id }, C extends Array<I>> {\r\n bounds: ISize;\r\n collection: C;\r\n isVertical: boolean;\r\n itemSize: number;\r\n itemsOffset: number;\r\n dynamicSize: boolean;\r\n scrollSize: number;\r\n snap: boolean;\r\n enabledBufferOptimization: boolean;\r\n fromItemId?: Id;\r\n previousTotalSize: number;\r\n crudDetected: boolean;\r\n deletedItemsMap: { [index: number]: ISize; };\r\n}\r\n\r\nexport interface IGetItemPositionOptions<I extends { id: Id }, C extends Array<I>>\r\n extends Omit<IRecalculateMetricsOptions<I, C>, 'previousTotalSize' | 'crudDetected' | 'deletedItemsMap'> { }\r\n\r\nexport interface IUpdateCollectionOptions<I extends { id: Id }, C extends Array<I>>\r\n extends Omit<IRecalculateMetricsOptions<I, C>, 'collection' | 'previousTotalSize' | 'crudDetected' | 'deletedItemsMap'> { }\r\n\r\ntype CacheMapEvents = typeof TRACK_BOX_CHANGE_EVENT_NAME;\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\nenum ItemDisplayMethods {\r\n CREATE,\r\n UPDATE,\r\n DELETE,\r\n NOT_CHANGED,\r\n}\r\n\r\ninterface IUpdateCollectionReturns {\r\n displayItems: IRenderVirtualListCollection;\r\n totalSize: number;\r\n delta: number;\r\n crudDetected: boolean;\r\n}\r\n\r\n/**\r\n * An object that performs tracking, calculations and caching.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/trackBox.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class TrackBox extends CacheMap<Id, ISize & { method?: ItemDisplayMethods }, CacheMapEvents, CacheMapListeners> {\r\n protected _tracker!: Tracker<IRenderVirtualListItem, NgVirtualListItemComponent>;\r\n\r\n protected _items: IRenderVirtualListCollection | null | undefined;\r\n\r\n set items(v: IRenderVirtualListCollection | null | undefined) {\r\n if (this._items === v) {\r\n return;\r\n }\r\n\r\n this._items = v;\r\n }\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined;\r\n\r\n set displayComponents(v: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined) {\r\n if (this._displayComponents === v) {\r\n return;\r\n }\r\n\r\n this._displayComponents = v;\r\n }\r\n\r\n /**\r\n * Set the trackBy property\r\n */\r\n set trackingPropertyName(v: string) {\r\n this._tracker.trackingPropertyName = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n super();\r\n\r\n this._tracker = new Tracker(trackingPropertyName);\r\n }\r\n\r\n override set(id: Id, bounds: ISize): CMap<Id, ISize> {\r\n if (this._map.has(id)) {\r\n const b = this._map.get(id);\r\n if (b?.width === bounds.width && b.height === bounds.height) {\r\n return this._map;\r\n }\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n return v;\r\n }\r\n\r\n private _previousCollection: Array<{ id: Id; }> | null | undefined;\r\n\r\n private _deletedItemsMap: { [index: number]: ISize } = {};\r\n\r\n private _crudDetected = false;\r\n get crudDetected() { return this._crudDetected; }\r\n\r\n protected override fireChangeIfNeed() {\r\n if (this.changesDetected()) {\r\n this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, this._version);\r\n }\r\n }\r\n\r\n private _previousTotalSize = 0;\r\n\r\n protected _scrollDelta: number = 0;\r\n get scrollDelta() { return this._scrollDelta; }\r\n\r\n protected override lifeCircle() {\r\n this.fireChangeIfNeed();\r\n\r\n this.lifeCircleDo();\r\n }\r\n\r\n /**\r\n * Scans the collection for deleted items and flushes the deleted item cache.\r\n */\r\n resetCollection<I extends { id: Id; }, C extends Array<I>>(currentCollection: C | null | undefined, itemSize: number): void {\r\n if (currentCollection !== undefined && currentCollection !== null && currentCollection === this._previousCollection) {\r\n console.warn('Attention! The collection must be immutable.');\r\n return;\r\n }\r\n\r\n this.updateCache(this._previousCollection, currentCollection, itemSize);\r\n\r\n this._previousCollection = currentCollection;\r\n }\r\n\r\n /**\r\n * Update the cache of items from the list\r\n */\r\n protected updateCache<I extends { id: Id; }, C extends Array<I>>(previousCollection: C | null | undefined, currentCollection: C | null | undefined,\r\n itemSize: number): void {\r\n let crudDetected = false;\r\n\r\n if (!currentCollection || currentCollection.length === 0) {\r\n if (previousCollection) {\r\n // deleted\r\n for (let i = 0, l = previousCollection.length; i < l; i++) {\r\n const item = previousCollection[i], id = item.id;\r\n crudDetected = true;\r\n if (this._map.has(id)) {\r\n this._map.delete(id);\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n if (!previousCollection || previousCollection.length === 0) {\r\n if (currentCollection) {\r\n // added\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n crudDetected = true;\r\n const item = currentCollection[i], id = item.id;\r\n this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });\r\n }\r\n }\r\n return;\r\n }\r\n const collectionDict: { [id: Id]: I } = {};\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n const item = currentCollection[i];\r\n if (item) {\r\n collectionDict[item.id] = item;\r\n }\r\n }\r\n const notChangedMap: { [id: Id]: I } = {}, deletedMap: { [id: Id]: I } = {}, deletedItemsMap: { [index: number]: ISize } = {}, updatedMap: { [id: Id]: I } = {};\r\n for (let i = 0, l = previousCollection.length; i < l; i++) {\r\n const item = previousCollection[i], id = item.id;\r\n if (item) {\r\n if (collectionDict.hasOwnProperty(id)) {\r\n if (item === collectionDict[id]) {\r\n // not changed\r\n notChangedMap[item.id] = item;\r\n this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.NOT_CHANGED });\r\n continue;\r\n } else {\r\n // updated\r\n crudDetected = true;\r\n updatedMap[item.id] = item;\r\n this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.UPDATE });\r\n continue;\r\n }\r\n }\r\n\r\n // deleted\r\n crudDetected = true;\r\n deletedMap[item.id] = item;\r\n deletedItemsMap[i] = this._map.get(item.id);\r\n this._map.delete(id);\r\n }\r\n }\r\n\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n const item = currentCollection[i], id = item.id;\r\n if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) && !notChangedMap.hasOwnProperty(id)) {\r\n // added\r\n crudDetected = true;\r\n this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });\r\n }\r\n }\r\n this._crudDetected = crudDetected;\r\n this._deletedItemsMap = deletedItemsMap;\r\n }\r\n\r\n /**\r\n * Finds the position of a collection element by the given Id\r\n */\r\n getItemPosition<I extends { id: Id }, C extends Array<I>>(id: Id, stickyMap: IVirtualListStickyMap,\r\n options: IGetItemPositionOptions<I, C>): number {\r\n const opt = { fromItemId: id, stickyMap, ...options };\r\n const { scrollSize } = this.recalculateMetrics({\r\n ...opt,\r\n dynamicSize: this._crudDetected || opt.dynamicSize,\r\n previousTotalSize: this._previousTotalSize,\r\n crudDetected: this._crudDetected,\r\n deletedItemsMap: this._deletedItemsMap,\r\n });\r\n return scrollSize;\r\n }\r\n\r\n /**\r\n * Updates the collection of display objects\r\n */\r\n updateCollection<I extends { id: Id }, C extends Array<I>>(items: C, stickyMap: IVirtualListStickyMap,\r\n options: IUpdateCollectionOptions<I, C>): IUpdateCollectionReturns {\r\n const opt = { stickyMap, ...options }, crudDetected = this._crudDetected, deletedItemsMap = this._deletedItemsMap;\r\n if (opt.dynamicSize) {\r\n this.cacheElements();\r\n }\r\n\r\n const metrics = this.recalculateMetrics({\r\n ...opt,\r\n collection: items,\r\n previousTotalSize: this._previousTotalSize,\r\n crudDetected: this._crudDetected,\r\n deletedItemsMap,\r\n });\r\n\r\n this._delta += metrics.delta;\r\n\r\n this._previousTotalSize = metrics.totalSize;\r\n\r\n this._deletedItemsMap = {};\r\n\r\n this._crudDetected = false;\r\n\r\n if (opt.dynamicSize) {\r\n this.snapshot();\r\n }\r\n\r\n const displayItems = this.generateDisplayCollection(items, stickyMap, { ...metrics, });\r\n return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected };\r\n }\r\n\r\n /**\r\n * Finds the closest element in the collection by scrollSize\r\n */\r\n getNearestItem<I extends { id: Id }, C extends Array<I>>(scrollSize: number, items: C, itemSize: number, isVertical: boolean): I | undefined {\r\n return this.getElementFromStart(scrollSize, items, this._map, itemSize, isVertical);\r\n }\r\n\r\n /**\r\n * Calculates the position of an element based on the given scrollSize\r\n */\r\n private getElementFromStart<I extends { id: Id }, C extends Array<I>>(scrollSize: number, collection: C, map: CMap<Id, ISize>, typicalItemSize: number,\r\n isVertical: boolean): I | undefined {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;\r\n let offset = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const item = collection[i];\r\n let itemSize = 0;\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n itemSize = typicalItemSize;\r\n }\r\n if (offset > scrollSize) {\r\n return item;\r\n }\r\n offset += itemSize;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Calculates the entry into the overscroll area and returns the number of overscroll elements\r\n */\r\n private getElementNumToEnd<I extends { id: Id }, C extends Array<I>>(i: number, collection: C, map: CMap<Id, ISize>, typicalItemSize: number,\r\n size: number, isVertical: boolean, indexOffset: number = 0): { num: number, offset: number } {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;\r\n let offset = 0, num = 0;\r\n for (let j = collection.length - indexOffset - 1; j >= i; j--) {\r\n const item = collection[j];\r\n let itemSize = 0;\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n itemSize = typicalItemSize;\r\n }\r\n offset += itemSize;\r\n num++;\r\n if (offset > size) {\r\n return { num: 0, offset };\r\n }\r\n }\r\n return { num, offset };\r\n }\r\n\r\n /**\r\n * Calculates list metrics\r\n */\r\n protected recalculateMetrics<I extends { id: Id }, C extends Array<I>>(options: IRecalculateMetricsOptions<I, C>): IMetrics {\r\n const { fromItemId, bounds, collection, dynamicSize, isVertical, itemSize,\r\n itemsOffset, scrollSize, snap, stickyMap, enabledBufferOptimization,\r\n previousTotalSize, crudDetected, deletedItemsMap } = options as IRecalculateMetricsOptions<I, C> & {\r\n stickyMap: IVirtualListStickyMap,\r\n };\r\n\r\n const { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width,\r\n totalLength = collection.length, typicalItemSize = itemSize,\r\n w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height,\r\n map = this._map, snapshot = this._snapshot,\r\n checkOverscrollItemsLimit = Math.ceil(size / typicalItemSize),\r\n snippedPos = Math.floor(scrollSize),\r\n leftItemsWeights: Array<number> = [],\r\n isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)\r\n || (typeof fromItemId === 'string' && fromItemId > '-1');\r\n\r\n let leftItemsOffset = 0, rightItemsOffset = 0;\r\n if (enabledBufferOptimization) {\r\n switch (this.scrollDirection) {\r\n case 1: {\r\n leftItemsOffset = 0;\r\n rightItemsOffset = itemsOffset;\r\n break;\r\n }\r\n case -1: {\r\n leftItemsOffset = itemsOffset;\r\n rightItemsOffset = 0;\r\n break;\r\n }\r\n case 0:\r\n default: {\r\n leftItemsOffset = rightItemsOffset = itemsOffset;\r\n }\r\n }\r\n } else {\r\n leftItemsOffset = rightItemsOffset = itemsOffset;\r\n }\r\n\r\n let itemsFromStartToScrollEnd: number = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1,\r\n leftItemLength = 0, rightItemLength = 0,\r\n leftItemsWeight = 0, rightItemsWeight = 0,\r\n leftHiddenItemsWeight = 0,\r\n totalItemsToDisplayEndWeight = 0,\r\n leftSizeOfAddedItems = 0,\r\n leftSizeOfUpdatedItems = 0,\r\n leftSizeOfDeletedItems = 0,\r\n itemById: I | undefined = undefined,\r\n itemByIdPos: number = 0,\r\n targetDisplayItemIndex: number = -1,\r\n isTargetInOverscroll: boolean = false,\r\n actualScrollSize = itemByIdPos,\r\n totalSize = 0,\r\n startIndex;\r\n\r\n // If the list is dynamic or there are new elements in the collection, then it switches to the long algorithm.\r\n if (dynamicSize) {\r\n let y = 0, stickyCollectionItem: I | undefined = undefined, stickyComponentSize = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const ii = i + 1, collectionItem = collection[i], id = collectionItem.id;\r\n\r\n let componentSize = 0, componentSizeDelta = 0, itemDisplayMethod: ItemDisplayMethods = ItemDisplayMethods.NOT_CHANGED;\r\n if (map.has(id)) {\r\n const bounds = map.get(id) || { width: typicalItemSize, height: typicalItemSize };\r\n componentSize = bounds[sizeProperty];\r\n itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.UPDATE: {\r\n const snapshotBounds = snapshot.get(id);\r\n const componentSnapshotSize = componentSize - (snapshotBounds ? snapshotBounds[sizeProperty] : typicalItemSize);\r\n componentSizeDelta = componentSnapshotSize;\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n break;\r\n }\r\n case ItemDisplayMethods.CREATE: {\r\n componentSizeDelta = typicalItemSize;\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._deletedItemsMap.hasOwnProperty(i)) {\r\n const bounds = this._deletedItemsMap[i], size = bounds[sizeProperty] ?? typicalItemSize;\r\n if (y < scrollSize - size) {\r\n leftSizeOfDeletedItems += size;\r\n }\r\n }\r\n\r\n totalSize += componentSize;\r\n\r\n if (isFromId) {\r\n if (itemById === undefined) {\r\n if (id !== fromItemId && stickyMap && stickyMap[id] > 0) {\r\n stickyComponentSize = componentSize;\r\n stickyCollectionItem = collectionItem;\r\n }\r\n\r\n if (id === fromItemId) {\r\n targetDisplayItemIndex = i;\r\n if (stickyCollectionItem && stickyMap) {\r\n const { num } = this.getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical);\r\n if (num > 0) {\r\n isTargetInOverscroll = true;\r\n y -= size - componentSize;\r\n } else {\r\n if (stickyMap && !stickyMap[collectionItem.id] && y >= scrollSize && y < scrollSize + stickyComponentSize) {\r\n const snappedY = scrollSize - stickyComponentSize;\r\n leftHiddenItemsWeight -= (snappedY - y);\r\n y = snappedY;\r\n } else {\r\n y -= stickyComponentSize;\r\n leftHiddenItemsWeight -= stickyComponentSize;\r\n }\r\n }\r\n }\r\n itemById = collectionItem;\r\n itemByIdPos = y;\r\n } else {\r\n leftItemsWeights.push(componentSize);\r\n leftHiddenItemsWeight += componentSize;\r\n itemsFromStartToScrollEnd = ii;\r\n }\r\n }\r\n } else if (y < scrollSize - componentSize) {\r\n leftItemsWeights.push(componentSize);\r\n leftHiddenItemsWeight += componentSize;\r\n itemsFromStartToScrollEnd = ii;\r\n }\r\n\r\n if (isFromId) {\r\n if (itemById === undefined || y < itemByIdPos + size + componentSize) {\r\n itemsFromStartToDisplayEnd = ii;\r\n totalItemsToDisplayEndWeight += componentSize;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;\r\n }\r\n } else if (y <= scrollSize + size + componentSize) {\r\n itemsFromStartToDisplayEnd = ii;\r\n totalItemsToDisplayEndWeight += componentSize;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;\r\n\r\n if (y < scrollSize - componentSize) {\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.CREATE: {\r\n leftSizeOfAddedItems += componentSizeDelta;\r\n break;\r\n }\r\n case ItemDisplayMethods.UPDATE: {\r\n leftSizeOfUpdatedItems += componentSizeDelta;\r\n break;\r\n }\r\n case ItemDisplayMethods.DELETE: {\r\n leftSizeOfDeletedItems += componentSizeDelta;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n if (i < itemsFromDisplayEndToOffsetEnd) {\r\n rightItemsWeight += componentSize;\r\n }\r\n }\r\n\r\n y += componentSize;\r\n }\r\n\r\n if (isTargetInOverscroll) {\r\n const { num } = this.getElementNumToEnd(\r\n collection.length - (checkOverscrollItemsLimit < 0 ? 0 : collection.length - checkOverscrollItemsLimit),\r\n collection, map, typicalItemSize, size, isVertical, collection.length - (collection.length - (targetDisplayItemIndex + 1)),\r\n );\r\n if (num > 0) {\r\n itemsFromStartToScrollEnd -= num;\r\n }\r\n }\r\n\r\n if (itemsFromStartToScrollEnd <= -1) {\r\n itemsFromStartToScrollEnd = 0;\r\n }\r\n if (itemsFromStartToDisplayEnd <= -1) {\r\n itemsFromStartToDisplayEnd = 0;\r\n }\r\n actualScrollSize = isFromId ? itemByIdPos : scrollSize;\r\n\r\n leftItemsWeights.splice(0, leftItemsWeights.length - leftItemsOffset);\r\n leftItemsWeights.forEach(v => {\r\n leftItemsWeight += v;\r\n });\r\n\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;\r\n\r\n } else\r\n // Buffer optimization does not work on fast linear algorithm\r\n {\r\n if (crudDetected) {\r\n let y = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const collectionItem = collection[i], id = collectionItem.id;\r\n let componentSize = typicalItemSize, itemDisplayMethod: ItemDisplayMethods = ItemDisplayMethods.NOT_CHANGED;\r\n if (map.has(id)) {\r\n const bounds = map.get(id)!;\r\n itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;\r\n if (itemDisplayMethod === ItemDisplayMethods.CREATE) {\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n }\r\n }\r\n\r\n if (this._deletedItemsMap.hasOwnProperty(i)) {\r\n const bounds = this._deletedItemsMap[i], size = bounds[sizeProperty] ?? typicalItemSize;\r\n if (y < scrollSize - size) {\r\n leftSizeOfDeletedItems += size;\r\n }\r\n }\r\n\r\n if (y < scrollSize - componentSize) {\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.CREATE: {\r\n leftSizeOfUpdatedItems += componentSize;\r\n break;\r\n }\r\n case ItemDisplayMethods.UPDATE: {\r\n leftSizeOfUpdatedItems += componentSize;\r\n break;\r\n }\r\n case ItemDisplayMethods.DELETE: {\r\n leftSizeOfDeletedItems += componentSize;\r\n break;\r\n }\r\n }\r\n }\r\n y += componentSize;\r\n }\r\n }\r\n itemsFromStartToScrollEnd = Math.floor(scrollSize / typicalItemSize);\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n leftItemsWeight = leftItemLength * typicalItemSize;\r\n rightItemsWeight = rightItemLength * typicalItemSize,\r\n leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;\r\n totalSize = totalLength * typicalItemSize;\r\n\r\n const k = totalSize !== 0 ? previousTotalSize / totalSize : 0;\r\n actualScrollSize = scrollSize * k;\r\n }\r\n startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);\r\n\r\n const itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight,\r\n itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd,\r\n startPosition = leftHiddenItemsWeight - leftItemsWeight,\r\n renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength,\r\n delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems;\r\n\r\n const metrics: IMetrics = {\r\n delta,\r\n normalizedItemWidth: w,\r\n normalizedItemHeight: h,\r\n width,\r\n height,\r\n dynamicSize,\r\n itemSize,\r\n itemsFromStartToScrollEnd,\r\n itemsFromStartToDisplayEnd,\r\n itemsOnDisplay,\r\n itemsOnDisplayLength,\r\n isVertical,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n renderItems,\r\n rightItemLength,\r\n rightItemsWeight,\r\n scrollSize: actualScrollSize,\r\n leftSizeOfAddedItems,\r\n sizeProperty,\r\n snap,\r\n snippedPos,\r\n startIndex,\r\n startPosition,\r\n totalItemsToDisplayEndWeight,\r\n totalLength,\r\n totalSize,\r\n typicalItemSize,\r\n };\r\n\r\n return metrics;\r\n }\r\n\r\n clearDeltaDirection() {\r\n this.clearScrollDirectionCache();\r\n }\r\n\r\n clearDelta(clearDirectionDetector = false): void {\r\n this._delta = 0;\r\n\r\n if (clearDirectionDetector) {\r\n this.clearScrollDirectionCache();\r\n }\r\n }\r\n\r\n changes(): void {\r\n this.bumpVersion();\r\n }\r\n\r\n protected generateDisplayCollection<I extends { id: Id }, C extends Array<I>>(items: C, stickyMap: IVirtualListStickyMap,\r\n metrics: IMetrics): IRenderVirtualListCollection {\r\n const {\r\n normalizedItemWidth,\r\n normalizedItemHeight,\r\n dynamicSize,\r\n itemsFromStartToScrollEnd,\r\n isVertical,\r\n renderItems: renderItemsLength,\r\n scrollSize,\r\n sizeProperty,\r\n snap,\r\n snippedPos,\r\n startPosition,\r\n totalLength,\r\n startIndex,\r\n typicalItemSize,\r\n } = metrics,\r\n displayItems: IRenderVirtualListCollection = [];\r\n if (items.length) {\r\n const actualSnippedPosition = snippedPos;\r\n let pos = startPosition,\r\n renderItems = renderItemsLength,\r\n stickyItem: IRenderVirtualListItem | undefined, nextSticky: IRenderVirtualListItem | undefined, stickyItemIndex = -1,\r\n stickyItemSize = 0;\r\n\r\n if (snap) {\r\n for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? itemsFromStartToScrollEnd : 0, totalLength - 1); i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id], size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;\r\n if (sticky > 0) {\r\n const measures = {\r\n x: isVertical ? 0 : actualSnippedPosition,\r\n y: isVertical ? actualSnippedPosition : 0,\r\n width: normalizedItemWidth,\r\n height: normalizedItemHeight,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n snapped: true,\r\n snappedOut: false,\r\n dynamic: dynamicSize,\r\n };\r\n\r\n const itemData: I = items[i];\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n stickyItemIndex = i;\r\n stickyItemSize = size;\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex;\r\n\r\n while (renderItems > 0) {\r\n if (i >= totalLength) {\r\n break;\r\n }\r\n\r\n const id = items[i].id, size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;\r\n\r\n if (id !== stickyItem?.id) {\r\n const snapped = snap && stickyMap[id] > 0 && pos <= scrollSize,\r\n measures = {\r\n x: isVertical ? 0 : pos,\r\n y: isVertical ? pos : 0,\r\n width: normalizedItemWidth,\r\n height: normalizedItemHeight,\r\n }, config = {\r\n isVertical,\r\n sticky: stickyMap[id],\r\n snap,\r\n snapped: false,\r\n snappedOut: false,\r\n dynamic: dynamicSize,\r\n };\r\n\r\n const itemData: I = items[i];\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyItemIndex < i && stickyMap[id] > 0 && pos <= scrollSize + size + stickyItemSize) {\r\n item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;\r\n item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;\r\n nextSticky = item;\r\n nextSticky.config.snapped = snapped;\r\n }\r\n\r\n displayItems.push(item);\r\n }\r\n\r\n renderItems -= 1;\r\n pos += size;\r\n i++;\r\n }\r\n\r\n const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;\r\n\r\n if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {\r\n if (nextSticky.measures[axis] > scrollSize) {\r\n stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;\r\n stickyItem.config.snapped = nextSticky.config.snapped = false;\r\n stickyItem.config.snappedOut = true;\r\n stickyItem.config.sticky = 1;\r\n } else {\r\n nextSticky.config.snapped = true;\r\n }\r\n }\r\n }\r\n return displayItems;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(): void {\r\n if (!this._items || !this._displayComponents) {\r\n return;\r\n }\r\n\r\n this._tracker.track(this._items, this._displayComponents, this.scrollDirection);\r\n }\r\n\r\n setDisplayObjectIndexMapById(v: { [id: number]: number }): void {\r\n this._tracker.displayObjectIndexMapById = v;\r\n }\r\n\r\n untrackComponentByIdProperty(component?: NgVirtualListItemComponent | undefined) {\r\n this._tracker.untrackComponentByIdProperty(component);\r\n }\r\n\r\n getItemBounds(id: Id): ISize | undefined {\r\n if (this.has(id)) {\r\n return this.get(id);\r\n }\r\n return undefined;\r\n }\r\n\r\n protected cacheElements(): void {\r\n if (!this._displayComponents) {\r\n return;\r\n }\r\n\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const component = this._displayComponents[i], itemId = component.instance.itemId;\r\n if (itemId === undefined) {\r\n continue;\r\n }\r\n const bounds = component.instance.getBounds();\r\n this.set(itemId, bounds);\r\n }\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n if (this._tracker) {\r\n this._tracker.dispose();\r\n }\r\n }\r\n}\r\n","import { IScrollEvent, ScrollDirection } from \"../models\";\r\n\r\ninterface IScrollEventParams {\r\n direction: ScrollDirection;\r\n container: HTMLElement;\r\n list: HTMLElement;\r\n delta: number;\r\n scrollDelta: number;\r\n isVertical: boolean;\r\n}\r\n\r\n/**\r\n * Scroll event.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/scrollEvent.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class ScrollEvent implements IScrollEvent {\r\n private _direction: ScrollDirection = 1;\r\n get direction() { return this._direction; }\r\n\r\n private _scrollSize: number = 0;\r\n get scrollSize() { return this._scrollSize; }\r\n\r\n private _scrollWeight: number = 0;\r\n get scrollWeight() { return this._scrollWeight; }\r\n\r\n private _isVertical: boolean = true;\r\n get isVertical() { return this._isVertical; }\r\n\r\n private _listSize: number = 0;\r\n get listSize() { return this._listSize; }\r\n\r\n private _size: number = 0;\r\n get size() { return this._size; }\r\n\r\n private _isStart: boolean = true;\r\n get isStart() { return this._isStart; }\r\n\r\n private _isEnd: boolean = false;\r\n get isEnd() { return this._isEnd; }\r\n\r\n private _delta: number = 0;\r\n get delta() { return this._delta; }\r\n\r\n private _scrollDelta: number = 0;\r\n get scrollDelta() { return this._scrollDelta; }\r\n\r\n constructor(params: IScrollEventParams) {\r\n const { direction, isVertical, container, list, delta, scrollDelta } = params;\r\n this._direction = direction;\r\n this._isVertical = isVertical;\r\n this._scrollSize = isVertical ? container.scrollTop : container.scrollLeft;\r\n this._scrollWeight = isVertical ? container.scrollHeight : container.scrollWidth;\r\n this._listSize = isVertical ? list.offsetHeight : list.offsetWidth;\r\n this._size = isVertical ? container.offsetHeight : container.offsetWidth;\r\n this._isEnd = (this._scrollSize + this._size) === this._scrollWeight;\r\n this._delta = delta;\r\n this._scrollDelta = scrollDelta;\r\n this._isStart = this._scrollSize === 0;\r\n }\r\n}","import {\r\n AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, inject, input,\r\n OnDestroy, output, signal, TemplateRef, ViewChild, viewChild, ViewContainerRef, ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, Observable, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport {\r\n BEHAVIOR_AUTO, BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE,\r\n DEFAULT_ENABLED_BUFFER_OPTIMIZATION, DEFAULT_ITEM_SIZE, DEFAULT_ITEMS_OFFSET, DEFAULT_SNAP, HEIGHT_PROP_NAME, LEFT_PROP_NAME,\r\n MAX_SCROLL_TO_ITERATIONS, PX, SCROLL, SCROLL_END, TOP_PROP_NAME, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME,\r\n} from './const';\r\nimport { IScrollEvent, IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\nimport { Id, ISize } from './types';\r\nimport { IRenderVirtualListCollection } from './models/render-collection.model';\r\nimport { Direction, Directions } from './enums';\r\nimport { ScrollEvent, TrackBox, isDirection, toggleClassName } from './utils';\r\nimport { IGetItemPositionOptions, IUpdateCollectionOptions, TRACK_BOX_CHANGE_EVENT_NAME } from './utils/trackBox';\r\n\r\n/**\r\n * Virtual list component.\r\n * Maximum performance for extremely large lists.\r\n * It is based on algorithms for virtualization of screen objects.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list',\r\n standalone: false,\r\n templateUrl: './ng-virtual-list.component.html',\r\n styleUrl: './ng-virtual-list.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n})\r\nexport class NgVirtualListComponent implements AfterViewInit, OnDestroy {\r\n private static __nextId: number = 0;\r\n\r\n private _id: number = NgVirtualListComponent.__nextId;\r\n /**\r\n * Readonly. Returns the unique identifier of the component.\r\n */\r\n get id() { return this._id; }\r\n\r\n @ViewChild('renderersContainer', { read: ViewContainerRef })\r\n protected _listContainerRef: ViewContainerRef | undefined;\r\n\r\n protected _container = viewChild<ElementRef<HTMLDivElement>>('container');\r\n\r\n protected _list = viewChild<ElementRef<HTMLUListElement>>('list');\r\n\r\n /**\r\n * Fires when the list has been scrolled.\r\n */\r\n onScroll = output<IScrollEvent>();\r\n\r\n /**\r\n * Fires when the list has completed scrolling.\r\n */\r\n onScrollEnd = output<IScrollEvent>();\r\n\r\n private _itemsOptions = {\r\n transform: (v: IVirtualListCollection | undefined) => {\r\n this._trackBox.resetCollection(v, this.itemSize());\r\n return v;\r\n },\r\n } as any;\r\n\r\n /**\r\n * Collection of list items.\r\n */\r\n items = input.required<IVirtualListCollection>({\r\n ...this._itemsOptions,\r\n });\r\n\r\n /**\r\n * Determines whether elements will snap. Default value is \"true\".\r\n */\r\n snap = input<boolean>(DEFAULT_SNAP);\r\n\r\n /**\r\n * Experimental!\r\n * Enables buffer optimization.\r\n * Can only be used if items in the collection are not added or updated. Otherwise, artifacts in the form of twitching of the scroll area are possible.\r\n * Works only if the property dynamic = true\r\n */\r\n enabledBufferOptimization = input<boolean>(DEFAULT_ENABLED_BUFFER_OPTIMIZATION);\r\n\r\n /**\r\n * Rendering element template.\r\n */\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n /**\r\n * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,\r\n * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.\r\n */\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n private _itemSizeOptions = {\r\n transform: (v: number | undefined) => {\r\n if (v === undefined) {\r\n return DEFAULT_ITEM_SIZE;\r\n }\r\n const val = Number(v);\r\n return Number.isNaN(val) || val <= 0 ? DEFAULT_ITEM_SIZE : val;\r\n },\r\n } as any;\r\n\r\n /**\r\n * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.\r\n * Ignored if the dynamicSize property is true.\r\n */\r\n itemSize = input<number>(DEFAULT_ITEM_SIZE, { ...this._itemSizeOptions });\r\n\r\n /**\r\n * If true then the items in the list can have different sizes and the itemSize property is ignored.\r\n * If false then the items in the list have a fixed size specified by the itemSize property. The default value is false.\r\n */\r\n dynamicSize = input(DEFAULT_DYNAMIC_SIZE);\r\n\r\n /**\r\n * Determines the direction in which elements are placed. Default value is \"vertical\".\r\n */\r\n direction = input<Direction>(DEFAULT_DIRECTION);\r\n\r\n /**\r\n * Number of elements outside the scope of visibility. Default value is 2.\r\n */\r\n itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e?: Event) => {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n const container = this._container()?.nativeElement;\r\n if (container) {\r\n const scrollSize = (this._isVertical ? container.scrollTop : container.scrollLeft),\r\n actualScrollSize = scrollSize;\r\n this._scrollSize.set(actualScrollSize);\r\n }\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLDivElement>);\r\n\r\n private _initialized!: WritableSignal<boolean>;\r\n\r\n readonly $initialized!: Observable<boolean>;\r\n\r\n /**\r\n * The name of the property by which tracking is performed\r\n */\r\n trackBy = input<string>(TRACK_BY_PROPERTY_NAME);\r\n\r\n /**\r\n * Dictionary of element sizes by their id\r\n */\r\n private _trackBox = new TrackBox(this.trackBy());\r\n\r\n private _onTrackBoxChangeHandler = (v: number) => {\r\n this._$cacheVersion.next(v);\r\n }\r\n\r\n private _$cacheVersion = new BehaviorSubject<number>(-1);\r\n get $cacheVersion() { return this._$cacheVersion.asObservable(); }\r\n\r\n constructor() {\r\n NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListComponent.__nextId + 1;\r\n this._id = NgVirtualListComponent.__nextId;\r\n\r\n this._initialized = signal<boolean>(false);\r\n this.$initialized = toObservable(this._initialized);\r\n\r\n this._trackBox.displayComponents = this._displayComponents;\r\n\r\n const $trackBy = toObservable(this.trackBy);\r\n\r\n $trackBy.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._trackBox.trackingPropertyName = v;\r\n }),\r\n ).subscribe();\r\n\r\n const $bounds = toObservable(this._bounds).pipe(\r\n filter(b => !!b),\r\n ), $items = toObservable(this.items).pipe(\r\n map(i => !i ? [] : i),\r\n ), $scrollSize = toObservable(this._scrollSize),\r\n $itemSize = toObservable(this.itemSize).pipe(\r\n map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v),\r\n ),\r\n $itemsOffset = toObservable(this.itemsOffset).pipe(\r\n map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v),\r\n ),\r\n $stickyMap = toObservable(this.stickyMap).pipe(\r\n map(v => !v ? {} : v),\r\n ),\r\n $snap = toObservable(this.snap),\r\n $isVertical = toObservable(this.direction).pipe(\r\n map(v => this.getIsVertical(v || DEFAULT_DIRECTION)),\r\n ),\r\n $dynamicSize = toObservable(this.dynamicSize),\r\n $enabledBufferOptimization = toObservable(this.enabledBufferOptimization),\r\n $cacheVersion = this.$cacheVersion;\r\n\r\n $isVertical.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? CLASS_LIST_VERTICAL : CLASS_LIST_HORIZONTAL, true);\r\n }),\r\n ).subscribe();\r\n\r\n $dynamicSize.pipe(\r\n takeUntilDestroyed(),\r\n tap(dynamicSize => {\r\n this.listenCacheChangesIfNeed(dynamicSize);\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([this.$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,\r\n $itemsOffset, $snap, $isVertical, $dynamicSize, $enabledBufferOptimization, $cacheVersion,\r\n ]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n switchMap(([,\r\n bounds, items, stickyMap, scrollSize, itemSize,\r\n itemsOffset, snap, isVertical, dynamicSize, enabledBufferOptimization, cacheVersion,\r\n ]) => {\r\n const { width, height } = bounds as DOMRect;\r\n let actualScrollSize = (this._isVertical ? this._container()?.nativeElement.scrollTop ?? 0 : this._container()?.nativeElement.scrollLeft) ?? 0;\r\n const opts: IUpdateCollectionOptions<IVirtualListItem, IVirtualListCollection> = {\r\n bounds: { width, height }, dynamicSize, isVertical, itemSize,\r\n itemsOffset, scrollSize: scrollSize, snap, enabledBufferOptimization,\r\n };\r\n const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {\r\n ...opts, scrollSize: actualScrollSize,\r\n });\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n\r\n this.tracking();\r\n\r\n const container = this._container();\r\n\r\n if (container) {\r\n const delta = this._trackBox.delta;\r\n actualScrollSize = actualScrollSize + delta;\r\n\r\n this._trackBox.clearDelta();\r\n\r\n if (scrollSize !== actualScrollSize) {\r\n const params: ScrollToOptions = {\r\n [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,\r\n behavior: BEHAVIOR_INSTANT\r\n };\r\n\r\n container.nativeElement.scrollTo(params);\r\n }\r\n }\r\n\r\n return of(displayItems);\r\n }),\r\n ).subscribe();\r\n\r\n combineLatest([this.$initialized, toObservable(this.itemRenderer)]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, itemRenderer]) => {\r\n this.resetRenderers(itemRenderer);\r\n })\r\n )\r\n }\r\n\r\n ngOnInit() {\r\n this._initialized.set(true);\r\n }\r\n\r\n private listenCacheChangesIfNeed(value: boolean) {\r\n if (value) {\r\n if (!this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.addEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n } else {\r\n if (this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.removeEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n }\r\n }\r\n\r\n private getIsVertical(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private _componentsResizeObserver = new ResizeObserver(() => {\r\n this._trackBox.changes();\r\n });\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n this._trackBox.setDisplayObjectIndexMapById({});\r\n return;\r\n }\r\n\r\n this._trackBox.items = displayItems;\r\n\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n const maxLength = displayItems.length, components = this._displayComponents;\r\n\r\n while (components.length < maxLength) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n components.push(comp);\r\n\r\n this._componentsResizeObserver.observe(comp.instance.element);\r\n }\r\n }\r\n\r\n this.resetRenderers();\r\n }\r\n\r\n private resetRenderers(itemRenderer?: TemplateRef<HTMLElement>) {\r\n const doMap: { [id: number]: number } = {};\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const item = this._displayComponents[i];\r\n item.instance.renderer = itemRenderer || this.itemRenderer();\r\n doMap[item.instance.id] = i;\r\n }\r\n\r\n this._trackBox.setDisplayObjectIndexMapById(doMap);\r\n }\r\n\r\n /**\r\n * Tracking by id\r\n */\r\n protected tracking() {\r\n this._trackBox.track();\r\n }\r\n\r\n private resetBoundsSize(isVertical: boolean, totalSize: number) {\r\n const l = this._list();\r\n if (l) {\r\n l.nativeElement.style[isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME] = `${totalSize}${PX}`;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the bounds of an element with a given id\r\n */\r\n getItemBounds(id: Id): ISize | undefined {\r\n return this._trackBox.getItemBounds(id);\r\n }\r\n\r\n /**\r\n * The method scrolls the list to the element with the given id and returns the value of the scrolled area.\r\n * Behavior accepts the values ​​\"auto\", \"instant\" and \"smooth\".\r\n */\r\n scrollTo(id: Id, behavior: ScrollBehavior = BEHAVIOR_AUTO) {\r\n this.scrollToExecutor(id, behavior);\r\n }\r\n\r\n private _scrollToRepeatExecutionTimeout: any;\r\n\r\n private clearScrollToRepeatExecutionTimeout() {\r\n clearTimeout(this._scrollToRepeatExecutionTimeout);\r\n }\r\n\r\n protected scrollToExecutor(id: Id, behavior: ScrollBehavior, iteration: number = 0, isLastIteration = false) {\r\n const items = this.items();\r\n if (!items || !items.length) {\r\n return;\r\n }\r\n\r\n const dynamicSize = this.dynamicSize(), container = this._container(), itemSize = this.itemSize();\r\n if (container) {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n if (dynamicSize) {\r\n if (container) {\r\n container.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);\r\n }\r\n\r\n const { width, height } = this._bounds() || { width: 0, height: 0 },\r\n stickyMap = this.stickyMap(), items = this.items(), isVertical = this._isVertical, delta = this._trackBox.delta,\r\n opts: IGetItemPositionOptions<IVirtualListItem, IVirtualListCollection> = {\r\n bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize,\r\n itemsOffset: this.itemsOffset(), scrollSize: (isVertical ? container.nativeElement.scrollTop : container.nativeElement.scrollLeft) + delta,\r\n snap: this.snap(), fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization(),\r\n },\r\n scrollSize = this._trackBox.getItemPosition(id, stickyMap, opts),\r\n params: ScrollToOptions = { [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };\r\n this._trackBox.clearDelta();\r\n\r\n if (container) {\r\n const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {\r\n ...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,\r\n }), delta = this._trackBox.delta;\r\n\r\n this._trackBox.clearDelta();\r\n\r\n let actualScrollSize = scrollSize + delta;\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n\r\n this.tracking();\r\n\r\n const _scrollSize = this._trackBox.getItemPosition(id, stickyMap, { ...opts, scrollSize: actualScrollSize, fromItemId: id });\r\n\r\n const notChanged = actualScrollSize === _scrollSize;\r\n\r\n if (!notChanged || iteration < MAX_SCROLL_TO_ITERATIONS) {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n this._scrollToRepeatExecutionTimeout = setTimeout(() => {\r\n this.scrollToExecutor(id, BEHAVIOR_INSTANT, iteration + 1, notChanged);\r\n });\r\n } else {\r\n this._scrollSize.set(actualScrollSize);\r\n\r\n container.nativeElement.addEventListener(SCROLL, this._onScrollHandler);\r\n }\r\n }\r\n\r\n container.nativeElement.scrollTo(params);\r\n\r\n this._scrollSize.set(scrollSize);\r\n } else {\r\n const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize();\r\n const params: ScrollToOptions = { [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };\r\n container.nativeElement.scrollTo(params);\r\n }\r\n }\r\n }\r\n\r\n scrollToEnd(behavior: ScrollBehavior = BEHAVIOR_INSTANT) {\r\n const items = this.items(), latItem = items[items.length > 0 ? items.length - 1 : 0];\r\n this.scrollTo(latItem.id, behavior);\r\n }\r\n\r\n private _onContainerScrollHandler = (e: Event) => {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);\r\n this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : this._scrollSize() < scrollSize ? 1 : 0;\r\n\r\n const event = new ScrollEvent({\r\n direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,\r\n list: this._list()!.nativeElement, delta: this._trackBox.delta,\r\n scrollDelta: this._trackBox.scrollDelta, isVertical: this._isVertical,\r\n });\r\n\r\n this.onScroll.emit(event);\r\n }\r\n }\r\n\r\n private _onContainerScrollEndHandler = (e: Event) => {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);\r\n this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : 0;\r\n\r\n const event = new ScrollEvent({\r\n direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,\r\n list: this._list()!.nativeElement, delta: this._trackBox.delta,\r\n scrollDelta: this._trackBox.scrollDelta, isVertical: this._isVertical,\r\n });\r\n\r\n this.onScrollEnd.emit(event);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n // for direction calculation\r\n containerEl.nativeElement.addEventListener(SCROLL, this._onContainerScrollHandler);\r\n containerEl.nativeElement.addEventListener(SCROLL_END, this._onContainerScrollEndHandler);\r\n\r\n containerEl.nativeElement.addEventListener(SCROLL, this._onScrollHandler);\r\n\r\n this._resizeObserver = new ResizeObserver(this._onResizeHandler);\r\n this._resizeObserver.observe(containerEl.nativeElement);\r\n\r\n this._onResizeHandler();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n if (this._trackBox) {\r\n this._trackBox.dispose();\r\n }\r\n\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);\r\n containerEl.nativeElement.removeEventListener(SCROLL, this._onContainerScrollHandler);\r\n containerEl.nativeElement.removeEventListener(SCROLL_END, this._onContainerScrollEndHandler);\r\n\r\n if (this._componentsResizeObserver) {\r\n this._componentsResizeObserver.disconnect();\r\n }\r\n\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n }\r\n\r\n if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgVirtualListComponent } from './ng-virtual-list.component';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\n\r\n@NgModule({\r\n declarations: [NgVirtualListComponent, NgVirtualListItemComponent],\r\n exports: [NgVirtualListComponent],\r\n imports: [CommonModule],\r\n schemas: [NO_ERRORS_SCHEMA],\r\n})\r\nexport class NgVirtualListModule { }\r\n","/*\r\n * Public API Surface of ng-virtual-list\r\n */\r\n\r\nexport * from './lib/ng-virtual-list.module';\r\nexport * from './lib/ng-virtual-list.component';\r\nexport * from './lib/models';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-virtual-list.mjs","sources":["../../../projects/ng-virtual-list/src/lib/enums/directions.ts","../../../projects/ng-virtual-list/src/lib/const/index.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.html","../../../projects/ng-virtual-list/src/lib/utils/isDirection.ts","../../../projects/ng-virtual-list/src/lib/utils/debounce.ts","../../../projects/ng-virtual-list/src/lib/utils/toggleClassName.ts","../../../projects/ng-virtual-list/src/lib/utils/tracker.ts","../../../projects/ng-virtual-list/src/lib/utils/eventEmitter.ts","../../../projects/ng-virtual-list/src/lib/utils/cacheMap.ts","../../../projects/ng-virtual-list/src/lib/utils/trackBox.ts","../../../projects/ng-virtual-list/src/lib/utils/scrollEvent.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.html","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.module.ts","../../../projects/ng-virtual-list/src/public-api.ts","../../../projects/ng-virtual-list/src/ng-virtual-list.ts"],"sourcesContent":["/**\r\n * Axis of the arrangement of virtual list elements.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/enums/directions.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport enum Directions {\r\n /**\r\n * Horizontal axis.\r\n */\r\n HORIZONTAL = 'horizontal',\r\n /**\r\n * Vertical axis.\r\n */\r\n VERTICAL = 'vertical',\r\n}","import { Directions } from \"../enums/directions\";\r\n\r\nexport const DEFAULT_ITEM_SIZE = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DEFAULT_SNAP = false;\r\n\r\nexport const DEFAULT_ENABLED_BUFFER_OPTIMIZATION = false;\r\n\r\nexport const DEFAULT_DYNAMIC_SIZE = false;\r\n\r\nexport const TRACK_BY_PROPERTY_NAME = 'id';\r\n\r\nexport const DEFAULT_DIRECTION = Directions.VERTICAL;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n\r\nexport const MAX_SCROLL_TO_ITERATIONS = 5;\r\n\r\n// presets\r\n\r\nexport const BEHAVIOR_AUTO = 'auto';\r\n\r\nexport const BEHAVIOR_INSTANT = 'instant';\r\n\r\nexport const BEHAVIOR_SMOOTH = 'smooth';\r\n\r\nexport const VISIBILITY_VISIBLE = 'visible';\r\n\r\nexport const VISIBILITY_HIDDEN = 'hidden';\r\n\r\nexport const SIZE_100_PERSENT = '100%';\r\n\r\nexport const SIZE_AUTO = 'auto';\r\n\r\nexport const POSITION_ABSOLUTE = 'absolute';\r\n\r\nexport const POSITION_STICKY = 'sticky';\r\n\r\nexport const TRANSLATE_3D = 'translate3d';\r\n\r\nexport const ZEROS_TRANSLATE_3D = `${TRANSLATE_3D}(0,0,0)`;\r\n\r\nexport const TOP_PROP_NAME = 'top';\r\n\r\nexport const LEFT_PROP_NAME = 'left';\r\n\r\nexport const X_PROP_NAME = 'x';\r\n\r\nexport const Y_PROP_NAME = 'y';\r\n\r\nexport const WIDTH_PROP_NAME = 'width';\r\n\r\nexport const HEIGHT_PROP_NAME = 'height';\r\n\r\nexport const PX = 'px';\r\n\r\nexport const SCROLL = 'scroll';\r\n\r\nexport const SCROLL_END = 'scrollend';\r\n\r\nexport const CLASS_LIST_VERTICAL = 'vertical';\r\n\r\nexport const CLASS_LIST_HORIZONTAL = 'horizontal';\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { ISize } from '../types';\r\nimport {\r\n POSITION_ABSOLUTE, POSITION_STICKY, PX, SIZE_100_PERSENT, SIZE_AUTO, TRANSLATE_3D, VISIBILITY_HIDDEN,\r\n VISIBILITY_VISIBLE, ZEROS_TRANSLATE_3D,\r\n} from '../const';\r\n\r\n/**\r\n * Virtual list item component\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list-item',\r\n standalone: false,\r\n templateUrl: './ng-virtual-list-item.component.html',\r\n styleUrl: './ng-virtual-list-item.component.scss',\r\n host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgVirtualListItemComponent {\r\n private static __nextId: number = 0;\r\n\r\n private _id!: number;\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n private _cdr = inject(ChangeDetectorRef);\r\n\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n private _data: IRenderVirtualListItem | undefined = undefined;\r\n set item(v: IRenderVirtualListItem | undefined) {\r\n if (this._data === v) {\r\n return;\r\n }\r\n\r\n const data = this._data = v;\r\n\r\n if (data) {\r\n const styles = this._elementRef.nativeElement.style;\r\n styles.zIndex = String(data.config.sticky);\r\n if (data.config.snapped) {\r\n styles.transform = ZEROS_TRANSLATE_3D;\r\n styles.position = POSITION_STICKY;\r\n } else {\r\n styles.position = POSITION_ABSOLUTE;\r\n styles.transform = `${TRANSLATE_3D}(${data.config.isVertical ? 0 : data.measures.x}${PX}, ${data.config.isVertical ? data.measures.y : 0}${PX} , 0)`;\r\n }\r\n styles.height = data.config.isVertical ? data.config.dynamic ? SIZE_AUTO : `${data.measures.height}${PX}` : SIZE_100_PERSENT;\r\n styles.width = data.config.isVertical ? SIZE_100_PERSENT : data.config.dynamic ? SIZE_AUTO : `${data.measures.width}${PX}`;\r\n }\r\n\r\n this.data.set(v);\r\n\r\n this._cdr.markForCheck();\r\n }\r\n\r\n get item() {\r\n return this._data;\r\n }\r\n\r\n get itemId() {\r\n return this._data?.id;\r\n }\r\n\r\n itemRenderer = signal<TemplateRef<any> | undefined>(undefined);\r\n\r\n set renderer(v: TemplateRef<any> | undefined) {\r\n this.itemRenderer.set(v);\r\n }\r\n\r\n private _elementRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\r\n get element() {\r\n return this._elementRef.nativeElement;\r\n }\r\n\r\n constructor() {\r\n this._id = NgVirtualListItemComponent.__nextId = NgVirtualListItemComponent.__nextId === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListItemComponent.__nextId + 1;\r\n }\r\n\r\n getBounds(): ISize {\r\n const el: HTMLElement = this._elementRef.nativeElement,\r\n { width, height } = el.getBoundingClientRect();\r\n return { width, height };\r\n }\r\n\r\n show() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_VISIBLE) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_VISIBLE;\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_HIDDEN) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_HIDDEN;\r\n styles.transform = ZEROS_TRANSLATE_3D;\r\n }\r\n}\r\n","@if (data(); as item) {\r\n <li #listItem part=\"item\" class=\"ngvl-item__container\" [ngClass]=\"{'snapped': item.config.snapped,\r\n 'snapped-out': item.config.snappedOut}\">\r\n @if (itemRenderer(); as renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\"\r\n [ngTemplateOutletContext]=\"{data: item.data || {}, config: item.config}\" />\r\n }\r\n </li>\r\n}","import { Direction, Directions } from \"../enums\";\r\n\r\nconst HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'],\r\n VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical'];\r\n\r\n/**\r\n * Determines the axis membership of a virtual list\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/isDirection.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const isDirection = (src: Direction, expected: Direction): boolean => {\r\n if (HORIZONTAL_ALIASES.includes(expected)) {\r\n return HORIZONTAL_ALIASES.includes(src);\r\n }\r\n return VERTICAL_ALIASES.includes(src);\r\n}","/**\r\n * Simple debounce function.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/debounce.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const debounce = (cb: (...args: Array<any>) => void, debounceTime: number = 0) => {\r\n let timeout: any;\r\n const dispose = () => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n const execute = (...args: Array<any>) => {\r\n dispose();\r\n\r\n timeout = setTimeout(() => {\r\n cb(...args);\r\n }, debounceTime);\r\n };\r\n return {\r\n /**\r\n * Call handling method\r\n */\r\n execute,\r\n /**\r\n * Method of destroying handlers\r\n */\r\n dispose,\r\n };\r\n};\r\n","\r\n/**\r\n * Switch css classes\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/toggleClassName.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const toggleClassName = (el: HTMLElement, className: string, remove = false) => {\r\n if (!el.classList.contains(className)) {\r\n el.classList.add(className);\r\n } else if (remove) {\r\n el.classList.remove(className);\r\n }\r\n};\r\n","import { ComponentRef } from \"@angular/core\";\r\nimport { ScrollDirection } from \"../models\";\r\n\r\ntype TrackingPropertyId = string | number;\r\n\r\ninterface IVirtualListItemComponent<I = any> {\r\n id: number;\r\n item: I;\r\n show: () => void;\r\n hide: () => void;\r\n}\r\n\r\n/**\r\n * Tracks display items by property\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/tracker.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class Tracker<I = any, C extends IVirtualListItemComponent = any> {\r\n /**\r\n * display objects dictionary of indexes by id\r\n */\r\n private _displayObjectIndexMapById: { [id: number]: number } = {};\r\n\r\n set displayObjectIndexMapById(v: { [id: number]: number }) {\r\n if (this._displayObjectIndexMapById === v) {\r\n return;\r\n }\r\n\r\n this._displayObjectIndexMapById = v;\r\n }\r\n\r\n get displayObjectIndexMapById() {\r\n return this._displayObjectIndexMapById;\r\n }\r\n\r\n /**\r\n * Dictionary displayItems propertyNameId by items propertyNameId\r\n */\r\n private _trackMap: { [id: TrackingPropertyId]: number } | null = {};\r\n\r\n get trackMap() {\r\n return this._trackMap;\r\n }\r\n\r\n private _trackingPropertyName!: string;\r\n\r\n set trackingPropertyName(v: string) {\r\n this._trackingPropertyName = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n this._trackingPropertyName = trackingPropertyName;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(items: Array<any>, components: Array<ComponentRef<C>>,\r\n direction: ScrollDirection): void {\r\n if (!items) {\r\n return;\r\n }\r\n\r\n const idPropName = this._trackingPropertyName, untrackedItems = [...components], isDown = direction === 0 || direction === 1;\r\n\r\n for (let i = isDown ? 0 : items.length - 1, l = isDown ? items.length : 0; isDown ? i < l : i >= l; isDown ? i++ : i--) {\r\n const item = items[i], itemTrackingProperty = item[idPropName];\r\n\r\n if (this._trackMap) {\r\n if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {\r\n const diId = this._trackMap[itemTrackingProperty],\r\n compIndex = this._displayObjectIndexMapById[diId], comp = components[compIndex];\r\n\r\n const compId = comp?.instance?.id;\r\n if (comp !== undefined && compId == diId) {\r\n const indexByUntrackedItems = untrackedItems.findIndex(v => {\r\n return v.instance.id == compId;\r\n });\r\n if (indexByUntrackedItems > -1) {\r\n comp.instance.item = item;\r\n comp.instance.show();\r\n untrackedItems.splice(indexByUntrackedItems, 1);\r\n continue;\r\n }\r\n }\r\n delete this._trackMap[itemTrackingProperty];\r\n }\r\n }\r\n\r\n if (untrackedItems.length > 0) {\r\n const el = untrackedItems.shift(), item = items[i];\r\n if (el) {\r\n el.instance.item = item;\r\n\r\n if (this._trackMap) {\r\n this._trackMap[itemTrackingProperty] = el.instance.id;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (untrackedItems.length) {\r\n for (let i = 0, l = untrackedItems.length; i < l; i++) {\r\n const comp = untrackedItems[i];\r\n comp.instance.hide();\r\n }\r\n }\r\n }\r\n\r\n untrackComponentByIdProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n if (this._trackMap && (component as any)[propertyIdName] !== undefined) {\r\n delete this._trackMap[propertyIdName];\r\n }\r\n }\r\n\r\n dispose() {\r\n this._trackMap = null;\r\n }\r\n}","export type TEventHandler = (...args: Array<any>) => void;\r\n\r\n/**\r\n * Simple event emitter\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/eventEmitter.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class EventEmitter<E = string, H = TEventHandler> {\r\n private _listeners: {\r\n [eventName: string]: Array<TEventHandler>,\r\n } = {};\r\n\r\n protected _disposed: boolean = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Emits the event\r\n */\r\n dispatch(event: E, ...args: Array<any>): void {\r\n const ctx = this;\r\n const listeners = this._listeners[event as string];\r\n if (Array.isArray(listeners)) {\r\n for (let i = 0, l = listeners.length; i < l; i++) {\r\n const listener = listeners[i];\r\n if (listener) {\r\n listener.apply(ctx, args);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emits the event async\r\n */\r\n dispatchAsync(event: E, ...args: Array<any>): void {\r\n queueMicrotask(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this.dispatch(event, ...args);\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if the event listener is already subscribed.\r\n */\r\n hasEventListener(eventName: E, handler: H): boolean {\r\n const event = eventName as string;\r\n if (this._listeners.hasOwnProperty(event)) {\r\n const listeners = this._listeners[event];\r\n const index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n return true;\r\n }\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n addEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(handler as TEventHandler);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n removeEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n return;\r\n }\r\n const listeners = this._listeners[event], index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n\r\n if (listeners.length === 0) {\r\n delete this._listeners[event];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners\r\n */\r\n removeAllListeners() {\r\n const events = Object.keys(this._listeners);\r\n while (events.length > 0) {\r\n const event = events.pop();\r\n if (event) {\r\n const listeners = this._listeners[event];\r\n if (Array.isArray(listeners)) {\r\n while (listeners.length > 0) {\r\n const listener = listeners.pop();\r\n if (listener) {\r\n this.removeEventListener(event as E, listener as H);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method of destroying handlers\r\n */\r\n dispose() {\r\n this._disposed = true;\r\n\r\n this.removeAllListeners();\r\n }\r\n}","import { ScrollDirection } from \"../models\";\r\nimport { debounce } from \"./debounce\";\r\nimport { EventEmitter, TEventHandler } from \"./eventEmitter\";\r\n\r\nexport class CMap<K = string, V = any> {\r\n private _dict: { [k: string | number]: V } = {};\r\n\r\n constructor(dict?: CMap<K, V>) {\r\n if (dict) {\r\n this._dict = { ...dict._dict };\r\n }\r\n }\r\n\r\n get(key: K) {\r\n const k = String(key);\r\n return this._dict[k];\r\n }\r\n set(key: K, value: V) {\r\n const k = String(key);\r\n this._dict[k] = value;\r\n return this;\r\n }\r\n has(key: K) {\r\n return this._dict.hasOwnProperty(String(key));\r\n }\r\n delete(key: K) {\r\n const k = String(key);\r\n delete this._dict[k];\r\n }\r\n clear() {\r\n this._dict = {};\r\n }\r\n}\r\n\r\nexport interface ICacheMap<I = any, B = any> {\r\n set: (id: I, bounds: B) => CMap<I, B>;\r\n has: (id: I) => boolean;\r\n get: (id: I) => B | undefined;\r\n}\r\n\r\nexport const CACHE_BOX_CHANGE_EVENT_NAME = 'change';\r\n\r\ntype CacheMapEvents = typeof CACHE_BOX_CHANGE_EVENT_NAME;\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\nconst MAX_SCROLL_DIRECTION_POOL = 50, CLEAR_SCROLL_DIRECTION_TO = 10,\r\n DIR_BACK = '-1', DIR_NONE = '0', DIR_FORWARD = '1';\r\n\r\n/**\r\n * Cache map.\r\n * Emits a change event on each mutation.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/cacheMap.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class CacheMap<I = string | number, B = any, E extends string = CacheMapEvents, L extends TEventHandler = CacheMapListeners>\r\n extends EventEmitter<E, L> implements ICacheMap {\r\n protected _map = new CMap<I, B>();\r\n\r\n protected _snapshot = new CMap<I, B>();\r\n\r\n protected _version: number = 0;\r\n\r\n protected _previousVersion = this._version;\r\n\r\n protected _lifeCircleTimeout: any;\r\n\r\n protected _delta: number = 0;\r\n\r\n get delta() {\r\n return this._delta;\r\n }\r\n\r\n protected _deltaDirection: ScrollDirection = 0;\r\n set deltaDirection(v: ScrollDirection) {\r\n this._deltaDirection = v;\r\n\r\n this._scrollDirection = this.calcScrollDirection(v);\r\n }\r\n get deltaDirection() {\r\n return this._deltaDirection;\r\n }\r\n\r\n private _scrollDirectionCache: Array<ScrollDirection> = [];\r\n private _scrollDirection: ScrollDirection = 0;\r\n get scrollDirection() {\r\n return this._scrollDirection;\r\n }\r\n\r\n get version() {\r\n return this._version;\r\n }\r\n\r\n private _clearScrollDirectionDebounce = debounce(() => {\r\n while (this._scrollDirectionCache.length > CLEAR_SCROLL_DIRECTION_TO) {\r\n this._scrollDirectionCache.shift();\r\n }\r\n }, 10);\r\n\r\n constructor() {\r\n super();\r\n this.lifeCircle();\r\n }\r\n\r\n protected changesDetected() {\r\n return this._version !== this._previousVersion;\r\n }\r\n\r\n protected stopLifeCircle() {\r\n clearTimeout(this._lifeCircleTimeout);\r\n }\r\n\r\n protected nextTick(cb: () => void) {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._lifeCircleTimeout = setTimeout(() => {\r\n cb();\r\n });\r\n return this._lifeCircleTimeout;\r\n }\r\n\r\n protected lifeCircle() {\r\n this.fireChangeIfNeed();\r\n\r\n this.lifeCircleDo();\r\n }\r\n\r\n protected lifeCircleDo() {\r\n this._previousVersion = this._version;\r\n\r\n this.nextTick(() => {\r\n this.lifeCircle();\r\n });\r\n }\r\n\r\n clearScrollDirectionCache() {\r\n this._clearScrollDirectionDebounce.execute();\r\n }\r\n\r\n private calcScrollDirection(v: ScrollDirection): ScrollDirection {\r\n while (this._scrollDirectionCache.length >= MAX_SCROLL_DIRECTION_POOL) {\r\n this._scrollDirectionCache.shift();\r\n }\r\n this._scrollDirectionCache.push(v);\r\n const dict: { [x: string]: number } = { [DIR_BACK]: 0, [DIR_NONE]: 0, [DIR_FORWARD]: 0 };\r\n for (let i = 0, l = this._scrollDirectionCache.length, li = l - 1; i < l; i++) {\r\n const dir = String(this._scrollDirectionCache[i]);\r\n dict[dir] += 1;\r\n if (i === li) {\r\n for (let d in dict) {\r\n if (d === String(v)) {\r\n continue;\r\n }\r\n dict[d] -= 1;\r\n }\r\n }\r\n }\r\n\r\n if (dict[DIR_BACK] > dict[DIR_NONE] && dict[DIR_BACK] > dict[DIR_FORWARD]) {\r\n return -1;\r\n } else if (dict[DIR_FORWARD] > dict[DIR_BACK] && dict[DIR_FORWARD] > dict[DIR_NONE]) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n protected bumpVersion() {\r\n if (this.changesDetected()) {\r\n return;\r\n }\r\n const v = this._version === Number.MAX_SAFE_INTEGER ? 0 : this._version + 1;\r\n this._version = v;\r\n }\r\n\r\n protected fireChangeIfNeed() {\r\n if (this.changesDetected()) {\r\n this.dispatch(CACHE_BOX_CHANGE_EVENT_NAME as E, this.version);\r\n }\r\n }\r\n\r\n set(id: I, bounds: B): CMap<I, B> {\r\n if (this._map.has(id)) {\r\n const b: any = this._map.get(id), bb: any = bounds;\r\n if (b.width === bb.width && b.height === bb.height) {\r\n return this._map;\r\n }\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n return v;\r\n }\r\n\r\n has(id: I): boolean {\r\n return this._map.has(id);\r\n }\r\n\r\n get(id: I): B | undefined {\r\n return this._map.get(id);\r\n }\r\n\r\n snapshot() {\r\n this._snapshot = new CMap(this._map);\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n this.stopLifeCircle();\r\n\r\n this._snapshot.clear();\r\n\r\n this._map.clear();\r\n }\r\n}","import { ComponentRef } from \"@angular/core\";\r\nimport { NgVirtualListItemComponent } from \"../components/ng-virtual-list-item.component\";\r\nimport { IRenderVirtualListCollection } from \"../models/render-collection.model\";\r\nimport { IRenderVirtualListItem } from \"../models/render-item.model\";\r\nimport { Id } from \"../types/id\";\r\nimport { CacheMap, CMap } from \"./cacheMap\";\r\nimport { Tracker } from \"./tracker\";\r\nimport { ISize } from \"../types\";\r\nimport { HEIGHT_PROP_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME } from \"../const\";\r\nimport { IVirtualListStickyMap } from \"../models\";\r\n\r\nexport const TRACK_BOX_CHANGE_EVENT_NAME = 'change';\r\n\r\nexport interface IMetrics {\r\n delta: number;\r\n normalizedItemWidth: number;\r\n normalizedItemHeight: number;\r\n width: number;\r\n height: number;\r\n dynamicSize: boolean;\r\n itemSize: number;\r\n itemsFromStartToScrollEnd: number;\r\n itemsFromStartToDisplayEnd: number;\r\n itemsOnDisplay: number;\r\n itemsOnDisplayLength: number;\r\n isVertical: boolean;\r\n leftHiddenItemsWeight: number;\r\n leftItemLength: number;\r\n leftItemsWeight: number;\r\n renderItems: number;\r\n rightItemLength: number;\r\n rightItemsWeight: number;\r\n scrollSize: number;\r\n leftSizeOfAddedItems: number;\r\n sizeProperty: typeof HEIGHT_PROP_NAME | typeof WIDTH_PROP_NAME;\r\n snap: boolean;\r\n snippedPos: number;\r\n startIndex: number;\r\n startPosition: number;\r\n totalItemsToDisplayEndWeight: number;\r\n totalLength: number;\r\n totalSize: number;\r\n typicalItemSize: number;\r\n}\r\n\r\nexport interface IRecalculateMetricsOptions<I extends { id: Id }, C extends Array<I>> {\r\n bounds: ISize;\r\n collection: C;\r\n isVertical: boolean;\r\n itemSize: number;\r\n itemsOffset: number;\r\n dynamicSize: boolean;\r\n scrollSize: number;\r\n snap: boolean;\r\n enabledBufferOptimization: boolean;\r\n fromItemId?: Id;\r\n previousTotalSize: number;\r\n crudDetected: boolean;\r\n deletedItemsMap: { [index: number]: ISize; };\r\n}\r\n\r\nexport interface IGetItemPositionOptions<I extends { id: Id }, C extends Array<I>>\r\n extends Omit<IRecalculateMetricsOptions<I, C>, 'previousTotalSize' | 'crudDetected' | 'deletedItemsMap'> { }\r\n\r\nexport interface IUpdateCollectionOptions<I extends { id: Id }, C extends Array<I>>\r\n extends Omit<IRecalculateMetricsOptions<I, C>, 'collection' | 'previousTotalSize' | 'crudDetected' | 'deletedItemsMap'> { }\r\n\r\ntype CacheMapEvents = typeof TRACK_BOX_CHANGE_EVENT_NAME;\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\nenum ItemDisplayMethods {\r\n CREATE,\r\n UPDATE,\r\n DELETE,\r\n NOT_CHANGED,\r\n}\r\n\r\ninterface IUpdateCollectionReturns {\r\n displayItems: IRenderVirtualListCollection;\r\n totalSize: number;\r\n delta: number;\r\n crudDetected: boolean;\r\n}\r\n\r\n/**\r\n * An object that performs tracking, calculations and caching.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/trackBox.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class TrackBox extends CacheMap<Id, ISize & { method?: ItemDisplayMethods }, CacheMapEvents, CacheMapListeners> {\r\n protected _tracker!: Tracker<IRenderVirtualListItem, NgVirtualListItemComponent>;\r\n\r\n protected _items: IRenderVirtualListCollection | null | undefined;\r\n\r\n set items(v: IRenderVirtualListCollection | null | undefined) {\r\n if (this._items === v) {\r\n return;\r\n }\r\n\r\n this._items = v;\r\n }\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined;\r\n\r\n set displayComponents(v: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined) {\r\n if (this._displayComponents === v) {\r\n return;\r\n }\r\n\r\n this._displayComponents = v;\r\n }\r\n\r\n /**\r\n * Set the trackBy property\r\n */\r\n set trackingPropertyName(v: string) {\r\n this._tracker.trackingPropertyName = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n super();\r\n\r\n this._tracker = new Tracker(trackingPropertyName);\r\n }\r\n\r\n override set(id: Id, bounds: ISize): CMap<Id, ISize> {\r\n if (this._map.has(id)) {\r\n const b = this._map.get(id);\r\n if (b?.width === bounds.width && b.height === bounds.height) {\r\n return this._map;\r\n }\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n return v;\r\n }\r\n\r\n private _previousCollection: Array<{ id: Id; }> | null | undefined;\r\n\r\n private _deletedItemsMap: { [index: number]: ISize } = {};\r\n\r\n private _crudDetected = false;\r\n get crudDetected() { return this._crudDetected; }\r\n\r\n protected override fireChangeIfNeed() {\r\n if (this.changesDetected()) {\r\n this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, this._version);\r\n }\r\n }\r\n\r\n private _previousTotalSize = 0;\r\n\r\n protected _scrollDelta: number = 0;\r\n get scrollDelta() { return this._scrollDelta; }\r\n\r\n protected override lifeCircle() {\r\n this.fireChangeIfNeed();\r\n\r\n this.lifeCircleDo();\r\n }\r\n\r\n /**\r\n * Scans the collection for deleted items and flushes the deleted item cache.\r\n */\r\n resetCollection<I extends { id: Id; }, C extends Array<I>>(currentCollection: C | null | undefined, itemSize: number): void {\r\n if (currentCollection !== undefined && currentCollection !== null && currentCollection === this._previousCollection) {\r\n console.warn('Attention! The collection must be immutable.');\r\n return;\r\n }\r\n\r\n this.updateCache(this._previousCollection, currentCollection, itemSize);\r\n\r\n this._previousCollection = currentCollection;\r\n }\r\n\r\n /**\r\n * Update the cache of items from the list\r\n */\r\n protected updateCache<I extends { id: Id; }, C extends Array<I>>(previousCollection: C | null | undefined, currentCollection: C | null | undefined,\r\n itemSize: number): void {\r\n let crudDetected = false;\r\n\r\n if (!currentCollection || currentCollection.length === 0) {\r\n if (previousCollection) {\r\n // deleted\r\n for (let i = 0, l = previousCollection.length; i < l; i++) {\r\n const item = previousCollection[i], id = item.id;\r\n crudDetected = true;\r\n if (this._map.has(id)) {\r\n this._map.delete(id);\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n if (!previousCollection || previousCollection.length === 0) {\r\n if (currentCollection) {\r\n // added\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n crudDetected = true;\r\n const item = currentCollection[i], id = item.id;\r\n this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });\r\n }\r\n }\r\n return;\r\n }\r\n const collectionDict: { [id: Id]: I } = {};\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n const item = currentCollection[i];\r\n if (item) {\r\n collectionDict[item.id] = item;\r\n }\r\n }\r\n const notChangedMap: { [id: Id]: I } = {}, deletedMap: { [id: Id]: I } = {}, deletedItemsMap: { [index: number]: ISize } = {}, updatedMap: { [id: Id]: I } = {};\r\n for (let i = 0, l = previousCollection.length; i < l; i++) {\r\n const item = previousCollection[i], id = item.id;\r\n if (item) {\r\n if (collectionDict.hasOwnProperty(id)) {\r\n if (item === collectionDict[id]) {\r\n // not changed\r\n notChangedMap[item.id] = item;\r\n this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.NOT_CHANGED });\r\n continue;\r\n } else {\r\n // updated\r\n crudDetected = true;\r\n updatedMap[item.id] = item;\r\n this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.UPDATE });\r\n continue;\r\n }\r\n }\r\n\r\n // deleted\r\n crudDetected = true;\r\n deletedMap[item.id] = item;\r\n deletedItemsMap[i] = this._map.get(item.id);\r\n this._map.delete(id);\r\n }\r\n }\r\n\r\n for (let i = 0, l = currentCollection.length; i < l; i++) {\r\n const item = currentCollection[i], id = item.id;\r\n if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) && !notChangedMap.hasOwnProperty(id)) {\r\n // added\r\n crudDetected = true;\r\n this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });\r\n }\r\n }\r\n this._crudDetected = crudDetected;\r\n this._deletedItemsMap = deletedItemsMap;\r\n }\r\n\r\n /**\r\n * Finds the position of a collection element by the given Id\r\n */\r\n getItemPosition<I extends { id: Id }, C extends Array<I>>(id: Id, stickyMap: IVirtualListStickyMap,\r\n options: IGetItemPositionOptions<I, C>): number {\r\n const opt = { fromItemId: id, stickyMap, ...options };\r\n const { scrollSize } = this.recalculateMetrics({\r\n ...opt,\r\n dynamicSize: this._crudDetected || opt.dynamicSize,\r\n previousTotalSize: this._previousTotalSize,\r\n crudDetected: this._crudDetected,\r\n deletedItemsMap: this._deletedItemsMap,\r\n });\r\n return scrollSize;\r\n }\r\n\r\n /**\r\n * Updates the collection of display objects\r\n */\r\n updateCollection<I extends { id: Id }, C extends Array<I>>(items: C, stickyMap: IVirtualListStickyMap,\r\n options: IUpdateCollectionOptions<I, C>): IUpdateCollectionReturns {\r\n const opt = { stickyMap, ...options }, crudDetected = this._crudDetected, deletedItemsMap = this._deletedItemsMap;\r\n if (opt.dynamicSize) {\r\n this.cacheElements();\r\n }\r\n\r\n const metrics = this.recalculateMetrics({\r\n ...opt,\r\n collection: items,\r\n previousTotalSize: this._previousTotalSize,\r\n crudDetected: this._crudDetected,\r\n deletedItemsMap,\r\n });\r\n\r\n this._delta += metrics.delta;\r\n\r\n this._previousTotalSize = metrics.totalSize;\r\n\r\n this._deletedItemsMap = {};\r\n\r\n this._crudDetected = false;\r\n\r\n if (opt.dynamicSize) {\r\n this.snapshot();\r\n }\r\n\r\n const displayItems = this.generateDisplayCollection(items, stickyMap, { ...metrics, });\r\n return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected };\r\n }\r\n\r\n /**\r\n * Finds the closest element in the collection by scrollSize\r\n */\r\n getNearestItem<I extends { id: Id }, C extends Array<I>>(scrollSize: number, items: C, itemSize: number, isVertical: boolean): I | undefined {\r\n return this.getElementFromStart(scrollSize, items, this._map, itemSize, isVertical);\r\n }\r\n\r\n /**\r\n * Calculates the position of an element based on the given scrollSize\r\n */\r\n private getElementFromStart<I extends { id: Id }, C extends Array<I>>(scrollSize: number, collection: C, map: CMap<Id, ISize>, typicalItemSize: number,\r\n isVertical: boolean): I | undefined {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;\r\n let offset = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const item = collection[i];\r\n let itemSize = 0;\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n itemSize = typicalItemSize;\r\n }\r\n if (offset > scrollSize) {\r\n return item;\r\n }\r\n offset += itemSize;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Calculates the entry into the overscroll area and returns the number of overscroll elements\r\n */\r\n private getElementNumToEnd<I extends { id: Id }, C extends Array<I>>(i: number, collection: C, map: CMap<Id, ISize>, typicalItemSize: number,\r\n size: number, isVertical: boolean, indexOffset: number = 0): { num: number, offset: number } {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;\r\n let offset = 0, num = 0;\r\n for (let j = collection.length - indexOffset - 1; j >= i; j--) {\r\n const item = collection[j];\r\n let itemSize = 0;\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n itemSize = typicalItemSize;\r\n }\r\n offset += itemSize;\r\n num++;\r\n if (offset > size) {\r\n return { num: 0, offset };\r\n }\r\n }\r\n return { num, offset };\r\n }\r\n\r\n /**\r\n * Calculates list metrics\r\n */\r\n protected recalculateMetrics<I extends { id: Id }, C extends Array<I>>(options: IRecalculateMetricsOptions<I, C>): IMetrics {\r\n const { fromItemId, bounds, collection, dynamicSize, isVertical, itemSize,\r\n itemsOffset, scrollSize, snap, stickyMap, enabledBufferOptimization,\r\n previousTotalSize, crudDetected, deletedItemsMap } = options as IRecalculateMetricsOptions<I, C> & {\r\n stickyMap: IVirtualListStickyMap,\r\n };\r\n\r\n const { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width,\r\n totalLength = collection.length, typicalItemSize = itemSize,\r\n w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height,\r\n map = this._map, snapshot = this._snapshot,\r\n checkOverscrollItemsLimit = Math.ceil(size / typicalItemSize),\r\n snippedPos = Math.floor(scrollSize),\r\n leftItemsWeights: Array<number> = [],\r\n isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)\r\n || (typeof fromItemId === 'string' && fromItemId > '-1');\r\n\r\n let leftItemsOffset = 0, rightItemsOffset = 0;\r\n if (enabledBufferOptimization) {\r\n switch (this.scrollDirection) {\r\n case 1: {\r\n leftItemsOffset = 0;\r\n rightItemsOffset = itemsOffset;\r\n break;\r\n }\r\n case -1: {\r\n leftItemsOffset = itemsOffset;\r\n rightItemsOffset = 0;\r\n break;\r\n }\r\n case 0:\r\n default: {\r\n leftItemsOffset = rightItemsOffset = itemsOffset;\r\n }\r\n }\r\n } else {\r\n leftItemsOffset = rightItemsOffset = itemsOffset;\r\n }\r\n\r\n let itemsFromStartToScrollEnd: number = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1,\r\n leftItemLength = 0, rightItemLength = 0,\r\n leftItemsWeight = 0, rightItemsWeight = 0,\r\n leftHiddenItemsWeight = 0,\r\n totalItemsToDisplayEndWeight = 0,\r\n leftSizeOfAddedItems = 0,\r\n leftSizeOfUpdatedItems = 0,\r\n leftSizeOfDeletedItems = 0,\r\n itemById: I | undefined = undefined,\r\n itemByIdPos: number = 0,\r\n targetDisplayItemIndex: number = -1,\r\n isTargetInOverscroll: boolean = false,\r\n actualScrollSize = itemByIdPos,\r\n totalSize = 0,\r\n startIndex;\r\n\r\n // If the list is dynamic or there are new elements in the collection, then it switches to the long algorithm.\r\n if (dynamicSize) {\r\n let y = 0, stickyCollectionItem: I | undefined = undefined, stickyComponentSize = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const ii = i + 1, collectionItem = collection[i], id = collectionItem.id;\r\n\r\n let componentSize = 0, componentSizeDelta = 0, itemDisplayMethod: ItemDisplayMethods = ItemDisplayMethods.NOT_CHANGED;\r\n if (map.has(id)) {\r\n const bounds = map.get(id) || { width: typicalItemSize, height: typicalItemSize };\r\n componentSize = bounds[sizeProperty];\r\n itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.UPDATE: {\r\n const snapshotBounds = snapshot.get(id);\r\n const componentSnapshotSize = componentSize - (snapshotBounds ? snapshotBounds[sizeProperty] : typicalItemSize);\r\n componentSizeDelta = componentSnapshotSize;\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n break;\r\n }\r\n case ItemDisplayMethods.CREATE: {\r\n componentSizeDelta = typicalItemSize;\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this._deletedItemsMap.hasOwnProperty(i)) {\r\n const bounds = this._deletedItemsMap[i], size = bounds[sizeProperty] ?? typicalItemSize;\r\n if (y < scrollSize - size) {\r\n leftSizeOfDeletedItems += size;\r\n }\r\n }\r\n\r\n totalSize += componentSize;\r\n\r\n if (isFromId) {\r\n if (itemById === undefined) {\r\n if (id !== fromItemId && stickyMap && stickyMap[id] > 0) {\r\n stickyComponentSize = componentSize;\r\n stickyCollectionItem = collectionItem;\r\n }\r\n\r\n if (id === fromItemId) {\r\n targetDisplayItemIndex = i;\r\n if (stickyCollectionItem && stickyMap) {\r\n const { num } = this.getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical);\r\n if (num > 0) {\r\n isTargetInOverscroll = true;\r\n y -= size - componentSize;\r\n } else {\r\n if (stickyMap && !stickyMap[collectionItem.id] && y >= scrollSize && y < scrollSize + stickyComponentSize) {\r\n const snappedY = scrollSize - stickyComponentSize;\r\n leftHiddenItemsWeight -= (snappedY - y);\r\n y = snappedY;\r\n } else {\r\n y -= stickyComponentSize;\r\n leftHiddenItemsWeight -= stickyComponentSize;\r\n }\r\n }\r\n }\r\n itemById = collectionItem;\r\n itemByIdPos = y;\r\n } else {\r\n leftItemsWeights.push(componentSize);\r\n leftHiddenItemsWeight += componentSize;\r\n itemsFromStartToScrollEnd = ii;\r\n }\r\n }\r\n } else if (y <= scrollSize - componentSize) {\r\n leftItemsWeights.push(componentSize);\r\n leftHiddenItemsWeight += componentSize;\r\n itemsFromStartToScrollEnd = ii;\r\n }\r\n\r\n if (isFromId) {\r\n if (itemById === undefined || y < itemByIdPos + size + componentSize) {\r\n itemsFromStartToDisplayEnd = ii;\r\n totalItemsToDisplayEndWeight += componentSize;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;\r\n }\r\n } else if (y <= scrollSize + size + componentSize) {\r\n itemsFromStartToDisplayEnd = ii;\r\n totalItemsToDisplayEndWeight += componentSize;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;\r\n\r\n if (y <= scrollSize - componentSize) {\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.CREATE: {\r\n leftSizeOfAddedItems += componentSizeDelta;\r\n break;\r\n }\r\n case ItemDisplayMethods.UPDATE: {\r\n leftSizeOfUpdatedItems += componentSizeDelta;\r\n break;\r\n }\r\n case ItemDisplayMethods.DELETE: {\r\n leftSizeOfDeletedItems += componentSizeDelta;\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n if (i < itemsFromDisplayEndToOffsetEnd) {\r\n rightItemsWeight += componentSize;\r\n }\r\n }\r\n\r\n y += componentSize;\r\n }\r\n\r\n if (isTargetInOverscroll) {\r\n const { num } = this.getElementNumToEnd(\r\n collection.length - (checkOverscrollItemsLimit < 0 ? 0 : collection.length - checkOverscrollItemsLimit),\r\n collection, map, typicalItemSize, size, isVertical, collection.length - (collection.length - (targetDisplayItemIndex + 1)),\r\n );\r\n if (num > 0) {\r\n itemsFromStartToScrollEnd -= num;\r\n }\r\n }\r\n\r\n if (itemsFromStartToScrollEnd <= -1) {\r\n itemsFromStartToScrollEnd = 0;\r\n }\r\n if (itemsFromStartToDisplayEnd <= -1) {\r\n itemsFromStartToDisplayEnd = 0;\r\n }\r\n actualScrollSize = isFromId ? itemByIdPos : scrollSize;\r\n\r\n leftItemsWeights.splice(0, leftItemsWeights.length - leftItemsOffset);\r\n leftItemsWeights.forEach(v => {\r\n leftItemsWeight += v;\r\n });\r\n\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;\r\n\r\n } else\r\n // Buffer optimization does not work on fast linear algorithm\r\n {\r\n if (crudDetected) {\r\n let y = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const collectionItem = collection[i], id = collectionItem.id;\r\n let componentSize = typicalItemSize, itemDisplayMethod: ItemDisplayMethods = ItemDisplayMethods.NOT_CHANGED;\r\n if (map.has(id)) {\r\n const bounds = map.get(id)!;\r\n itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;\r\n if (itemDisplayMethod === ItemDisplayMethods.CREATE) {\r\n map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });\r\n }\r\n }\r\n\r\n if (this._deletedItemsMap.hasOwnProperty(i)) {\r\n const bounds = this._deletedItemsMap[i], size = bounds[sizeProperty] ?? typicalItemSize;\r\n if (y < scrollSize - size) {\r\n leftSizeOfDeletedItems += size;\r\n }\r\n }\r\n\r\n if (y < scrollSize - componentSize) {\r\n switch (itemDisplayMethod) {\r\n case ItemDisplayMethods.CREATE: {\r\n leftSizeOfUpdatedItems += componentSize;\r\n break;\r\n }\r\n case ItemDisplayMethods.UPDATE: {\r\n leftSizeOfUpdatedItems += componentSize;\r\n break;\r\n }\r\n case ItemDisplayMethods.DELETE: {\r\n leftSizeOfDeletedItems += componentSize;\r\n break;\r\n }\r\n }\r\n }\r\n y += componentSize;\r\n }\r\n }\r\n itemsFromStartToScrollEnd = Math.floor(scrollSize / typicalItemSize);\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n leftItemsWeight = leftItemLength * typicalItemSize;\r\n rightItemsWeight = rightItemLength * typicalItemSize,\r\n leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;\r\n totalSize = totalLength * typicalItemSize;\r\n\r\n const k = totalSize !== 0 ? previousTotalSize / totalSize : 0;\r\n actualScrollSize = scrollSize * k;\r\n }\r\n startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);\r\n\r\n const itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight,\r\n itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd,\r\n startPosition = leftHiddenItemsWeight - leftItemsWeight,\r\n renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength,\r\n delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems;\r\n\r\n const metrics: IMetrics = {\r\n delta,\r\n normalizedItemWidth: w,\r\n normalizedItemHeight: h,\r\n width,\r\n height,\r\n dynamicSize,\r\n itemSize,\r\n itemsFromStartToScrollEnd,\r\n itemsFromStartToDisplayEnd,\r\n itemsOnDisplay,\r\n itemsOnDisplayLength,\r\n isVertical,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n renderItems,\r\n rightItemLength,\r\n rightItemsWeight,\r\n scrollSize: actualScrollSize,\r\n leftSizeOfAddedItems,\r\n sizeProperty,\r\n snap,\r\n snippedPos,\r\n startIndex,\r\n startPosition,\r\n totalItemsToDisplayEndWeight,\r\n totalLength,\r\n totalSize,\r\n typicalItemSize,\r\n };\r\n\r\n return metrics;\r\n }\r\n\r\n clearDeltaDirection() {\r\n this.clearScrollDirectionCache();\r\n }\r\n\r\n clearDelta(clearDirectionDetector = false): void {\r\n this._delta = 0;\r\n\r\n if (clearDirectionDetector) {\r\n this.clearScrollDirectionCache();\r\n }\r\n }\r\n\r\n changes(): void {\r\n this.bumpVersion();\r\n }\r\n\r\n protected generateDisplayCollection<I extends { id: Id }, C extends Array<I>>(items: C, stickyMap: IVirtualListStickyMap,\r\n metrics: IMetrics): IRenderVirtualListCollection {\r\n const {\r\n normalizedItemWidth,\r\n normalizedItemHeight,\r\n dynamicSize,\r\n itemsFromStartToScrollEnd,\r\n isVertical,\r\n renderItems: renderItemsLength,\r\n scrollSize,\r\n sizeProperty,\r\n snap,\r\n snippedPos,\r\n startPosition,\r\n totalLength,\r\n startIndex,\r\n typicalItemSize,\r\n } = metrics,\r\n displayItems: IRenderVirtualListCollection = [];\r\n if (items.length) {\r\n const actualSnippedPosition = snippedPos;\r\n let pos = startPosition,\r\n renderItems = renderItemsLength,\r\n stickyItem: IRenderVirtualListItem | undefined, nextSticky: IRenderVirtualListItem | undefined, stickyItemIndex = -1,\r\n stickyItemSize = 0;\r\n\r\n if (snap) {\r\n for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? itemsFromStartToScrollEnd : 0, totalLength - 1); i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id], size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;\r\n if (sticky > 0) {\r\n const measures = {\r\n x: isVertical ? 0 : actualSnippedPosition,\r\n y: isVertical ? actualSnippedPosition : 0,\r\n width: normalizedItemWidth,\r\n height: normalizedItemHeight,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n snapped: true,\r\n snappedOut: false,\r\n dynamic: dynamicSize,\r\n };\r\n\r\n const itemData: I = items[i];\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n stickyItemIndex = i;\r\n stickyItemSize = size;\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex;\r\n\r\n while (renderItems > 0) {\r\n if (i >= totalLength) {\r\n break;\r\n }\r\n\r\n const id = items[i].id, size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;\r\n\r\n if (id !== stickyItem?.id) {\r\n const snapped = snap && stickyMap[id] > 0 && pos <= scrollSize,\r\n measures = {\r\n x: isVertical ? 0 : pos,\r\n y: isVertical ? pos : 0,\r\n width: normalizedItemWidth,\r\n height: normalizedItemHeight,\r\n }, config = {\r\n isVertical,\r\n sticky: stickyMap[id],\r\n snap,\r\n snapped: false,\r\n snappedOut: false,\r\n dynamic: dynamicSize,\r\n };\r\n\r\n const itemData: I = items[i];\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyItemIndex < i && stickyMap[id] > 0 && pos <= scrollSize + size + stickyItemSize) {\r\n item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;\r\n item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;\r\n nextSticky = item;\r\n nextSticky.config.snapped = snapped;\r\n }\r\n\r\n displayItems.push(item);\r\n }\r\n\r\n renderItems -= 1;\r\n pos += size;\r\n i++;\r\n }\r\n\r\n const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;\r\n\r\n if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {\r\n if (nextSticky.measures[axis] > scrollSize) {\r\n stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;\r\n stickyItem.config.snapped = nextSticky.config.snapped = false;\r\n stickyItem.config.snappedOut = true;\r\n stickyItem.config.sticky = 1;\r\n } else {\r\n nextSticky.config.snapped = true;\r\n }\r\n }\r\n }\r\n return displayItems;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(): void {\r\n if (!this._items || !this._displayComponents) {\r\n return;\r\n }\r\n\r\n this._tracker.track(this._items, this._displayComponents, this.scrollDirection);\r\n }\r\n\r\n setDisplayObjectIndexMapById(v: { [id: number]: number }): void {\r\n this._tracker.displayObjectIndexMapById = v;\r\n }\r\n\r\n untrackComponentByIdProperty(component?: NgVirtualListItemComponent | undefined) {\r\n this._tracker.untrackComponentByIdProperty(component);\r\n }\r\n\r\n getItemBounds(id: Id): ISize | undefined {\r\n if (this.has(id)) {\r\n return this.get(id);\r\n }\r\n return undefined;\r\n }\r\n\r\n protected cacheElements(): void {\r\n if (!this._displayComponents) {\r\n return;\r\n }\r\n\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const component = this._displayComponents[i], itemId = component.instance.itemId;\r\n if (itemId === undefined) {\r\n continue;\r\n }\r\n const bounds = component.instance.getBounds();\r\n this.set(itemId, bounds);\r\n }\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n if (this._tracker) {\r\n this._tracker.dispose();\r\n }\r\n }\r\n}\r\n","import { IScrollEvent, ScrollDirection } from \"../models\";\r\n\r\ninterface IScrollEventParams {\r\n direction: ScrollDirection;\r\n container: HTMLElement;\r\n list: HTMLElement;\r\n delta: number;\r\n scrollDelta: number;\r\n isVertical: boolean;\r\n}\r\n\r\n/**\r\n * Scroll event.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/utils/scrollEvent.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class ScrollEvent implements IScrollEvent {\r\n private _direction: ScrollDirection = 1;\r\n get direction() { return this._direction; }\r\n\r\n private _scrollSize: number = 0;\r\n get scrollSize() { return this._scrollSize; }\r\n\r\n private _scrollWeight: number = 0;\r\n get scrollWeight() { return this._scrollWeight; }\r\n\r\n private _isVertical: boolean = true;\r\n get isVertical() { return this._isVertical; }\r\n\r\n private _listSize: number = 0;\r\n get listSize() { return this._listSize; }\r\n\r\n private _size: number = 0;\r\n get size() { return this._size; }\r\n\r\n private _isStart: boolean = true;\r\n get isStart() { return this._isStart; }\r\n\r\n private _isEnd: boolean = false;\r\n get isEnd() { return this._isEnd; }\r\n\r\n private _delta: number = 0;\r\n get delta() { return this._delta; }\r\n\r\n private _scrollDelta: number = 0;\r\n get scrollDelta() { return this._scrollDelta; }\r\n\r\n constructor(params: IScrollEventParams) {\r\n const { direction, isVertical, container, list, delta, scrollDelta } = params;\r\n this._direction = direction;\r\n this._isVertical = isVertical;\r\n this._scrollSize = isVertical ? container.scrollTop : container.scrollLeft;\r\n this._scrollWeight = isVertical ? container.scrollHeight : container.scrollWidth;\r\n this._listSize = isVertical ? list.offsetHeight : list.offsetWidth;\r\n this._size = isVertical ? container.offsetHeight : container.offsetWidth;\r\n this._isEnd = (this._scrollSize + this._size) === this._scrollWeight;\r\n this._delta = delta;\r\n this._scrollDelta = scrollDelta;\r\n this._isStart = this._scrollSize === 0;\r\n }\r\n}","import {\r\n AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, inject, input,\r\n OnDestroy, output, signal, TemplateRef, ViewChild, viewChild, ViewContainerRef, ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, Observable, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport {\r\n BEHAVIOR_AUTO, BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE,\r\n DEFAULT_ENABLED_BUFFER_OPTIMIZATION, DEFAULT_ITEM_SIZE, DEFAULT_ITEMS_OFFSET, DEFAULT_SNAP, HEIGHT_PROP_NAME, LEFT_PROP_NAME,\r\n MAX_SCROLL_TO_ITERATIONS, PX, SCROLL, SCROLL_END, TOP_PROP_NAME, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME,\r\n} from './const';\r\nimport { IScrollEvent, IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\nimport { Id, ISize } from './types';\r\nimport { IRenderVirtualListCollection } from './models/render-collection.model';\r\nimport { Direction, Directions } from './enums';\r\nimport { ScrollEvent, TrackBox, isDirection, toggleClassName } from './utils';\r\nimport { IGetItemPositionOptions, IUpdateCollectionOptions, TRACK_BOX_CHANGE_EVENT_NAME } from './utils/trackBox';\r\n\r\n/**\r\n * Virtual list component.\r\n * Maximum performance for extremely large lists.\r\n * It is based on algorithms for virtualization of screen objects.\r\n * @link https://github.com/DjonnyX/ng-virtual-list/blob/17.x/projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list',\r\n standalone: false,\r\n templateUrl: './ng-virtual-list.component.html',\r\n styleUrl: './ng-virtual-list.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n})\r\nexport class NgVirtualListComponent implements AfterViewInit, OnDestroy {\r\n private static __nextId: number = 0;\r\n\r\n private _id: number = NgVirtualListComponent.__nextId;\r\n /**\r\n * Readonly. Returns the unique identifier of the component.\r\n */\r\n get id() { return this._id; }\r\n\r\n @ViewChild('renderersContainer', { read: ViewContainerRef })\r\n protected _listContainerRef: ViewContainerRef | undefined;\r\n\r\n protected _container = viewChild<ElementRef<HTMLDivElement>>('container');\r\n\r\n protected _list = viewChild<ElementRef<HTMLUListElement>>('list');\r\n\r\n /**\r\n * Fires when the list has been scrolled.\r\n */\r\n onScroll = output<IScrollEvent>();\r\n\r\n /**\r\n * Fires when the list has completed scrolling.\r\n */\r\n onScrollEnd = output<IScrollEvent>();\r\n\r\n private _itemsOptions = {\r\n transform: (v: IVirtualListCollection | undefined) => {\r\n this._trackBox.resetCollection(v, this.itemSize());\r\n return v;\r\n },\r\n } as any;\r\n\r\n /**\r\n * Collection of list items.\r\n */\r\n items = input.required<IVirtualListCollection>({\r\n ...this._itemsOptions,\r\n });\r\n\r\n /**\r\n * Determines whether elements will snap. Default value is \"true\".\r\n */\r\n snap = input<boolean>(DEFAULT_SNAP);\r\n\r\n /**\r\n * Experimental!\r\n * Enables buffer optimization.\r\n * Can only be used if items in the collection are not added or updated. Otherwise, artifacts in the form of twitching of the scroll area are possible.\r\n * Works only if the property dynamic = true\r\n */\r\n enabledBufferOptimization = input<boolean>(DEFAULT_ENABLED_BUFFER_OPTIMIZATION);\r\n\r\n /**\r\n * Rendering element template.\r\n */\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n /**\r\n * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,\r\n * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.\r\n */\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n private _itemSizeOptions = {\r\n transform: (v: number | undefined) => {\r\n if (v === undefined) {\r\n return DEFAULT_ITEM_SIZE;\r\n }\r\n const val = Number(v);\r\n return Number.isNaN(val) || val <= 0 ? DEFAULT_ITEM_SIZE : val;\r\n },\r\n } as any;\r\n\r\n /**\r\n * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.\r\n * Ignored if the dynamicSize property is true.\r\n */\r\n itemSize = input<number>(DEFAULT_ITEM_SIZE, { ...this._itemSizeOptions });\r\n\r\n /**\r\n * If true then the items in the list can have different sizes and the itemSize property is ignored.\r\n * If false then the items in the list have a fixed size specified by the itemSize property. The default value is false.\r\n */\r\n dynamicSize = input(DEFAULT_DYNAMIC_SIZE);\r\n\r\n /**\r\n * Determines the direction in which elements are placed. Default value is \"vertical\".\r\n */\r\n direction = input<Direction>(DEFAULT_DIRECTION);\r\n\r\n /**\r\n * Number of elements outside the scope of visibility. Default value is 2.\r\n */\r\n itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e?: Event) => {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n const container = this._container()?.nativeElement;\r\n if (container) {\r\n const scrollSize = (this._isVertical ? container.scrollTop : container.scrollLeft),\r\n actualScrollSize = scrollSize;\r\n this._scrollSize.set(actualScrollSize);\r\n }\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLDivElement>);\r\n\r\n private _initialized!: WritableSignal<boolean>;\r\n\r\n readonly $initialized!: Observable<boolean>;\r\n\r\n /**\r\n * The name of the property by which tracking is performed\r\n */\r\n trackBy = input<string>(TRACK_BY_PROPERTY_NAME);\r\n\r\n /**\r\n * Dictionary of element sizes by their id\r\n */\r\n private _trackBox = new TrackBox(this.trackBy());\r\n\r\n private _onTrackBoxChangeHandler = (v: number) => {\r\n this._$cacheVersion.next(v);\r\n }\r\n\r\n private _$cacheVersion = new BehaviorSubject<number>(-1);\r\n get $cacheVersion() { return this._$cacheVersion.asObservable(); }\r\n\r\n constructor() {\r\n NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListComponent.__nextId + 1;\r\n this._id = NgVirtualListComponent.__nextId;\r\n\r\n this._initialized = signal<boolean>(false);\r\n this.$initialized = toObservable(this._initialized);\r\n\r\n this._trackBox.displayComponents = this._displayComponents;\r\n\r\n const $trackBy = toObservable(this.trackBy);\r\n\r\n $trackBy.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._trackBox.trackingPropertyName = v;\r\n }),\r\n ).subscribe();\r\n\r\n const $bounds = toObservable(this._bounds).pipe(\r\n filter(b => !!b),\r\n ), $items = toObservable(this.items).pipe(\r\n map(i => !i ? [] : i),\r\n ), $scrollSize = toObservable(this._scrollSize),\r\n $itemSize = toObservable(this.itemSize).pipe(\r\n map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v),\r\n ),\r\n $itemsOffset = toObservable(this.itemsOffset).pipe(\r\n map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v),\r\n ),\r\n $stickyMap = toObservable(this.stickyMap).pipe(\r\n map(v => !v ? {} : v),\r\n ),\r\n $snap = toObservable(this.snap),\r\n $isVertical = toObservable(this.direction).pipe(\r\n map(v => this.getIsVertical(v || DEFAULT_DIRECTION)),\r\n ),\r\n $dynamicSize = toObservable(this.dynamicSize),\r\n $enabledBufferOptimization = toObservable(this.enabledBufferOptimization),\r\n $cacheVersion = this.$cacheVersion;\r\n\r\n $isVertical.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? CLASS_LIST_VERTICAL : CLASS_LIST_HORIZONTAL, true);\r\n }),\r\n ).subscribe();\r\n\r\n $dynamicSize.pipe(\r\n takeUntilDestroyed(),\r\n tap(dynamicSize => {\r\n this.listenCacheChangesIfNeed(dynamicSize);\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([this.$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,\r\n $itemsOffset, $snap, $isVertical, $dynamicSize, $enabledBufferOptimization, $cacheVersion,\r\n ]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n switchMap(([,\r\n bounds, items, stickyMap, scrollSize, itemSize,\r\n itemsOffset, snap, isVertical, dynamicSize, enabledBufferOptimization, cacheVersion,\r\n ]) => {\r\n const { width, height } = bounds as DOMRect;\r\n let actualScrollSize = (this._isVertical ? this._container()?.nativeElement.scrollTop ?? 0 : this._container()?.nativeElement.scrollLeft) ?? 0;\r\n const opts: IUpdateCollectionOptions<IVirtualListItem, IVirtualListCollection> = {\r\n bounds: { width, height }, dynamicSize, isVertical, itemSize,\r\n itemsOffset, scrollSize: scrollSize, snap, enabledBufferOptimization,\r\n };\r\n const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {\r\n ...opts, scrollSize: actualScrollSize,\r\n });\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n\r\n this.tracking();\r\n\r\n const container = this._container();\r\n\r\n if (container) {\r\n const delta = this._trackBox.delta;\r\n actualScrollSize = actualScrollSize + delta;\r\n\r\n this._trackBox.clearDelta();\r\n\r\n if (scrollSize !== actualScrollSize) {\r\n const params: ScrollToOptions = {\r\n [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,\r\n behavior: BEHAVIOR_INSTANT\r\n };\r\n\r\n container.nativeElement.scrollTo(params);\r\n }\r\n }\r\n\r\n return of(displayItems);\r\n }),\r\n ).subscribe();\r\n\r\n combineLatest([this.$initialized, toObservable(this.itemRenderer)]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, itemRenderer]) => {\r\n this.resetRenderers(itemRenderer);\r\n })\r\n )\r\n }\r\n\r\n ngOnInit() {\r\n this._initialized.set(true);\r\n }\r\n\r\n private listenCacheChangesIfNeed(value: boolean) {\r\n if (value) {\r\n if (!this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.addEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n } else {\r\n if (this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.removeEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n }\r\n }\r\n\r\n private getIsVertical(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private _componentsResizeObserver = new ResizeObserver(() => {\r\n this._trackBox.changes();\r\n });\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n this._trackBox.setDisplayObjectIndexMapById({});\r\n return;\r\n }\r\n\r\n this._trackBox.items = displayItems;\r\n\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n const maxLength = displayItems.length, components = this._displayComponents;\r\n\r\n while (components.length < maxLength) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n components.push(comp);\r\n\r\n this._componentsResizeObserver.observe(comp.instance.element);\r\n }\r\n }\r\n\r\n this.resetRenderers();\r\n }\r\n\r\n private resetRenderers(itemRenderer?: TemplateRef<HTMLElement>) {\r\n const doMap: { [id: number]: number } = {};\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const item = this._displayComponents[i];\r\n item.instance.renderer = itemRenderer || this.itemRenderer();\r\n doMap[item.instance.id] = i;\r\n }\r\n\r\n this._trackBox.setDisplayObjectIndexMapById(doMap);\r\n }\r\n\r\n /**\r\n * Tracking by id\r\n */\r\n protected tracking() {\r\n this._trackBox.track();\r\n }\r\n\r\n private resetBoundsSize(isVertical: boolean, totalSize: number) {\r\n const l = this._list();\r\n if (l) {\r\n l.nativeElement.style[isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME] = `${totalSize}${PX}`;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the bounds of an element with a given id\r\n */\r\n getItemBounds(id: Id): ISize | undefined {\r\n return this._trackBox.getItemBounds(id);\r\n }\r\n\r\n /**\r\n * The method scrolls the list to the element with the given id and returns the value of the scrolled area.\r\n * Behavior accepts the values ​​\"auto\", \"instant\" and \"smooth\".\r\n */\r\n scrollTo(id: Id, behavior: ScrollBehavior = BEHAVIOR_AUTO) {\r\n this.scrollToExecutor(id, behavior);\r\n }\r\n\r\n private _scrollToRepeatExecutionTimeout: any;\r\n\r\n private clearScrollToRepeatExecutionTimeout() {\r\n clearTimeout(this._scrollToRepeatExecutionTimeout);\r\n }\r\n\r\n protected scrollToExecutor(id: Id, behavior: ScrollBehavior, iteration: number = 0, isLastIteration = false) {\r\n const items = this.items();\r\n if (!items || !items.length) {\r\n return;\r\n }\r\n\r\n const dynamicSize = this.dynamicSize(), container = this._container(), itemSize = this.itemSize();\r\n if (container) {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n if (dynamicSize) {\r\n if (container) {\r\n container.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);\r\n }\r\n\r\n const { width, height } = this._bounds() || { width: 0, height: 0 },\r\n stickyMap = this.stickyMap(), items = this.items(), isVertical = this._isVertical, delta = this._trackBox.delta,\r\n opts: IGetItemPositionOptions<IVirtualListItem, IVirtualListCollection> = {\r\n bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize,\r\n itemsOffset: this.itemsOffset(), scrollSize: (isVertical ? container.nativeElement.scrollTop : container.nativeElement.scrollLeft) + delta,\r\n snap: this.snap(), fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization(),\r\n },\r\n scrollSize = this._trackBox.getItemPosition(id, stickyMap, opts),\r\n params: ScrollToOptions = { [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };\r\n this._trackBox.clearDelta();\r\n\r\n if (container) {\r\n const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {\r\n ...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,\r\n }), delta = this._trackBox.delta;\r\n\r\n this._trackBox.clearDelta();\r\n\r\n let actualScrollSize = scrollSize + delta;\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n\r\n this.tracking();\r\n\r\n const _scrollSize = this._trackBox.getItemPosition(id, stickyMap, { ...opts, scrollSize: actualScrollSize, fromItemId: id });\r\n\r\n const notChanged = actualScrollSize === _scrollSize;\r\n\r\n if (!notChanged || iteration < MAX_SCROLL_TO_ITERATIONS) {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n this._scrollToRepeatExecutionTimeout = setTimeout(() => {\r\n this.scrollToExecutor(id, BEHAVIOR_INSTANT, iteration + 1, notChanged);\r\n });\r\n } else {\r\n this._scrollSize.set(actualScrollSize);\r\n\r\n container.nativeElement.addEventListener(SCROLL, this._onScrollHandler);\r\n }\r\n }\r\n\r\n container.nativeElement.scrollTo(params);\r\n\r\n this._scrollSize.set(scrollSize);\r\n } else {\r\n const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize();\r\n const params: ScrollToOptions = { [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };\r\n container.nativeElement.scrollTo(params);\r\n }\r\n }\r\n }\r\n\r\n scrollToEnd(behavior: ScrollBehavior = BEHAVIOR_INSTANT) {\r\n const items = this.items(), latItem = items[items.length > 0 ? items.length - 1 : 0];\r\n this.scrollTo(latItem.id, behavior);\r\n }\r\n\r\n private _onContainerScrollHandler = (e: Event) => {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);\r\n this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : this._scrollSize() < scrollSize ? 1 : 0;\r\n\r\n const event = new ScrollEvent({\r\n direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,\r\n list: this._list()!.nativeElement, delta: this._trackBox.delta,\r\n scrollDelta: this._trackBox.scrollDelta, isVertical: this._isVertical,\r\n });\r\n\r\n this.onScroll.emit(event);\r\n }\r\n }\r\n\r\n private _onContainerScrollEndHandler = (e: Event) => {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);\r\n this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : 0;\r\n\r\n const event = new ScrollEvent({\r\n direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,\r\n list: this._list()!.nativeElement, delta: this._trackBox.delta,\r\n scrollDelta: this._trackBox.scrollDelta, isVertical: this._isVertical,\r\n });\r\n\r\n this.onScrollEnd.emit(event);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n // for direction calculation\r\n containerEl.nativeElement.addEventListener(SCROLL, this._onContainerScrollHandler);\r\n containerEl.nativeElement.addEventListener(SCROLL_END, this._onContainerScrollEndHandler);\r\n\r\n containerEl.nativeElement.addEventListener(SCROLL, this._onScrollHandler);\r\n\r\n this._resizeObserver = new ResizeObserver(this._onResizeHandler);\r\n this._resizeObserver.observe(containerEl.nativeElement);\r\n\r\n this._onResizeHandler();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearScrollToRepeatExecutionTimeout();\r\n\r\n if (this._trackBox) {\r\n this._trackBox.dispose();\r\n }\r\n\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);\r\n containerEl.nativeElement.removeEventListener(SCROLL, this._onContainerScrollHandler);\r\n containerEl.nativeElement.removeEventListener(SCROLL_END, this._onContainerScrollEndHandler);\r\n\r\n if (this._componentsResizeObserver) {\r\n this._componentsResizeObserver.disconnect();\r\n }\r\n\r\n if (this._resizeObserver) {\r\n this._resizeObserver.disconnect();\r\n }\r\n }\r\n\r\n if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgVirtualListComponent } from './ng-virtual-list.component';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\n\r\n@NgModule({\r\n declarations: [NgVirtualListComponent, NgVirtualListItemComponent],\r\n exports: [NgVirtualListComponent],\r\n imports: [CommonModule],\r\n schemas: [NO_ERRORS_SCHEMA],\r\n})\r\nexport class NgVirtualListModule { }\r\n","/*\r\n * Public API Surface of ng-virtual-list\r\n */\r\n\r\nexport * from './lib/ng-virtual-list.module';\r\nexport * from './lib/ng-virtual-list.component';\r\nexport * from './lib/models';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-virtual-list",
3
- "version": "17.0.18",
3
+ "version": "17.0.19",
4
4
  "author": {
5
5
  "name": "Evgenii Grebennikov",
6
6
  "email": "djonnyx@gmail.com"