Animated Counter
Count a statistic up to its value when it scrolls into view. The final number is in the HTML from the start, so screen readers, search engines and visitors without JavaScript always get it. Prefix, suffix, decimals, five separator styles, four label positions and an icon slot, all set in the Etch props panel.
Paste it on the Etch canvas with Ctrl+V or ⌘V, then click Save.
{"type":"block","gutenbergBlock":{"blockName":"etch/component","attrs":{"ref":103,"attributes":{}},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]},"timestamp":"2026-10-12T18:52:07.746Z","styles":{"xx2umi7":{"type":"class","selector":".ed-animated-counter","collection":"default","css":"/* Styling guide: delete the comment marks around one line to set that token for every counter. */\n /* An uncommented line also wins over the same token on a parent class. For one section only, leave it commented and set the token on a parent class. */\n /* Number and label size or weight entered in an instance's props win over these tokens. */\n\n /* Container */\n /* --ed-animated-counter-text-color: inherit; */\n /* --ed-animated-counter-font-family: inherit; */\n /* --ed-animated-counter-text-size: inherit; */\n /* --ed-animated-counter-text-weight: inherit; */\n /* --ed-animated-counter-line-height: inherit; */\n /* --ed-animated-counter-text-align: inherit; */\n /* --ed-animated-counter-background: transparent; */\n /* --ed-animated-counter-padding: 0; */\n /* --ed-animated-counter-padding-block: var(--ed-animated-counter-padding, 0); */\n /* --ed-animated-counter-padding-inline: var(--ed-animated-counter-padding, 0); */\n /* --ed-animated-counter-border: 0; */\n /* --ed-animated-counter-radius: 0; */\n /* --ed-animated-counter-shadow: none; */\n /* --ed-animated-counter-gap: var(--space-xs, 0.75rem); */\n\n /* Layout (Label position prop). Unset, Left/Right align to baseline and Below/Above stretch; a set align-items applies to all four. */\n /* --ed-animated-counter-align-items: normal; */\n /* --ed-animated-counter-justify-content: normal; */\n\n /* Number and inherited affix defaults */\n /* --ed-animated-counter-number-color: inherit; */\n /* --ed-animated-counter-number-font-family: inherit; */\n /* --ed-animated-counter-number-size: var(--h2, 2rem); */\n /* --ed-animated-counter-number-weight: var(--heading-font-weight, 700); */\n /* --ed-animated-counter-number-line-height: var(--heading-line-height, 1.2); */\n /* --ed-animated-counter-number-letter-spacing: inherit; */\n /* --ed-animated-counter-number-min-block-size: 0; */\n\n /* Icon (decorative slot; size scales an svg or img to 1em) */\n /* --ed-animated-counter-icon-size: 2em; */\n /* --ed-animated-counter-icon-color: inherit; */\n\n /* Label */\n /* --ed-animated-counter-label-color: inherit; */\n /* --ed-animated-counter-label-font-family: inherit; */\n /* --ed-animated-counter-label-size: 1em; */\n /* --ed-animated-counter-label-weight: inherit; */\n /* --ed-animated-counter-label-line-height: var(--ed-animated-counter-line-height, var(--text-line-height, 1.5)); */\n /* --ed-animated-counter-label-letter-spacing: inherit; */\n /* --ed-animated-counter-label-max-inline-size: none; */\n\n /* Affixes (sizes are relative to the number) */\n /* --ed-animated-counter-prefix-color: inherit; */\n /* --ed-animated-counter-prefix-font-family: inherit; */\n /* --ed-animated-counter-prefix-size: 1em; */\n /* --ed-animated-counter-prefix-weight: inherit; */\n /* --ed-animated-counter-suffix-color: inherit; */\n /* --ed-animated-counter-suffix-font-family: inherit; */\n /* --ed-animated-counter-suffix-size: 1em; */\n /* --ed-animated-counter-suffix-weight: inherit; */\n\n display: flex;\n flex-direction: column;\n align-items: var(--ed-animated-counter-align-items, normal);\n justify-content: var(--ed-animated-counter-justify-content, normal);\n gap: var(--ed-animated-counter-gap, var(--space-xs, 0.75rem));\n min-inline-size: 0;\n position: relative;\n overflow-wrap: anywhere;\n color: var(--ed-animated-counter-text-color, inherit);\n font-family: var(--ed-animated-counter-font-family, inherit);\n font-size: var(--ed-animated-counter-text-size, inherit);\n font-weight: var(--ed-animated-counter-text-weight, inherit);\n line-height: var(--ed-animated-counter-line-height, inherit);\n text-align: var(--ed-animated-counter-text-align, inherit);\n background: var(--ed-animated-counter-background, transparent);\n padding-block: var(--ed-animated-counter-padding-block, var(--ed-animated-counter-padding, 0));\n padding-inline: var(--ed-animated-counter-padding-inline, var(--ed-animated-counter-padding, 0));\n border: var(--ed-animated-counter-border, 0);\n border-radius: var(--ed-animated-counter-radius, 0);\n box-shadow: var(--ed-animated-counter-shadow, none);\n\n & > .ed-animated-counter__number {\n color: var(--ed-animated-counter-number-color, inherit);\n font-family: var(--ed-animated-counter-number-font-family, inherit);\n font-size: var(--ed-animated-counter-number-size, var(--h2, 2rem));\n font-weight: var(--ed-animated-counter-number-weight, var(--heading-font-weight, 700));\n line-height: var(--ed-animated-counter-number-line-height, var(--heading-line-height, 1.2));\n letter-spacing: var(--ed-animated-counter-number-letter-spacing, inherit);\n min-block-size: var(--ed-animated-counter-number-min-block-size, 0);\n font-variant-numeric: tabular-nums;\n\n /* Descendants, not children: with Screen reader text the visible prefix, value and suffix sit in an aria-hidden span. The number has no slot, so nothing else can match. */\n & .ed-animated-counter__prefix {\n color: var(--ed-animated-counter-prefix-color, inherit);\n font-family: var(--ed-animated-counter-prefix-font-family, inherit);\n font-size: var(--ed-animated-counter-prefix-size, 1em);\n font-weight: var(--ed-animated-counter-prefix-weight, inherit);\n }\n\n & .ed-animated-counter__suffix {\n color: var(--ed-animated-counter-suffix-color, inherit);\n font-family: var(--ed-animated-counter-suffix-font-family, inherit);\n font-size: var(--ed-animated-counter-suffix-size, 1em);\n font-weight: var(--ed-animated-counter-suffix-weight, inherit);\n }\n\n /* Visually hidden copies for assistive technology: the Screen reader text and, while the digits move, the script's copy. */\n /* They sit inside the number, so touching the digits finds it. Left out of text selection, so copying gives the visible value once. */\n & > :is(.ed-animated-counter__accessible, .ed-animated-counter__accessible-text) {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n -webkit-user-select: none;\n user-select: none;\n }\n }\n\n & > .ed-animated-counter__label {\n color: var(--ed-animated-counter-label-color, inherit);\n font-family: var(--ed-animated-counter-label-font-family, inherit);\n font-size: var(--ed-animated-counter-label-size, 1em);\n font-weight: var(--ed-animated-counter-label-weight, inherit);\n line-height: var(--ed-animated-counter-label-line-height, var(--ed-animated-counter-line-height, var(--text-line-height, 1.5)));\n letter-spacing: var(--ed-animated-counter-label-letter-spacing, inherit);\n max-inline-size: var(--ed-animated-counter-label-max-inline-size, none);\n &:empty, &[data-ed-counter-empty] { display: none; }\n }\n\n /* Decorative icon slot; always first, also when the label sits above the number. */\n & > .ed-animated-counter__icon {\n order: -2;\n color: var(--ed-animated-counter-icon-color, inherit);\n font-size: var(--ed-animated-counter-icon-size, 2em);\n line-height: 1;\n &:empty, &[data-ed-counter-empty] { display: none; }\n & :where(svg, img) {\n display: inline-block;\n block-size: 1em;\n inline-size: auto;\n vertical-align: middle;\n }\n }\n\n /* Number font prop: the ACSS heading font when one is set, otherwise the token or inherited font. */\n &[data-ed-counter-number-font=\"heading\"] > .ed-animated-counter__number {\n font-family: var(--heading-font-family, var(--ed-animated-counter-number-font-family, inherit));\n }\n\n /* Label position: visual order only. The DOM and reading order stay number first. */\n &[data-ed-counter-label-position=\"above\"] > .ed-animated-counter__label,\n &[data-ed-counter-label-position=\"start\"] > .ed-animated-counter__label { order: -1; }\n\n /* Side layouts follow the text direction and wrap the label below when it does not fit. */\n &[data-ed-counter-label-position=\"start\"],\n &[data-ed-counter-label-position=\"end\"] {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: var(--ed-animated-counter-align-items, baseline);\n }\n\n /* Builder only: the script names the number settings that keep this counter from animating. */\n &[data-ed-counter-invalid] {\n outline: 2px dashed #b42318;\n outline-offset: 2px;\n\n &::after {\n content: attr(data-ed-counter-invalid);\n inline-size: 100%;\n box-sizing: border-box;\n padding: 0.25em 0.5em;\n font: 600 0.75rem/1.4 system-ui, sans-serif;\n color: #b42318;\n background: #fff;\n }\n }","readonly":false},"e1256o5":{"type":"class","selector":".ed-animated-counter__icon","collection":"default","css":"","readonly":false},"zlh4cwt":{"type":"class","selector":".ed-animated-counter__number","collection":"default","css":"","readonly":false},"02yrrz8":{"type":"class","selector":".ed-animated-counter__accessible-text","collection":"default","css":"","readonly":false},"r5xyr0z":{"type":"class","selector":".ed-animated-counter__prefix","collection":"default","css":"","readonly":false},"c4fso3s":{"type":"class","selector":".ed-animated-counter__value","collection":"default","css":"","readonly":false},"e3yctwh":{"type":"class","selector":".ed-animated-counter__suffix","collection":"default","css":"","readonly":false},"hcdwfxk":{"type":"class","selector":".ed-animated-counter__label","collection":"default","css":"","readonly":false}},"components":{"103":{"id":103,"legacyId":"","name":"ED Animated Counter","key":"EdAnimatedCounter","blocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Ed Animated Counter"},"script":{"code":"aWYoZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCJlZC5hbmltYXRlZC1jb3VudGVyLnYxIildKXtnbG9iYWxUaGlzW1N5bWJvbC5mb3IoImVkLmFuaW1hdGVkLWNvdW50ZXIudjEiKV0uc2NhbigpO31lbHNlewovKiEgRUQgQW5pbWF0ZWQgQ291bnRlciAxLjAuMC1iZXRhLjMKQ29weXJpZ2h0IDIwMjYgVG9tIENobWllbCwgaHR0cHM6Ly9ldGNoZGV2ZWxvcGVyLmNvbQpTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRlNMLTEuMS1NSVQgKGh0dHBzOi8vZXRjaGRldmVsb3Blci5jb20vbGljZW5zZS8pCgpUaGlyZC1wYXJ0eSBsaWJyYXJ5OgpDb3VudFVwLmpzIDIuMTAuMQpBdXRob3IvY29weXJpZ2h0IGhvbGRlcjogSmFtaWUgUGVya2lucyAoaW5vcmdhbmlrKSBhbmQgY29udHJpYnV0b3JzLgpodHRwczovL2dpdGh1Yi5jb20vaW5vcmdhbmlrL2NvdW50VXAuanMKTUlUIExpY2Vuc2UKClRoZSBmb2xsb3dpbmcgdXBzdHJlYW0gbGljZW5zZSBpcyBwcmVzZXJ2ZWQgdmVyYmF0aW0gKHVwc3RyZWFtIHN1cHBsaWVzIG5vIGRhdGVkIGNvcHlyaWdodCBsaW5lKToKClRoZSBNSVQgTGljZW5zZSAoTUlUKQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCnRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgpDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCiovCiJ1c2Ugc3RyaWN0IjsoKCk9Pnt2YXIgUD1mdW5jdGlvbigpe3JldHVybiBQPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKG4pe2Zvcih2YXIgZSxhPTEscz1hcmd1bWVudHMubGVuZ3RoO2E8czthKyspZm9yKHZhciB0IGluIGU9YXJndW1lbnRzW2FdKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpJiYoblt0XT1lW3RdKTtyZXR1cm4gbn0sUC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFk9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihlLGEscyl7dmFyIHQ9dGhpczt0aGlzLmVuZFZhbD1hLHRoaXMub3B0aW9ucz1zLHRoaXMudmVyc2lvbj0iMi4xMC4xIix0aGlzLmRlZmF1bHRzPXtzdGFydFZhbDowLGRlY2ltYWxQbGFjZXM6MCxkdXJhdGlvbjoyLHVzZUVhc2luZzohMCx1c2VHcm91cGluZzohMCx1c2VJbmRpYW5TZXBhcmF0b3JzOiExLHNtYXJ0RWFzaW5nVGhyZXNob2xkOjk5OSxzbWFydEVhc2luZ0Ftb3VudDozMzMsc2VwYXJhdG9yOiIsIixkZWNpbWFsOiIuIixwcmVmaXg6IiIsc3VmZml4OiIiLGF1dG9BbmltYXRlOiExLGF1dG9BbmltYXRlRGVsYXk6MjAwLGF1dG9BbmltYXRlT25jZTohMX0sdGhpcy5maW5hbEVuZFZhbD1udWxsLHRoaXMudXNlRWFzaW5nPSEwLHRoaXMuY291bnREb3duPSExLHRoaXMuZXJyb3I9IiIsdGhpcy5zdGFydFZhbD0wLHRoaXMucGF1c2VkPSEwLHRoaXMub25jZT0hMSx0aGlzLmNvdW50PWZ1bmN0aW9uKG8pe3Quc3RhcnRUaW1lfHwodC5zdGFydFRpbWU9byk7dmFyIGM9by10LnN0YXJ0VGltZTt0LnJlbWFpbmluZz10LmR1cmF0aW9uLWMsdC51c2VFYXNpbmc/dC5jb3VudERvd24/dC5mcmFtZVZhbD10LnN0YXJ0VmFsLXQuZWFzaW5nRm4oYywwLHQuc3RhcnRWYWwtdC5lbmRWYWwsdC5kdXJhdGlvbik6dC5mcmFtZVZhbD10LmVhc2luZ0ZuKGMsdC5zdGFydFZhbCx0LmVuZFZhbC10LnN0YXJ0VmFsLHQuZHVyYXRpb24pOnQuZnJhbWVWYWw9dC5zdGFydFZhbCsodC5lbmRWYWwtdC5zdGFydFZhbCkqKGMvdC5kdXJhdGlvbik7dmFyIHA9dC5jb3VudERvd24/dC5mcmFtZVZhbDx0LmVuZFZhbDp0LmZyYW1lVmFsPnQuZW5kVmFsO3QuZnJhbWVWYWw9cD90LmVuZFZhbDp0LmZyYW1lVmFsLHQuZnJhbWVWYWw9TnVtYmVyKHQuZnJhbWVWYWwudG9GaXhlZCh0Lm9wdGlvbnMuZGVjaW1hbFBsYWNlcykpLHQucHJpbnRWYWx1ZSh0LmZyYW1lVmFsKSxjPHQuZHVyYXRpb24/dC5yQUY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQuY291bnQpOnQuZmluYWxFbmRWYWwhPT1udWxsP3QudXBkYXRlKHQuZmluYWxFbmRWYWwpOnQub3B0aW9ucy5vbkNvbXBsZXRlQ2FsbGJhY2smJnQub3B0aW9ucy5vbkNvbXBsZXRlQ2FsbGJhY2soKX0sdGhpcy5mb3JtYXROdW1iZXI9ZnVuY3Rpb24obyl7dmFyIGMscCxiLGcsRD1vPDA/Ii0iOiIiO2M9TWF0aC5hYnMobykudG9GaXhlZCh0Lm9wdGlvbnMuZGVjaW1hbFBsYWNlcyk7dmFyIHg9KGMrPSIiKS5zcGxpdCgiLiIpO2lmKHA9eFswXSxiPXgubGVuZ3RoPjE/dC5vcHRpb25zLmRlY2ltYWwreFsxXToiIix0Lm9wdGlvbnMudXNlR3JvdXBpbmcpe2c9IiI7Zm9yKHZhciBGPTMsVj0wLEU9MCxDPXAubGVuZ3RoO0U8QzsrK0UpdC5vcHRpb25zLnVzZUluZGlhblNlcGFyYXRvcnMmJkU9PT00JiYoRj0yLFY9MSksRSE9PTAmJlYlRj09MCYmKGc9dC5vcHRpb25zLnNlcGFyYXRvcitnKSxWKyssZz1wW0MtRS0xXStnO3A9Z31yZXR1cm4gdC5vcHRpb25zLm51bWVyYWxzJiZ0Lm9wdGlvbnMubnVtZXJhbHMubGVuZ3RoJiYocD1wLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKEEpe3JldHVybiB0Lm9wdGlvbnMubnVtZXJhbHNbK0FdfSkpLGI9Yi5yZXBsYWNlKC9bMC05XS9nLChmdW5jdGlvbihBKXtyZXR1cm4gdC5vcHRpb25zLm51bWVyYWxzWytBXX0pKSksRCt0Lm9wdGlvbnMucHJlZml4K3ArYit0Lm9wdGlvbnMuc3VmZml4fSx0aGlzLmVhc2VPdXRFeHBvPWZ1bmN0aW9uKG8sYyxwLGIpe3JldHVybiBwKigxLU1hdGgucG93KDIsLTEwKm8vYikpKjEwMjQvMTAyMytjfSx0aGlzLm9wdGlvbnM9UChQKHt9LHRoaXMuZGVmYXVsdHMpLHMpLHRoaXMub3B0aW9ucy5lbmFibGVTY3JvbGxTcHkmJih0aGlzLm9wdGlvbnMuYXV0b0FuaW1hdGU9ITApLHRoaXMub3B0aW9ucy5zY3JvbGxTcHlEZWxheSE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy5hdXRvQW5pbWF0ZURlbGF5PXRoaXMub3B0aW9ucy5zY3JvbGxTcHlEZWxheSksdGhpcy5vcHRpb25zLnNjcm9sbFNweU9uY2UmJih0aGlzLm9wdGlvbnMuYXV0b0FuaW1hdGVPbmNlPSEwKSx0aGlzLmZvcm1hdHRpbmdGbj10aGlzLm9wdGlvbnMuZm9ybWF0dGluZ0ZuP3RoaXMub3B0aW9ucy5mb3JtYXR0aW5nRm46dGhpcy5mb3JtYXROdW1iZXIsdGhpcy5lYXNpbmdGbj10aGlzLm9wdGlvbnMuZWFzaW5nRm4/dGhpcy5vcHRpb25zLmVhc2luZ0ZuOnRoaXMuZWFzZU91dEV4cG8sdGhpcy5lbD10eXBlb2YgZT09InN0cmluZyI/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZSxhPWE/P3RoaXMucGFyc2UodGhpcy5lbC5pbm5lckhUTUwpLHRoaXMuc3RhcnRWYWw9dGhpcy52YWxpZGF0ZVZhbHVlKHRoaXMub3B0aW9ucy5zdGFydFZhbCksdGhpcy5mcmFtZVZhbD10aGlzLnN0YXJ0VmFsLHRoaXMuZW5kVmFsPXRoaXMudmFsaWRhdGVWYWx1ZShhKSx0aGlzLm9wdGlvbnMuZGVjaW1hbFBsYWNlcz1NYXRoLm1heCh0aGlzLm9wdGlvbnMuZGVjaW1hbFBsYWNlcyksdGhpcy5yZXNldER1cmF0aW9uKCksdGhpcy5vcHRpb25zLnNlcGFyYXRvcj1TdHJpbmcodGhpcy5vcHRpb25zLnNlcGFyYXRvciksdGhpcy51c2VFYXNpbmc9dGhpcy5vcHRpb25zLnVzZUVhc2luZyx0aGlzLm9wdGlvbnMuc2VwYXJhdG9yPT09IiImJih0aGlzLm9wdGlvbnMudXNlR3JvdXBpbmc9ITEpLHRoaXMuZWw/dGhpcy5wcmludFZhbHVlKHRoaXMuc3RhcnRWYWwpOnRoaXMuZXJyb3I9IltDb3VudFVwXSB0YXJnZXQgaXMgbnVsbCBvciB1bmRlZmluZWQiLHR5cGVvZiB3aW5kb3c8InUiJiZ0aGlzLm9wdGlvbnMuYXV0b0FuaW1hdGUmJih0aGlzLmVycm9yfHx0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXI+InUiP3RoaXMuZXJyb3I/Y29uc29sZS5lcnJvcih0aGlzLmVycm9yLGUpOmNvbnNvbGUuZXJyb3IoIkludGVyc2VjdGlvbk9ic2VydmVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyIik6dGhpcy5zZXR1cE9ic2VydmVyKCkpfXJldHVybiBuLnByb3RvdHlwZS5zZXR1cE9ic2VydmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxhPW4ub2JzZXJ2ZWRFbGVtZW50cy5nZXQodGhpcy5lbCk7YSYmYS51bm9ic2VydmUoKSxuLm9ic2VydmVkRWxlbWVudHMuc2V0KHRoaXMuZWwsdGhpcyksdGhpcy5vYnNlcnZlcj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHMpe2Zvcih2YXIgdD0wLG89czt0PG8ubGVuZ3RoO3QrKyl7dmFyIGM9b1t0XTtjLmlzSW50ZXJzZWN0aW5nJiZlLnBhdXNlZCYmIWUub25jZT8oZS5wYXVzZWQ9ITEsZS5hdXRvQW5pbWF0ZVRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5zdGFydCgpfSksZS5vcHRpb25zLmF1dG9BbmltYXRlRGVsYXkpLGUub3B0aW9ucy5hdXRvQW5pbWF0ZU9uY2UmJihlLm9uY2U9ITAsZS5vYnNlcnZlci5kaXNjb25uZWN0KCkpKTpjLmlzSW50ZXJzZWN0aW5nfHxlLnBhdXNlZHx8KGNsZWFyVGltZW91dChlLmF1dG9BbmltYXRlVGltZW91dCksZS5yZXNldCgpKX19KSx7dGhyZXNob2xkOjB9KSx0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5lbCl9LG4ucHJvdG90eXBlLnVub2JzZXJ2ZT1mdW5jdGlvbigpe3ZhciBlO2NsZWFyVGltZW91dCh0aGlzLmF1dG9BbmltYXRlVGltZW91dCksKGU9dGhpcy5vYnNlcnZlcik9PT1udWxsfHxlPT09dm9pZCAwfHxlLmRpc2Nvbm5lY3QoKSxuLm9ic2VydmVkRWxlbWVudHMuZGVsZXRlKHRoaXMuZWwpfSxuLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5hdXRvQW5pbWF0ZVRpbWVvdXQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuckFGKSx0aGlzLnBhdXNlZD0hMCx0aGlzLnVub2JzZXJ2ZSgpLHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlQ2FsbGJhY2s9bnVsbCx0aGlzLm9wdGlvbnMub25TdGFydENhbGxiYWNrPW51bGx9LG4ucHJvdG90eXBlLmRldGVybWluZURpcmVjdGlvbkFuZFNtYXJ0RWFzaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5maW5hbEVuZFZhbCE9PW51bGw/dGhpcy5maW5hbEVuZFZhbDp0aGlzLmVuZFZhbDt0aGlzLmNvdW50RG93bj10aGlzLnN0YXJ0VmFsPmU7dmFyIGE9ZS10aGlzLnN0YXJ0VmFsO2lmKE1hdGguYWJzKGEpPnRoaXMub3B0aW9ucy5zbWFydEVhc2luZ1RocmVzaG9sZCYmdGhpcy5vcHRpb25zLnVzZUVhc2luZyl7dGhpcy5maW5hbEVuZFZhbD1lO3ZhciBzPXRoaXMuY291bnREb3duPzE6LTE7dGhpcy5lbmRWYWw9ZStzKnRoaXMub3B0aW9ucy5zbWFydEVhc2luZ0Ftb3VudCx0aGlzLmR1cmF0aW9uPXRoaXMuZHVyYXRpb24vMn1lbHNlIHRoaXMuZW5kVmFsPWUsdGhpcy5maW5hbEVuZFZhbD1udWxsO3RoaXMuZmluYWxFbmRWYWwhPT1udWxsP3RoaXMudXNlRWFzaW5nPSExOnRoaXMudXNlRWFzaW5nPXRoaXMub3B0aW9ucy51c2VFYXNpbmd9LG4ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUpe3RoaXMuZXJyb3J8fCh0aGlzLm9wdGlvbnMub25TdGFydENhbGxiYWNrJiZ0aGlzLm9wdGlvbnMub25TdGFydENhbGxiYWNrKCksZSYmKHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlQ2FsbGJhY2s9ZSksdGhpcy5kdXJhdGlvbj4wPyh0aGlzLmRldGVybWluZURpcmVjdGlvbkFuZFNtYXJ0RWFzaW5nKCksdGhpcy5wYXVzZWQ9ITEsdGhpcy5yQUY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuY291bnQpKTp0aGlzLnByaW50VmFsdWUodGhpcy5lbmRWYWwpKX0sbi5wcm90b3R5cGUucGF1c2VSZXN1bWU9ZnVuY3Rpb24oKXtpZih0aGlzLnBhdXNlZCl0aGlzLnN0YXJ0VGltZT1udWxsLHRoaXMuZHVyYXRpb249dGhpcy5yZW1haW5pbmcsdGhpcy5zdGFydFZhbD10aGlzLmZyYW1lVmFsLHRoaXMuZGV0ZXJtaW5lRGlyZWN0aW9uQW5kU21hcnRFYXNpbmcoKSx0aGlzLnJBRj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5jb3VudCk7ZWxzZXtjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJBRik7dmFyIGU9dGhpcy5maW5hbEVuZFZhbCE9PW51bGw/dGhpcy5kdXJhdGlvbit0aGlzLnJlbWFpbmluZzp0aGlzLnJlbWFpbmluZzt0aGlzLnJlbWFpbmluZz1lfXRoaXMucGF1c2VkPSF0aGlzLnBhdXNlZH0sbi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5hdXRvQW5pbWF0ZVRpbWVvdXQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuckFGKSx0aGlzLnBhdXNlZD0hMCx0aGlzLm9uY2U9ITEsdGhpcy5yZXNldER1cmF0aW9uKCksdGhpcy5zdGFydFZhbD10aGlzLnZhbGlkYXRlVmFsdWUodGhpcy5vcHRpb25zLnN0YXJ0VmFsKSx0aGlzLmZyYW1lVmFsPXRoaXMuc3RhcnRWYWwsdGhpcy5wcmludFZhbHVlKHRoaXMuc3RhcnRWYWwpfSxuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yQUYpLHRoaXMuc3RhcnRUaW1lPW51bGwsdGhpcy5lbmRWYWw9dGhpcy52YWxpZGF0ZVZhbHVlKGUpLHRoaXMuZW5kVmFsIT09dGhpcy5mcmFtZVZhbCYmKHRoaXMuc3RhcnRWYWw9dGhpcy5mcmFtZVZhbCx0aGlzLmZpbmFsRW5kVmFsPT1udWxsJiZ0aGlzLnJlc2V0RHVyYXRpb24oKSx0aGlzLmZpbmFsRW5kVmFsPW51bGwsdGhpcy5kZXRlcm1pbmVEaXJlY3Rpb25BbmRTbWFydEVhc2luZygpLHRoaXMuckFGPXJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmNvdW50KSl9LG4ucHJvdG90eXBlLnByaW50VmFsdWU9ZnVuY3Rpb24oZSl7dmFyIGE7aWYodGhpcy5lbCl7dmFyIHM9dGhpcy5mb3JtYXR0aW5nRm4oZSk7ISgoYT10aGlzLm9wdGlvbnMucGx1Z2luKT09PW51bGx8fGE9PT12b2lkIDApJiZhLnJlbmRlcj90aGlzLm9wdGlvbnMucGx1Z2luLnJlbmRlcih0aGlzLmVsLHMpOnRoaXMuZWwudGFnTmFtZT09PSJJTlBVVCI/dGhpcy5lbC52YWx1ZT1zOnRoaXMuZWwudGFnTmFtZT09PSJ0ZXh0Inx8dGhpcy5lbC50YWdOYW1lPT09InRzcGFuIj90aGlzLmVsLnRleHRDb250ZW50PXM6dGhpcy5lbC5pbm5lckhUTUw9c319LG4ucHJvdG90eXBlLmVuc3VyZU51bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIiJiYhaXNOYU4oZSl9LG4ucHJvdG90eXBlLnZhbGlkYXRlVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIGE9TnVtYmVyKGUpO3JldHVybiB0aGlzLmVuc3VyZU51bWJlcihhKT9hOih0aGlzLmVycm9yPSJbQ291bnRVcF0gaW52YWxpZCBzdGFydCBvciBlbmQgdmFsdWU6ICIuY29uY2F0KGUpLG51bGwpfSxuLnByb3RvdHlwZS5yZXNldER1cmF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zdGFydFRpbWU9bnVsbCx0aGlzLmR1cmF0aW9uPTFlMypOdW1iZXIodGhpcy5vcHRpb25zLmR1cmF0aW9uKSx0aGlzLnJlbWFpbmluZz10aGlzLmR1cmF0aW9ufSxuLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlKXt2YXIgYT1mdW5jdGlvbihjKXtyZXR1cm4gYy5yZXBsYWNlKC8oWy4sJ8KgIF0pL2csIlxcJDEiKX0scz1hKHRoaXMub3B0aW9ucy5zZXBhcmF0b3IpLHQ9YSh0aGlzLm9wdGlvbnMuZGVjaW1hbCksbz1lLnJlcGxhY2UobmV3IFJlZ0V4cChzLCJnIiksIiIpLnJlcGxhY2UobmV3IFJlZ0V4cCh0LCJnIiksIi4iKTtyZXR1cm4gcGFyc2VGbG9hdChvKX0sbi5vYnNlcnZlZEVsZW1lbnRzPW5ldyBXZWFrTWFwLG59KSgpO3ZhciBlZT1bImVuZFZhbHVlIiwic3RhcnRWYWx1ZSIsImR1cmF0aW9uIiwiZGVsYXkiLCJ1c2VFYXNpbmciXTt2YXIgY2U9W1sic3BhY2UiLCJceEEwIl0sWyJub25lIiwiIl1dLGRlPW49PmNlLnJlZHVjZSgoZSxbYSxzXSk9PmUucmVwbGFjZShhLHMpLFN0cmluZyhuPz8iIikpO3ZhciBoPShuLGUsYSxzKT0+KHtrZXk6bixuYW1lOmUsdHlwZTp7cHJpbWl0aXZlOiJzdHJpbmcifSxkZWZhdWx0OmEsZGVzY3JpcHRpb246c30pLEw9KG4sZSxhLHMsdCk9Pih7Li4uaChuLGUsYSx0KSx0eXBlOntwcmltaXRpdmU6InN0cmluZyIsc3BlY2lhbGl6ZWQ6InNlbGVjdCJ9LHNlbGVjdE9wdGlvbnNTdHJpbmc6cy5tYXAoKFtvLGNdKT0+bysiIDogIitjKS5qb2luKGAKYCl9KSxaPShuLGUsYSk9PkwobixlLCJ0cnVlIixbWyJZZXMiLCJ0cnVlIl0sWyJObyIsImZhbHNlIl1dLGEpLEs9W2goImVuZFZhbHVlIiwiRW5kIHZhbHVlIiwiMTI1MCIsIlJlcXVpcmVkIG51bWVyaWMgdmFsdWU7IHVzZSBhIGRvdCBmb3IgaW5wdXQgZGVjaW1hbHMsIHdpdGhvdXQgZ3JvdXBpbmcuIiksaCgic3RhcnRWYWx1ZSIsIlN0YXJ0IHZhbHVlIiwiMCIsIk51bWVyaWMgc3RhcnQ7IG5lZ2F0aXZlIHZhbHVlcyBhbmQgY291bnRpbmcgZG93biBhcmUgc3VwcG9ydGVkLiIpLGgoImRlY2ltYWxQbGFjZXMiLCJEZWNpbWFsIHBsYWNlcyIsIjAiLCJJbnRlZ2VyIDBcdTIwMTMxMC4gU2V0IDEgZm9yIDk4Ljcgb3IgMiBmb3IgMS4yNTsgc2hhcmVkIGJ5IHNlcnZlciBhbmQgYW5pbWF0aW9uLiIpLGgoInByZWZpeCIsIlByZWZpeCIsIiIsIk9wdGlvbmFsIHRleHQgYmVmb3JlIHRoZSBudW1iZXIsIHN1Y2ggYXMgJC4iKSxoKCJzdWZmaXgiLCJTdWZmaXgiLCIiLCJPcHRpb25hbCB0ZXh0IGFmdGVyIHRoZSBudW1iZXIsIHN1Y2ggYXMgKyBvciAlLiIpLGgoImFjY2Vzc2libGVUZXh0IiwiU2NyZWVuIHJlYWRlciB0ZXh0IiwiIiwnT3B0aW9uYWwuIFNjcmVlbiByZWFkZXJzIHJlYWQgdGhpcyBpbnN0ZWFkIG9mIHRoZSB2aXNpYmxlIG51bWJlciwgZm9yIGV4YW1wbGUgIjEuMjUgbWlsbGlvbiBkb2xsYXJzIiBmb3IgJDEuMjVNLicpLGgoImxhYmVsIiwiTGFiZWwiLCIiLCJPcHRpb25hbCBwbGFpbiB0ZXh0LiBGb3IgYSBoZWFkaW5nLCBsaW5rIG9yIG90aGVyIHJpY2ggY29udGVudCB1c2UgdGhlIGN1c3RvbUxhYmVsIHNsb3QuIiksTCgibGFiZWxQb3NpdGlvbiIsIkxhYmVsIHBvc2l0aW9uIiwiYmVsb3ciLFtbIkJlbG93IHRoZSBudW1iZXIiLCJiZWxvdyJdLFsiQWJvdmUgdGhlIG51bWJlciIsImFib3ZlIl0sWyJMZWZ0IG9mIHRoZSBudW1iZXIiLCJzdGFydCJdLFsiUmlnaHQgb2YgdGhlIG51bWJlciIsImVuZCJdXSwiTGVmdCBhbmQgcmlnaHQgZm9sbG93IHRoZSB0ZXh0IGRpcmVjdGlvbiBhbmQgd3JhcCBiZWxvdyB3aGVuIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbS4iKSxoKCJudW1iZXJTaXplIiwiTnVtYmVyIHNpemUiLCIiLCJPcHRpb25hbCBDU1MgZm9udCBzaXplLCBzdWNoIGFzIDNyZW0sIDJlbSBvciB2YXIoLS1oMSwgM3JlbSkuIEVtcHR5IHVzZXMgdGhlIHN0eWxpbmcgdG9rZW5zIChIMiBieSBkZWZhdWx0KS4iKSxoKCJudW1iZXJXZWlnaHQiLCJOdW1iZXIgd2VpZ2h0IiwiIiwiT3B0aW9uYWwgQ1NTIGZvbnQgd2VpZ2h0LCBzdWNoIGFzIDQwMCBvciB2YXIoLS1oZWFkaW5nLWZvbnQtd2VpZ2h0LCA3MDApLiBFbXB0eSB1c2VzIHRoZSBzdHlsaW5nIHRva2VucyAoaGVhZGluZyB3ZWlnaHQgYnkgZGVmYXVsdCkuIiksTCgibnVtYmVyRm9udCIsIk51bWJlciBmb250IiwiaW5oZXJpdCIsW1siSW5oZXJpdGVkIiwiaW5oZXJpdCJdLFsiSGVhZGluZyBmb250IiwiaGVhZGluZyJdXSwiSGVhZGluZyBmb250IHVzZXMgdGhlIEFDU1MgaGVhZGluZyBmb250IGZhbWlseSB3aGVuIG9uZSBpcyBzZXQgaW4gdGhlIEFDU1MgZGFzaGJvYXJkLiIpLGgoImxhYmVsU2l6ZSIsIkxhYmVsIHNpemUiLCIiLCJPcHRpb25hbCBDU1MgZm9udCBzaXplLCBzdWNoIGFzIDEuMjVyZW0gb3IgdmFyKC0tdGV4dC1sLCAxLjI1cmVtKS4gRW1wdHkgdXNlcyB0aGUgc3R5bGluZyB0b2tlbnMuIiksaCgibGFiZWxXZWlnaHQiLCJMYWJlbCB3ZWlnaHQiLCIiLCJPcHRpb25hbCBDU1MgZm9udCB3ZWlnaHQsIHN1Y2ggYXMgNjAwLiBFbXB0eSB1c2VzIHRoZSBzdHlsaW5nIHRva2Vucy4iKSxoKCJkdXJhdGlvbiIsIkR1cmF0aW9uIChzZWNvbmRzKSIsIjIiLCJVcCB0byA1IHNlY29uZHM7IGxvbmdlciB2YWx1ZXMgcGxheSBpbiA1IHNlY29uZHMuIDAgc2hvd3MgdGhlIGZpbmFsIHZhbHVlIHdpdGhvdXQgYW5pbWF0aW9uLiIpLGgoImRlbGF5IiwiRGVsYXkgKG1pbGxpc2Vjb25kcykiLCIwIiwiMFx1MjAxMzYwMDAwIG1pbGxpc2Vjb25kcyBhZnRlciBlbnRlcmluZyB0aGUgdmlld3BvcnQuIiksWigidXNlRWFzaW5nIiwiVXNlIGVhc2luZyIsIkNvdW50VXAgbmF0aXZlIGVhc2luZy4iKSxMKCJ0aG91c2FuZHNTZXBhcmF0b3IiLCJUaG91c2FuZHMgc2VwYXJhdG9yIiwiLCIsW1siQ29tbWEgKDEsMjUwKSIsIiwiXSxbIlBlcmlvZCAoMS4yNTApIiwiLiJdLFsiU3BhY2UgKDEgMjUwKSIsInNwYWNlIl0sWyJBcG9zdHJvcGhlICgxXHUyMDE5MjUwKSIsIlx1MjAxOSJdLFsiTm9uZSAoMTI1MCkiLCJub25lIl1dLCJHcm91cHMgdGhvdXNhbmRzLiBTcGFjZSBpcyBhIG5vLWJyZWFrIHNwYWNlOiB0aGUgZ3JvdXBzIHN0YXkgb24gb25lIGxpbmUgdW5sZXNzIHRoZSBudW1iZXIgaXMgd2lkZXIgdGhhbiBpdHMgY29udGFpbmVyLiIpLGgoImRlY2ltYWxTZXBhcmF0b3IiLCJEZWNpbWFsIHNlcGFyYXRvciIsIi4iLCJQbGFpbiB0ZXh0IGRlY2ltYWwgc2VwYXJhdG9yLCBzdWNoIGFzIC4gb3IgLCIpLFooImFuaW1hdGVPbmNlIiwiQW5pbWF0ZSBvbmNlIiwiT25lIGNvbXBsZXRlZCBhbmltYXRpb24gcGVyIGluc3RhbmNlOyBObyByZXBsYXlzIG9uIGVhY2ggZW50cnkuIildLE09T2JqZWN0LmZyb21FbnRyaWVzKEsubWFwKG49PltuLmtleSxuLmRlZmF1bHRdKSksTz1uPT4iZGF0YS0iK24ucmVwbGFjZSgvW0EtWl0vZyxlPT4iLSIrZS50b0xvd2VyQ2FzZSgpKSxtZT1bInByZWZpeCIsInN1ZmZpeCIsImFjY2Vzc2libGVUZXh0IiwibGFiZWwiLCJsYWJlbFBvc2l0aW9uIiwibnVtYmVyU2l6ZSIsIm51bWJlcldlaWdodCIsIm51bWJlckZvbnQiLCJsYWJlbFNpemUiLCJsYWJlbFdlaWdodCJdLFU9Sy5maWx0ZXIobj0+IW1lLmluY2x1ZGVzKG4ua2V5KSkubWFwKG49Pm4ua2V5KTtmdW5jdGlvbiB3KG4pe2xldCBlPVN0cmluZyhuPz8iIikudHJpbSgpO2lmKCEvXlsrLV0/KD86XGQrKD86XC5cZCopP3xcLlxkKykkLy50ZXN0KGUpKXJldHVybiBudWxsO2xldCBhPU51bWJlcihlKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKGEpJiZNYXRoLmFicyhhKTw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/YTpudWxsfXZhciBrPShuLGUpPT5hPT57bGV0IHM9dyhhKTtyZXR1cm4gcyE9PW51bGwmJnM+PW4mJnM8PWV9LEo9bj0+bj09PSJ0cnVlInx8bj09PSJmYWxzZSIsUT17ZW5kVmFsdWU6aygtMS8wLDEvMCksc3RhcnRWYWx1ZTprKC0xLzAsMS8wKSxkZWNpbWFsUGxhY2VzOm49Pk51bWJlci5pc0ludGVnZXIodyhuKSkmJmsoMCwxMCkobiksZHVyYXRpb246aygwLDEvMCksZGVsYXk6aygwLDZlNCksdXNlRWFzaW5nOkosYW5pbWF0ZU9uY2U6Sn0sdGU9bj0+e2xldCBlPXsuLi5NLC4uLm59O3JldHVybiBPYmplY3Qua2V5cyhRKS5maWx0ZXIoYT0+IVFbYV0oZVthXSkpfTtmdW5jdGlvbiBuZShuKXtsZXQgZT10ZShuKSxhPUsuZmlsdGVyKHM9PmUuaW5jbHVkZXMocy5rZXkpKS5tYXAocz0+cy5uYW1lKTtyZXR1cm4gYS5sZW5ndGg/IldpbGwgbm90IGFuaW1hdGUuIENoZWNrICIrYS5qb2luKCIsICIpKyIuIjoiIn1mdW5jdGlvbiBpZShuKXtpZih0ZShuKS5sZW5ndGgpcmV0dXJuIG51bGw7bGV0IGU9ey4uLk0sLi4ubn0sYT1kZShlLnRob3VzYW5kc1NlcGFyYXRvcik7cmV0dXJue2VuZFZhbDp3KGUuZW5kVmFsdWUpLGRlbGF5OncoZS5kZWxheSksb25jZTplLmFuaW1hdGVPbmNlPT09InRydWUiLG9wdGlvbnM6e3N0YXJ0VmFsOncoZS5zdGFydFZhbHVlKSxkZWNpbWFsUGxhY2VzOncoZS5kZWNpbWFsUGxhY2VzKSxkdXJhdGlvbjpNYXRoLm1pbih3KGUuZHVyYXRpb24pLDUpLHVzZUVhc2luZzplLnVzZUVhc2luZz09PSJ0cnVlIix1c2VHcm91cGluZzphIT09IiIsc2VwYXJhdG9yOmEsZGVjaW1hbDplLmRlY2ltYWxTZXBhcmF0b3J9fX12YXIgYWU9WyJlbmRWYWx1ZSIsImRlY2ltYWxQbGFjZXMiLCJ0aG91c2FuZHNTZXBhcmF0b3IiLCJkZWNpbWFsU2VwYXJhdG9yIl0sc2U9bj0+ImRhdGEtZWQtY291bnRlci0iK08obikuc2xpY2UoNSkscmU9WyJkYXRhLWVkLWNvdW50ZXItZmluYWwiLC4uLmFlLm1hcChzZSldO2Z1bmN0aW9uIG9lKG4sZSl7cmV0dXJuIGFlLmV2ZXJ5KGE9Pm4uZ2V0QXR0cmlidXRlKHNlKGEpKT09PVN0cmluZyhlW2FdPz9NW2FdKSk/bi5nZXRBdHRyaWJ1dGUoImRhdGEtZWQtY291bnRlci1maW5hbCIpOm51bGx9ZnVuY3Rpb24gbGUobil7bGV0IGU9bmV3IEludGwuTnVtYmVyRm9ybWF0KCJlbi1VUyIse21pbmltdW1GcmFjdGlvbkRpZ2l0czpuLmRlY2ltYWxQbGFjZXMsbWF4aW11bUZyYWN0aW9uRGlnaXRzOm4uZGVjaW1hbFBsYWNlcyx1c2VHcm91cGluZzpuLnVzZUdyb3VwaW5nJiZuLnNlcGFyYXRvciE9PSIiLHJvdW5kaW5nTW9kZToiaGFsZkV4cGFuZCJ9KTtyZXR1cm4gYT0+e2xldCBzPWUuZm9ybWF0VG9QYXJ0cyhhKSx0PXMuZmlsdGVyKG89Pm8udHlwZT09PSJpbnRlZ2VyInx8by50eXBlPT09ImZyYWN0aW9uIikuZXZlcnkobz0+L14wKyQvLnRlc3Qoby52YWx1ZSkpO3JldHVybiBzLm1hcChvPT5vLnR5cGU9PT0ibWludXNTaWduIiYmdD8iIjpvLnR5cGU9PT0iZ3JvdXAiP24uc2VwYXJhdG9yOm8udHlwZT09PSJkZWNpbWFsIj9uLmRlY2ltYWw6by52YWx1ZSkuam9pbigiIil9fXZhciBxPVN5bWJvbC5mb3IoImVkLmFuaW1hdGVkLWNvdW50ZXIudjEiKTtpZihnbG9iYWxUaGlzW3FdKWdsb2JhbFRoaXNbcV0uc2NhbigpO2Vsc2V7bGV0IHg9ZnVuY3Rpb24oaSl7Zy5hZGQoaSksRD8/PXNldEludGVydmFsKEYsMjUwKX0sRj1mdW5jdGlvbigpe2ZvcihsZXQgaSBvZiBnKXtsZXQgdT1lLmdldChpKTt1Py52aXNpYmxlP2IoaSkmJihnLmRlbGV0ZShpKSx1LnN0YXJ0KCkpOmcuZGVsZXRlKGkpfWcuc2l6ZXx8KGNsZWFySW50ZXJ2YWwoRCksRD1udWxsKX0sRz1mdW5jdGlvbihpKXtjbGVhclRpbWVvdXQoQy5nZXQoaSkpLEMuc2V0KGksc2V0VGltZW91dCgoKT0+e0MuZGVsZXRlKGkpLGUuZ2V0KGkpPy5wcmV2aWV3KCl9LDUwMCkpfSxSPWZ1bmN0aW9uKGkpe2xldCB1PXQoaSwibnVtYmVyIiksZD10KGksInZhbHVlIikscj1pZShpLmRhdGFzZXQpO2lmKCF1fHwhZClyZXR1cm47aS5xdWVyeVNlbGVjdG9yQWxsKCIuZWQtYW5pbWF0ZWQtY291bnRlcl9fYWNjZXNzaWJsZSIpLmZvckVhY2gobD0+e2wuY2xvc2VzdChuKT09PWkmJmwucmVtb3ZlKCl9KTtsZXQgdj0hIXQoaSwiYWNjZXNzaWJsZVRleHQiKSxtPSgpPT5bInByZWZpeCIsInZhbHVlIiwic3VmZml4Il0ubWFwKGw9PnQoaSxsKSkuZmlsdGVyKEJvb2xlYW4pLGY9bnVsbCxUPW51bGwsaj0hMSx6PSExLFc9cj9sZShyLm9wdGlvbnMpOm51bGwsTj1vZShkLGkuZGF0YXNldCk/PyhyP1coci5lbmRWYWwpOmQudGV4dENvbnRlbnQpO2lmKGQudGV4dENvbnRlbnQhPT1OJiYoZC50ZXh0Q29udGVudD1OKSwhdilmb3IobGV0IGwgb2YgbSgpKWwucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpO1Uuc29tZShsPT5pLmdldEF0dHJpYnV0ZShPKGwpKSkmJkEuYWRkKGkpLFYoaSkmJkEuaGFzKGkpJiYhciYmaS5zZXRBdHRyaWJ1dGUoImRhdGEtZWQtY291bnRlci1pbnZhbGlkIixuZShpLmRhdGFzZXQpKTtsZXQgeT1udWxsLEI9e251bWJlcjp1LHZhbHVlOmQsdmlzaWJsZTohMSxzZXR0bGU6SSxzdGFydDpYLGRpc3Bvc2U6dWUscmVmcmVzaFNlbWFudGljOkgscmVmcmVzaEVtcHR5OiQscHJldmlldzooKT0+WCghMCl9O2Uuc2V0KGksQiksJCgpO2Z1bmN0aW9uIEkoKXtpZihjbGVhclRpbWVvdXQoZiksZj1udWxsLFQ/Lm9uRGVzdHJveSgpLFQ9bnVsbCxkLnRleHRDb250ZW50IT09TiYmKGQudGV4dENvbnRlbnQ9TikseSl7eS5yZW1vdmUoKSx5PW51bGw7Zm9yKGxldCBsIG9mIG0oKSlsLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX19ZnVuY3Rpb24gSCgpe2lmKCF5KXJldHVybjtsZXQgbD0odChpLCJwcmVmaXgiKT8udGV4dENvbnRlbnR8fCIiKStOKyh0KGksInN1ZmZpeCIpPy50ZXh0Q29udGVudHx8IiIpO3kudGV4dENvbnRlbnQhPT1sJiYoeS50ZXh0Q29udGVudD1sKTtmb3IobGV0IFMgb2YgbSgpKVMuZ2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpIT09InRydWUiJiZTLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIil9ZnVuY3Rpb24gJCgpe2ZvcihsZXQgbCBvZlsibGFiZWwiLCJpY29uIl0pe2xldCBTPXQoaSxsKTtTJiZTLnRvZ2dsZUF0dHJpYnV0ZSgiZGF0YS1lZC1jb3VudGVyLWVtcHR5IiwhUy5jaGlsZHJlbi5sZW5ndGgmJiFTLnRleHRDb250ZW50LnRyaW0oKSl9fWZ1bmN0aW9uIFgobD0hMSl7aWYoISh6fHwhcnx8ZiE9PW51bGx8fFR8fGEubWF0Y2hlc3x8ci5vcHRpb25zLmR1cmF0aW9uPT09MHx8ci5vcHRpb25zLnN0YXJ0VmFsPT09ci5lbmRWYWx8fCFsJiYoaiYmci5vbmNlfHxWKGkpKSkpe2lmKCFsJiYhYihpKSlyZXR1cm4geChpKTtmPXNldFRpbWVvdXQoKCk9PntpZihmPW51bGwsISh6fHwhaS5pc0Nvbm5lY3RlZHx8IShsfHxCLnZpc2libGUpfHxhLm1hdGNoZXMpKXtpZighbCYmIWIoaSkpcmV0dXJuIHgoaSk7dHJ5e2lmKCFsJiYheSYmIXYmJih5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSx5LmNsYXNzTmFtZT0iZWQtYW5pbWF0ZWQtY291bnRlcl9fYWNjZXNzaWJsZSIsdS5wcmVwZW5kKHkpLEgoKSksVD1uZXcgWShkLHIuZW5kVmFsLHsuLi5yLm9wdGlvbnMsZm9ybWF0dGluZ0ZuOlcscGx1Z2luOm99KSxULmVycm9yKXtJKCk7cmV0dXJufVQuc3RhcnQoKCk9PntqPSEwLEkoKSxyLm9uY2UmJnA/LnVub2JzZXJ2ZShpKX0pfWNhdGNoe0koKX19fSxyLmRlbGF5KX19ZnVuY3Rpb24gdWUoKXt6PSEwLEkoKSxwPy51bm9ic2VydmUoaSk7Zm9yKGxldCBsIG9mWyJsYWJlbCIsImljb24iXSl0KGksbCk/LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1lZC1jb3VudGVyLWVtcHR5Iik7aS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZWQtY291bnRlci1pbnZhbGlkIiksZS5kZWxldGUoaSl9ciYmIVYoaSkmJnA/Lm9ic2VydmUoaSl9LF89ZnVuY3Rpb24oKXtmb3IobGV0W2ksdV1vZiBlKSghaS5pc0Nvbm5lY3RlZHx8IWkubWF0Y2hlcyhuKXx8dChpLCJ2YWx1ZSIpIT09dS52YWx1ZXx8dChpLCJudW1iZXIiKSE9PXUubnVtYmVyKSYmdS5kaXNwb3NlKCk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChuKS5mb3JFYWNoKGk9PntlLmhhcyhpKXx8UihpKX0pfTtoZT14LGZlPUYsZ2U9RyxiZT1SLHZlPV87bGV0IG49Ii5lZC1hbmltYXRlZC1jb3VudGVyW2RhdGEtZWQtY291bnRlcl0iLGU9bmV3IE1hcCxhPW1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikscz17bnVtYmVyOiIuZWQtYW5pbWF0ZWQtY291bnRlcl9fbnVtYmVyIix2YWx1ZToiLmVkLWFuaW1hdGVkLWNvdW50ZXJfX3ZhbHVlIixwcmVmaXg6Ii5lZC1hbmltYXRlZC1jb3VudGVyX19wcmVmaXgiLHN1ZmZpeDoiLmVkLWFuaW1hdGVkLWNvdW50ZXJfX3N1ZmZpeCIsbGFiZWw6Ii5lZC1hbmltYXRlZC1jb3VudGVyX19sYWJlbCIsaWNvbjoiLmVkLWFuaW1hdGVkLWNvdW50ZXJfX2ljb24iLGFjY2Vzc2libGVUZXh0OiIuZWQtYW5pbWF0ZWQtY291bnRlcl9fYWNjZXNzaWJsZS10ZXh0In0sdD0oaSx1KT0+Wy4uLmkucXVlcnlTZWxlY3RvckFsbChzW3VdKV0uZmluZChkPT5kLmNsb3Nlc3Qobik9PT1pKSxvPXtyZW5kZXI6KGksdSk9PntpLnRleHRDb250ZW50PXV9fSxjPS4wMSxwPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09ImZ1bmN0aW9uIj9uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaT0+e2ZvcihsZXQgdSBvZiBpKXtsZXQgZD1lLmdldCh1LnRhcmdldCkscj11LmlzSW50ZXJzZWN0aW5nJiZ1LmludGVyc2VjdGlvblJhdGlvPj1jOyFkfHxkLnZpc2libGU9PT1yfHwoZC52aXNpYmxlPXIscj9kLnN0YXJ0KCk6ZC5zZXR0bGUoKSl9fSx7dGhyZXNob2xkOlswLGNdfSk6bnVsbCxiPWk9PmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSE9PSJoaWRkZW4iJiZpLmNoZWNrVmlzaWJpbGl0eT8uKHtvcGFjaXR5UHJvcGVydHk6ITAsdmlzaWJpbGl0eVByb3BlcnR5OiEwLGNoZWNrT3BhY2l0eTohMCxjaGVja1Zpc2liaWxpdHlDU1M6ITB9KSE9PSExLGc9bmV3IFNldCxEPW51bGwsVj1pPT5pLmhhc0F0dHJpYnV0ZSgiZGF0YS1ldGNoLWhhcy1jdXN0b20tY2xhc3NlcyIpLEU9ZWUubWFwKE8pLEM9bmV3IE1hcCxBPW5ldyBXZWFrU2V0O25ldyBNdXRhdGlvbk9ic2VydmVyKGk9PntsZXQgdT0hMSxkPW5ldyBTZXQ7Zm9yKGxldCByIG9mIGkpe2xldCB2PXIudGFyZ2V0Lm5vZGVUeXBlPT09Mz9yLnRhcmdldC5wYXJlbnRFbGVtZW50OnIudGFyZ2V0O2lmKHY/Lm5vZGVUeXBlPT09MSl7bGV0IG09di5jbG9zZXN0KG4pLGY9ZS5nZXQobSk7ZiYmKHY9PT1mLm51bWJlcnx8di5jbG9zZXN0KHMucHJlZml4KyIsICIrcy5zdWZmaXgpKSYmZi5yZWZyZXNoU2VtYW50aWMoKSxmJiYodj09PW18fHQobSwibGFiZWwiKT8uY29udGFpbnModil8fHQobSwiaWNvbiIpPy5jb250YWlucyh2KSkmJmYucmVmcmVzaEVtcHR5KCl9aWYoci50eXBlPT09ImF0dHJpYnV0ZXMiKXtsZXQgbT1yLnRhcmdldC5jbG9zZXN0KG4pLGY9ZS5nZXQobSk7KHIudGFyZ2V0PT09bXx8ci50YXJnZXQ9PT1mPy52YWx1ZSkmJmY/LmRpc3Bvc2UoKSxyLnRhcmdldD09PW0mJlYobSkmJkEuaGFzKG0pJiZFLmluY2x1ZGVzKHIuYXR0cmlidXRlTmFtZSkmJnIub2xkVmFsdWUhPT1tLmdldEF0dHJpYnV0ZShyLmF0dHJpYnV0ZU5hbWUpJiZkLmFkZChtKSx1PSEwfWVsc2VbLi4uci5hZGRlZE5vZGVzLC4uLnIucmVtb3ZlZE5vZGVzXS5zb21lKG09Pm0ubm9kZVR5cGU9PT0xJiYhbS5jbGFzc0xpc3QuY29udGFpbnMoImVkLWFuaW1hdGVkLWNvdW50ZXJfX2FjY2Vzc2libGUiKSkmJih1PSEwKX11JiZfKCksZC5mb3JFYWNoKEcpfSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQse2NoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITAsYXR0cmlidXRlczohMCxhdHRyaWJ1dGVPbGRWYWx1ZTohMCxhdHRyaWJ1dGVGaWx0ZXI6Wy4uLlUubWFwKE8pLC4uLnJlLCJkYXRhLWV0Y2gtaGFzLWN1c3RvbS1jbGFzc2VzIl19KSxhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pntmb3IobGV0IGkgb2YgZS52YWx1ZXMoKSlhLm1hdGNoZXM/aS5zZXR0bGUoKTppLnZpc2libGUmJmkuc3RhcnQoKX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLEYpLGFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXByaW50IiwoKT0+e2ZvcihsZXQgaSBvZiBlLnZhbHVlcygpKWkuc2V0dGxlKCl9KSxnbG9iYWxUaGlzW3FdPXtzY2FuOl99LF8oKX12YXIgaGUsZmUsZ2UsYmUsdmU7fSkoKTsKCn0K","id":"jw05nyl"},"tag":"div","attributes":{"data-ed-counter":"","data-end-value":"{props.endValue}","data-start-value":"{props.startValue}","data-decimal-places":"{props.decimalPlaces}","data-duration":"{props.duration}","data-delay":"{props.delay}","data-use-easing":"{props.useEasing}","data-thousands-separator":"{props.thousandsSeparator}","data-decimal-separator":"{props.decimalSeparator}","data-animate-once":"{props.animateOnce}","data-ed-counter-label-position":"{props.labelPosition}","data-ed-counter-number-font":"{props.numberFont}","class":"ed-animated-counter"},"styles":["xx2umi7"]},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Icon"},"tag":"div","attributes":{"aria-hidden":"true","class":"ed-animated-counter__icon"},"styles":["e1256o5"]},"innerBlocks":[{"blockName":"etch/slot-placeholder","attrs":{"name":"icon"},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Number"},"tag":"div","attributes":{"style":"font-size: {props.numberSize}; font-weight: {props.numberWeight};","class":"ed-animated-counter__number"},"styles":["zlh4cwt"]},"innerBlocks":[{"blockName":"etch/condition","attrs":{"condition":{"leftHand":"props.accessibleText.trim()","operator":"!=","rightHand":"\"\""},"conditionString":"props.accessibleText.trim() != \"\""},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Accessible Text"},"tag":"span","attributes":{"class":"ed-animated-counter__accessible-text"},"styles":["02yrrz8"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.accessibleText}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"tag":"span","attributes":{"aria-hidden":"true"}},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Prefix"},"tag":"span","attributes":{"class":"ed-animated-counter__prefix"},"styles":["r5xyr0z"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.prefix}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Value"},"tag":"span","attributes":{"data-ed-counter-final":"{props.endValue.numberFormat(props.decimalPlaces.add(0), props.decimalSeparator, props.thousandsSeparator.replace(\"space\", \" \").replace(\"none\", \"\"))}","data-ed-counter-end-value":"{props.endValue}","data-ed-counter-decimal-places":"{props.decimalPlaces}","data-ed-counter-thousands-separator":"{props.thousandsSeparator}","data-ed-counter-decimal-separator":"{props.decimalSeparator}","class":"ed-animated-counter__value"},"styles":["c4fso3s"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.endValue.numberFormat(props.decimalPlaces.add(0), props.decimalSeparator, props.thousandsSeparator.replace(\"space\", \" \").replace(\"none\", \"\"))}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Suffix"},"tag":"span","attributes":{"class":"ed-animated-counter__suffix"},"styles":["e3yctwh"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.suffix}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]},{"blockName":"etch/condition","attrs":{"condition":{"leftHand":"props.accessibleText.trim()","operator":"==","rightHand":"\"\""},"conditionString":"props.accessibleText.trim() == \"\""},"innerBlocks":[{"blockName":"etch/element","attrs":{"metadata":{"name":"Prefix"},"tag":"span","attributes":{"class":"ed-animated-counter__prefix"},"styles":["r5xyr0z"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.prefix}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Value"},"tag":"span","attributes":{"data-ed-counter-final":"{props.endValue.numberFormat(props.decimalPlaces.add(0), props.decimalSeparator, props.thousandsSeparator.replace(\"space\", \" \").replace(\"none\", \"\"))}","data-ed-counter-end-value":"{props.endValue}","data-ed-counter-decimal-places":"{props.decimalPlaces}","data-ed-counter-thousands-separator":"{props.thousandsSeparator}","data-ed-counter-decimal-separator":"{props.decimalSeparator}","class":"ed-animated-counter__value"},"styles":["c4fso3s"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.endValue.numberFormat(props.decimalPlaces.add(0), props.decimalSeparator, props.thousandsSeparator.replace(\"space\", \" \").replace(\"none\", \"\"))}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Suffix"},"tag":"span","attributes":{"class":"ed-animated-counter__suffix"},"styles":["e3yctwh"]},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.suffix}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]},{"blockName":"etch/element","attrs":{"metadata":{"name":"Label"},"tag":"div","attributes":{"style":"font-size: {props.labelSize}; font-weight: {props.labelWeight};","class":"ed-animated-counter__label"},"styles":["hcdwfxk"]},"innerBlocks":[{"blockName":"etch/condition","attrs":{"condition":{"leftHand":"props.label.trim()","operator":"!=","rightHand":"\"\""},"conditionString":"props.label.trim() != \"\""},"innerBlocks":[{"blockName":"etch/text","attrs":{"metadata":{"name":"Text"},"content":"{props.label}"},"innerBlocks":[],"innerHTML":"","innerContent":[]}],"innerHTML":"\n\n","innerContent":["\n",null,"\n"]},{"blockName":"etch/slot-placeholder","attrs":{"name":"customLabel"},"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n","\n"]}],"innerHTML":"\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n"]}],"innerHTML":"\n\n\n\n\n\n","innerContent":["\n",null,"\n\n",null,"\n\n",null,"\n"]}],"properties":[{"name":"End value","key":"endValue","description":"Required numeric value; use a dot for input decimals, without grouping.","type":{"primitive":"string"},"default":"1250"},{"name":"Start value","key":"startValue","description":"Numeric start; negative values and counting down are supported.","type":{"primitive":"string"},"default":"0"},{"name":"Decimal places","key":"decimalPlaces","description":"Integer 0–10. Set 1 for 98.7 or 2 for 1.25; shared by server and animation.","type":{"primitive":"string"},"default":"0"},{"name":"Prefix","key":"prefix","description":"Optional text before the number, such as $.","type":{"primitive":"string"},"default":""},{"name":"Suffix","key":"suffix","description":"Optional text after the number, such as + or %.","type":{"primitive":"string"},"default":""},{"name":"Screen reader text","key":"accessibleText","description":"Optional. Screen readers read this instead of the visible number, for example \"1.25 million dollars\" for $1.25M.","type":{"primitive":"string"},"default":""},{"name":"Label","key":"label","description":"Optional plain text. For a heading, link or other rich content use the customLabel slot.","type":{"primitive":"string"},"default":""},{"name":"Label position","key":"labelPosition","description":"Left and right follow the text direction and wrap below when there is not enough room.","type":{"primitive":"string","specialized":"select"},"default":"below","selectOptionsString":"Below the number : below\nAbove the number : above\nLeft of the number : start\nRight of the number : end"},{"name":"Number size","key":"numberSize","description":"Optional CSS font size, such as 3rem, 2em or var(--h1, 3rem). Empty uses the styling tokens (H2 by default).","type":{"primitive":"string"},"default":""},{"name":"Number weight","key":"numberWeight","description":"Optional CSS font weight, such as 400 or var(--heading-font-weight, 700). Empty uses the styling tokens (heading weight by default).","type":{"primitive":"string"},"default":""},{"name":"Number font","key":"numberFont","description":"Heading font uses the ACSS heading font family when one is set in the ACSS dashboard.","type":{"primitive":"string","specialized":"select"},"default":"inherit","selectOptionsString":"Inherited : inherit\nHeading font : heading"},{"name":"Label size","key":"labelSize","description":"Optional CSS font size, such as 1.25rem or var(--text-l, 1.25rem). Empty uses the styling tokens.","type":{"primitive":"string"},"default":""},{"name":"Label weight","key":"labelWeight","description":"Optional CSS font weight, such as 600. Empty uses the styling tokens.","type":{"primitive":"string"},"default":""},{"name":"Duration (seconds)","key":"duration","description":"Up to 5 seconds; longer values play in 5 seconds. 0 shows the final value without animation.","type":{"primitive":"string"},"default":"2"},{"name":"Delay (milliseconds)","key":"delay","description":"0–60000 milliseconds after entering the viewport.","type":{"primitive":"string"},"default":"0"},{"name":"Use easing","key":"useEasing","description":"CountUp native easing.","type":{"primitive":"string","specialized":"select"},"default":"true","selectOptionsString":"Yes : true\nNo : false"},{"name":"Thousands separator","key":"thousandsSeparator","description":"Groups thousands. Space is a no-break space: the groups stay on one line unless the number is wider than its container.","type":{"primitive":"string","specialized":"select"},"default":",","selectOptionsString":"Comma (1,250) : ,\nPeriod (1.250) : .\nSpace (1 250) : space\nApostrophe (1’250) : ’\nNone (1250) : none"},{"name":"Decimal separator","key":"decimalSeparator","description":"Plain text decimal separator, such as . or ,","type":{"primitive":"string"},"default":"."},{"name":"Animate once","key":"animateOnce","description":"One completed animation per instance; No replays on each entry.","type":{"primitive":"string","specialized":"select"},"default":"true","selectOptionsString":"Yes : true\nNo : false"}],"description":"ED Animated Counter 1.0.0-beta.3 — self-contained CountUp.js statistics"}},"version":2.1}Stay up to date. Etch won’t update a pasted component for you. Subscribe and get one email when a new version is out.
21 counters in real layouts
Scroll inside the frame: each counter starts when it comes into view. Switch to Mobile to see the layouts at phone width.
What it does
One pasted component and no setup. CountUp.js is bundled, so there is no plugin, no CDN and no extra request, and every counter on a page shares one observer.
Real number in the HTML
Etch renders the final value on the server, so search engines, screen readers, printouts and visitors without JavaScript get 1,250, never 0.
Starts when it can be seen
Counting begins once at least 1% of the counter is in view and visible. Counters in a hidden tab panel, a faded-out slide or a background browser tab wait until they are shown.
Accessible by default
Screen readers hear the final value once, never the moving digits. Reduced motion shows the final value straight away, and no animation runs longer than 5 seconds.
Any number format
Up to 10 decimal places, a prefix and a suffix, five thousands separators and a period or comma for decimals. Negative values and counting down work too.
Label in four positions
Below, above, left or right of the number. Side labels wrap below on narrow screens, and the reading order stays number first.
Icon and rich label slots
Put an SVG or an image in the icon slot, or a heading and a link in the customLabel slot.
40 styling variables
Colors, sizes, weights, spacing and layout, set on any parent class. ACSS 4 tokens with plain fallbacks, so it works without Automatic.css too.
Preview in the builder
Change End value, Start value, Duration, Delay or Use easing and the counter plays once, so you can judge the timing without saving. A setting that stops it from animating gets a dashed outline and a note.
Add it in four steps
No plugin and no build step. The component brings its own CSS and script with CountUp.js bundled, so nothing loads from a CDN. It works with or without Automatic.css 4.
Shows without its styles? It was pasted but not saved, and pasting again won’t repair it. Delete ED Animated Counter from your components, paste it again and click Save.
- Copy the componentUse Copy component at the top of this page, or download the .json file.
- Paste it on the Etch canvasSelect where it should go, press Ctrl+V or ⌘V, then click Save. Etch adds the component to your list right away but stores its CSS only when you save.
- Enter your numberSet End value with a dot for decimals and no grouping, such as 1250 or 98.7. Add Decimal places, Prefix, Suffix and a Label as needed.
- Save and open the pageThe builder shows the final value and plays a short preview when you change the number or the timing. On the page, each counter starts when it scrolls into view.
19 settings in the Etch props panel
Grouped by topic here; the names match the Etch props panel, where each setting has help text too. Only End value is required: a new counter shows 1,250 and nothing else until you fill in the rest.
Free to use. Not for resale.
Licensed under FSL-1.1-MIT, the Functional Source License with an MIT future license. Each version becomes MIT-licensed two years after its release.
- Use it on unlimited personal, client and commercial websites
- Modify and adapt it however you like
- Use it in paid design and development work for your clients
- Sell it, or a modified version, as a component: in a library, bundle, template kit, plugin or marketplace listing
- Offer it in another commercial product or service that competes with it
Keep the copyright and license notices in the code, and link to this page instead of re-hosting the download, so everyone gets fixes and updates. Read the full license
Third-party code
This component bundles the open-source library below. It keeps its own license, and FSL-1.1-MIT does not apply to it. Its notice is included in the component’s script; keep it when you use or change the component.
- CountUp.js2.10.1
How to update
Etch has no update button for pasted components. Pasting a newer version over an installed one changes nothing: Etch keeps the component and the CSS it already has. To update, reinstall in five steps.
- Note what you setWrite down the settings and slot content of each counter, and copy any CSS you changed in the component’s own styles.
- Delete the componentIn Etch, delete ED Animated Counter from your components. Every counter disappears from every page that used it.
- Delete its stylesIn the Style Manager, search for ed-animated-counter and delete the eight styles listed below.
- Paste the new versionCopy or download the new JSON from this page, paste it on the canvas and click Save. Etch creates the component and its CSS fresh.
- Put your counters backInsert a counter wherever one was, re-enter its settings and save. Reload any other open builder tab.
Styles to delete in step 3
.ed-animated-counter.ed-animated-counter__icon.ed-animated-counter__accessible-text.ed-animated-counter__number.ed-animated-counter__prefix.ed-animated-counter__value.ed-animated-counter__suffix.ed-animated-counter__label
Trade-offs
- Placements are not kept. Etch doesn’t link old counters to the new component, so you insert each one again and re-enter its settings.
- Edits inside the component’s CSS are replaced. Keep overrides on a parent class with the
--ed-animated-counter-*variables; those survive an update. - Skipping a step leaves a mix. Without step 2, Etch keeps the old component. Without step 3, the new version runs on the old CSS.
Coming from 1.0.0-beta.2? Follow the five steps above. Settings and slots are unchanged, so you can re-enter them as they were. Subscribe and you’ll get one email when the next version is out.
What changed
Versions follow semantic versioning. When an update changes how existing options behave, its entry says so.
1.0.0-beta.3Latest
- FixedWith TalkBack, a counter that started under the screen reader focus read its value twice and once moved the focus to the top of the page. A counter that finished under the focus was read again on the next swipe.
- FixedDuring an animation, touching the number found nothing when an icon or a label sat above it (TalkBack, VoiceOver on iOS). With Screen reader text, touching the number found nothing in TalkBack. The number now stays in the accessibility tree and reads its value the whole time.
- ChangedThe HTML and CSS of the number changed, so update the component and its eight styles together (see How to update). Props, slots, classes and styling variables are the same. Screen reader text now sits inside
.ed-animated-counter__number, so your own CSS that targeted.ed-animated-counter__accessible-textas a direct child of the counter needs the same change. - TestedTalkBack, VoiceOver on macOS and in the iOS Simulator, NVDA, Safari and Microsoft Edge. It stays a beta until VoiceOver is tested on a real iPhone.
1.0.0-beta.2
- ReleasedFirst public version. It stays a beta until VoiceOver on iOS, TalkBack and Microsoft Edge are tested.
Tell me what this component needs
A bug, a missing option, or anything that made the component awkward to use in a real build — it all belongs here. The versions above are the ones it was tested on; if yours differ, say so.