ng-cw-v12
Version:
Angular UI component library
192 lines • 22.4 kB
JavaScript
import { Component, Input } from '@angular/core';
import { animate, style, transition, trigger, state } from '@angular/animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NumberCounterComponent {
constructor(elementRef) {
this.elementRef = elementRef;
/** 要显示的数字 */
this._value = 0;
/** 每个数字动画持续时间 */
this.ncDuration = 1000;
/** 每个数字之间的延迟 */
this.ncDelayMultiple = 0;
/** 存在每个数字之间的延迟时,数字方向 */
this.ncDirection = 'left';
/** 每个数字之间的间距 */
this.ncGap = 0;
/** 开始前的延迟 */
this.ncDelay = 0;
/** 是否在视图可见时才开始动画 */
this._startOnView = false;
/** 是否只执行一次动画 */
this._once = false;
this.digits = [];
this.observer = null;
this.timeout = null;
}
set ncValue(value) {
this._value = value;
setTimeout(() => {
this.start();
});
}
get ncValue() {
return this._value;
}
set ncStartOnView(val) {
this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncStartOnView() {
return this._startOnView;
}
set ncOnce(val) {
this._once = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncOnce() {
return this._once;
}
ngOnInit() { }
ngOnDestroy() {
this.clear();
}
start() {
this.clear();
if (!this.ncStartOnView) {
this.processValue();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
}
else {
this.setupIntersectionObserver();
}
}
clear() {
if (this.observer) {
this.observer.disconnect();
}
if (this.timeout) {
clearTimeout(this.timeout);
}
}
setupIntersectionObserver() {
this.observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
this.processValue();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
if (this.ncOnce) {
if (this.observer) {
this.observer.disconnect();
}
}
}
else if (!this.ncOnce) {
this.resetAnimation();
}
}, { threshold: 0.1 });
this.observer.observe(this.elementRef.nativeElement);
}
processValue() {
this.digits = [];
const stringValue = this.ncValue.toString();
for (let i = 0; i < stringValue.length; i++) {
const digit = parseInt(stringValue[i]);
// 对于所有数字,都生成0到9的序列,然后再从0到最终数字
let numbers = [
...Array.from({ length: 10 }, (_, index) => index),
...Array.from({ length: digit + 1 }, (_, index) => index)
];
let delay = 0;
if (this.ncDirection === 'left') {
delay = (stringValue.length - 1 - i) * this.ncDelayMultiple;
}
else {
delay = i * this.ncDelayMultiple;
}
this.digits.push({
numbers: numbers,
targetPosition: -(numbers.length - 1),
state: 'initial',
delay: delay
});
}
}
startAnimation() {
this.digits.forEach((digit) => {
setTimeout(() => {
digit.state = 'final';
}, digit.delay);
});
}
resetAnimation() {
if (this.timeout) {
clearTimeout(this.timeout);
}
this.digits.forEach(digit => {
digit.state = 'initial';
});
}
}
NumberCounterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
NumberCounterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NumberCounterComponent, selector: "nc-number-counter", inputs: { ncValue: "ncValue", ncDuration: "ncDuration", ncDelayMultiple: "ncDelayMultiple", ncDirection: "ncDirection", ncGap: "ncGap", ncDelay: "ncDelay", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, ngImport: i0, template: "<div class=\"number-counter-container\" [ngClass]=\"{'gap-x': ncGap > 0}\" [style.--gap.px]=\"ncGap\">\r\n <div class=\"digit-wrapper\" *ngFor=\"let digit of digits; let i = index\">\r\n <div class=\"digits-strip\"\r\n [@countAnimation]=\"{value: digit.state, params: {duration: ncDuration, delay: digit.delay, finalPosition: digit.targetPosition}}\">\r\n <div class=\"digit\" *ngFor=\"let num of digit.numbers\">{{num}}</div>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:inline-block}.number-counter-container{display:flex;width:-moz-fit-content;width:fit-content}.gap-x>*+*{margin-left:var(--gap)}.digit-wrapper{overflow:hidden;position:relative;height:1em;line-height:1em}.digit-wrapper .digits-strip{width:100%;transform:translateY(0);will-change:transform}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [
trigger('countAnimation', [
state('initial', style({
transform: 'translateY(0)'
})),
state('final', style({
transform: 'translateY({{finalPosition}}em)'
}), {
params: { finalPosition: 0 }
}),
transition('initial => final', [
animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')
], {
params: { duration: 1000, delay: 0 }
})
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-number-counter',
templateUrl: './number-counter.component.html',
styleUrls: ['./number-counter.component.less'],
animations: [
trigger('countAnimation', [
state('initial', style({
transform: 'translateY(0)'
})),
state('final', style({
transform: 'translateY({{finalPosition}}em)'
}), {
params: { finalPosition: 0 }
}),
transition('initial => final', [
animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')
], {
params: { duration: 1000, delay: 0 }
})
])
]
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncValue: [{
type: Input
}], ncDuration: [{
type: Input
}], ncDelayMultiple: [{
type: Input
}], ncDirection: [{
type: Input
}], ncGap: [{
type: Input
}], ncDelay: [{
type: Input
}], ncStartOnView: [{
type: Input
}], ncOnce: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWNvdW50ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9udW1iZXItY291bnRlci9udW1iZXItY291bnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL251bWJlci1jb3VudGVyL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUF3QmpGLE1BQU0sT0FBTyxzQkFBc0I7SUErQ2pDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUE5QzFDLGFBQWE7UUFDTCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBWTNCLGlCQUFpQjtRQUNSLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsZ0JBQWdCO1FBQ1Asb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsd0JBQXdCO1FBQ2YsZ0JBQVcsR0FBcUIsTUFBTSxDQUFDO1FBQ2hELGdCQUFnQjtRQUNQLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDM0IsYUFBYTtRQUNKLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0Isb0JBQW9CO1FBQ1osaUJBQVksR0FBWSxLQUFLLENBQUM7UUFRdEMsZ0JBQWdCO1FBQ1IsVUFBSyxHQUFZLEtBQUssQ0FBQztRQVMvQixXQUFNLEdBQWtGLEVBQUUsQ0FBQztRQUNuRixhQUFRLEdBQWdDLElBQUksQ0FBQztRQUM3QyxZQUFPLEdBQVEsSUFBSSxDQUFDO0lBRWtCLENBQUM7SUE1Qy9DLElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFD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Z0IsRUFBRTs0QkFDeEIsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0NBQ3JCLFNBQVMsRUFBRSxlQUFlOzZCQUMzQixDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0NBQ25CLFNBQVMsRUFBRSxpQ0FBaUM7NkJBQzdDLENBQUMsRUFBRTtnQ0FDRixNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFOzZCQUM3QixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRTtnQ0FDN0IsT0FBTyxDQUFDLDJEQUEyRCxDQUFDOzZCQUNyRSxFQUFFO2dDQUNELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTs2QkFDckMsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO2lCQUNGO2lHQUtLLE9BQU87c0JBRFYsS0FBSztnQkFZRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUlGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIsIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLW51bWJlci1jb3VudGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbnVtYmVyLWNvdW50ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignY291bnRBbmltYXRpb24nLCBbXHJcbiAgICAgIHN0YXRlKCdpbml0aWFsJywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoe3tmaW5hbFBvc2l0aW9ufX1lbSknXHJcbiAgICAgIH0pLCB7XHJcbiAgICAgICAgcGFyYW1zOiB7IGZpbmFsUG9zaXRpb246IDAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdHJhbnNpdGlvbignaW5pdGlhbCA9PiBmaW5hbCcsIFtcclxuICAgICAgICBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4zMywgMSwgMC42OCwgMSknKVxyXG4gICAgICBdLCB7XHJcbiAgICAgICAgcGFyYW1zOiB7IGR1cmF0aW9uOiAxMDAwLCBkZWxheTogMCB9XHJcbiAgICAgIH0pXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE51bWJlckNvdW50ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIOimgeaYvuekuueahOaVsOWtlyAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0YXJ0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0IG5jVmFsdWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiDmr4/kuKrmlbDlrZfliqjnlLvmjIHnu63ml7bpl7QgKi9cclxuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSAxMDAwO1xyXG4gIC8qKiDmr4/kuKrmlbDlrZfkuYvpl7TnmoTlu7bov58gKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGU6IG51bWJlciA9IDA7XHJcbiAgLyoqIOWtmOWcqOavj+S4quaVsOWtl+S5i+mXtOeahOW7tui/n+aXtu+8jOaVsOWtl+aWueWQkSAqL1xyXG4gIEBJbnB1dCgpIG5jRGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ2xlZnQnO1xyXG4gIC8qKiDmr4/kuKrmlbDlrZfkuYvpl7TnmoTpl7Tot50gKi9cclxuICBASW5wdXQoKSBuY0dhcDogbnVtYmVyID0gMDtcclxuICAvKiog5byA5aeL5YmN55qE5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5piv5ZCm5Zyo6KeG5Zu+5Y+v6KeB5pe25omN5byA5aeL5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfc3RhcnRPblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1N0YXJ0T25WaWV3KHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3RhcnRPblZpZXcgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY1N0YXJ0T25WaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0T25WaWV3O1xyXG4gIH1cclxuICAvKiog5piv5ZCm5Y+q5omn6KGM5LiA5qyh5Yqo55S7ICovXHJcbiAgcHJpdmF0ZSBfb25jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jT25jZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX29uY2UgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIGdldCBuY09uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb25jZTtcclxuICB9XHJcblxyXG4gIGRpZ2l0czogeyBudW1iZXJzOiBudW1iZXJbXSwgdGFyZ2V0UG9zaXRpb246IG51bWJlciwgc3RhdGU6IHN0cmluZywgZGVsYXk6IG51bWJlciB9W10gPSBbXTtcclxuICBwcml2YXRlIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGltZW91dDogYW55ID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgaWYgKCF0aGlzLm5jU3RhcnRPblZpZXcpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzVmFsdWUoKTtcclxuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgICB7IHRocmVzaG9sZDogMC4xIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJvY2Vzc1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWdpdHMgPSBbXTtcclxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdGhpcy5uY1ZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBkaWdpdCA9IHBhcnNlSW50KHN0cmluZ1ZhbHVlW2ldKTtcclxuXHJcbiAgICAgIC8vIOWvueS6juaJgOacieaVsOWtl++8jOmDveeUn+aIkDDliLA555qE5bqP5YiX77yM54S25ZCO5YaN5LuOMOWIsOacgOe7iOaVsOWtl1xyXG4gICAgICBsZXQgbnVtYmVycyA9IFtcclxuICAgICAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaW5kZXgpID0+IGluZGV4KSxcclxuICAgICAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiBkaWdpdCArIDEgfSwgKF8sIGluZGV4KSA9PiBpbmRleClcclxuICAgICAgXTtcclxuXHJcbiAgICAgIGxldCBkZWxheSA9IDA7XHJcbiAgICAgIGlmICh0aGlzLm5jRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgICBkZWxheSA9IChzdHJpbmdWYWx1ZS5sZW5ndGggLSAxIC0gaSkgKiB0aGlzLm5jRGVsYXlNdWx0aXBsZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWxheSA9IGkgKiB0aGlzLm5jRGVsYXlNdWx0aXBsZTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5kaWdpdHMucHVzaCh7XHJcbiAgICAgICAgbnVtYmVyczogbnVtYmVycyxcclxuICAgICAgICB0YXJnZXRQb3NpdGlvbjogLShudW1iZXJzLmxlbmd0aCAtIDEpLFxyXG4gICAgICAgIHN0YXRlOiAnaW5pdGlhbCcsXHJcbiAgICAgICAgZGVsYXk6IGRlbGF5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlnaXRzLmZvckVhY2goKGRpZ2l0KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGRpZ2l0LnN0YXRlID0gJ2ZpbmFsJztcclxuICAgICAgfSwgZGlnaXQuZGVsYXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlnaXRzLmZvckVhY2goZGlnaXQgPT4ge1xyXG4gICAgICBkaWdpdC5zdGF0ZSA9ICdpbml0aWFsJztcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibnVtYmVyLWNvdW50ZXItY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieydnYXAteCc6IG5jR2FwID4gMH1cIiBbc3R5bGUuLS1nYXAucHhdPVwibmNHYXBcIj5cclxuICA8ZGl2IGNsYXNzPVwiZGlnaXQtd3JhcHBlclwiICpuZ0Zvcj1cImxldCBkaWdpdCBvZiBkaWdpdHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWdpdHMtc3RyaXBcIlxyXG4gICAgICBbQGNvdW50QW5pbWF0aW9uXT1cInt2YWx1ZTogZGlnaXQuc3RhdGUsIHBhcmFtczoge2R1cmF0aW9uOiBuY0R1cmF0aW9uLCBkZWxheTogZGlnaXQuZGVsYXksIGZpbmFsUG9zaXRpb246IGRpZ2l0LnRhcmdldFBvc2l0aW9ufX1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRpZ2l0XCIgKm5nRm9yPVwibGV0IG51bSBvZiBkaWdpdC5udW1iZXJzXCI+e3tudW19fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==