AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive reference for using the GreenSock Animation Platform (GSAP) to create high-quality web animations. It covers core concepts such as tweens, timelines, easing, and staggering, as well as advanced functionality like ScrollTrigger for scroll-driven storytelling. The guide also addresses common performance pitfalls, such as layout-induced jank, and provides best practices for integrating GSAP into modern frameworks like React, including proper cleanup to prevent memory leaks.
What it does
- Explains how to create and chain complex animation sequences using GSAP timelines.
- Provides patterns for scroll-driven animations using the ScrollTrigger plugin.
- Offers guidance on performance optimization by prioritizing transforms over layout properties.
- Details best practices for integrating animations in single-page applications (SPAs).
- Includes common troubleshooting steps for animation issues and layout reflows.
When to use it
- When building high-quality UI motion, page transitions, or micro-interactions.
- When you need to orchestrate complex, multi-element animation sequences.
- When implementing scroll-based storytelling or pinned sections.
- When debugging animation performance or layout-related jank.
- When integrating GSAP into React or other component-based frameworks.
Advantages
- Enables precise control over animation timing and sequencing.
- Provides robust tools for scroll-based interactions.
- Helps avoid common performance bottlenecks in web animations.
- Supports clean integration patterns for modern JavaScript frameworks.
Usage examples
- “Create a hero section entrance animation where elements fade in and slide up with a stagger effect.”
- The agent provides a GSAP from() tween using autoAlpha and y-transforms with a stagger property to animate elements sequentially.
- “How do I pin a section while scrubbing through an animation as the user scrolls?”
- The agent provides a ScrollTrigger configuration with pin, scrub, and trigger parameters to link the animation timeline to the scroll position.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/mengto/gsap/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip gsap.zip -d .agents/skills
Documentation by Meng To
GSAP (GreenSock) — Web Animation Skill
When to use
High-quality UI/motion design: entrances, micro-interactions, page transitions
Timeline-based sequences (vs. scattered CSS transitions)
Scroll-driven storytelling (with ScrollTrigger)
Complex easing, staggering, orchestration across many elements
Key concepts & APIs
Tweens:
gsap.to(targets, vars)gsap.from(targets, vars)gsap.fromTo(targets, fromVars, toVars)
Timelines:
const tl = gsap.timeline({ defaults, repeat, yoyo, paused })Chain:
tl.to(...).from(...).addLabel('x').add(() => ...)Position parameter: absolute
1.2, relative"+=0.5", overlap"-=0.3", label"intro"
Eases:
ease: "power2.out","expo.inOut","elastic.out(1, 0.3)"Staggers:
stagger: 0.05or{ each, from: "start|center|end|random", grid }Performance-friendly properties:
Prefer transforms (
x,y,scale,rotation) and opacity (autoAlpha)
ScrollTrigger (plugin):
gsap.registerPlugin(ScrollTrigger)Inline:
gsap.to(".box", { scrollTrigger: ".box", x: 500 })Advanced:
scrollTrigger: { trigger, start, end, scrub, pin, snap, markers }Standalone:
ScrollTrigger.create({ trigger, start, end, onUpdate, onToggle })
Common pitfalls (and fixes)
Animating layout properties (top/left/width/height) → jank
Use transforms, add
will-change: transform, avoid forced reflow.
ScrollTrigger “not firing” due to wrong trigger sizing/overflow containers
Ensure trigger exists, has height, and check scroll container (nested scrolling needs config).
Not cleaning up in SPA/React
Use
gsap.context()and revert on unmount; kill triggers (ScrollTrigger.getAll().forEach(t => t.kill())) if needed.
FOUC / measuring before fonts/images load
Initialize after layout is stable; run
ScrollTrigger.refresh()after images load.
Quick recipes
1) Hero entrance (stagger)
gsap.from(".hero [data-anim]", {
y: 24,
autoAlpha: 0,
duration: 0.8,
ease: "power2.out",
stagger: 0.06,
});2) Sequenced timeline
const tl = gsap.timeline({ defaults: { ease: "power2.out", duration: 0.6 } });
tl.from(".nav", { y: -20, autoAlpha: 0 })
.from(".hero-title", { y: 30, autoAlpha: 0 }, "-=0.2")
.from(".hero-cta", { scale: 0.95, autoAlpha: 0 }, "-=0.2");3) Scroll-scrub pinned section
gsap.registerPlugin(ScrollTrigger);
gsap.timeline({
scrollTrigger: {
trigger: ".story",
start: "top top",
end: "+=800",
scrub: 1,
pin: true,
},
}).to(".story .panel", { xPercent: -200 });What to ask the user (if requirements unclear)
Is this a static site or SPA (React/Next/Vue)? Any page transitions?
Do we need scroll-driven sections (pin/scrub/snap)?
Performance constraints (mobile support, reduced motion)?
Files
- ATTRIBUTION.mdAdded by AutoGineer830 B
- LICENSELicence file added by AutoGineer1.0 KiB
- REFERENCES.md198 B
- SKILL.md3.0 KiB
- demo/PROMPT.md2.4 KiB
- demo/assets/page-01-4f5668c5-fc4a-44e0-bc5e-a664189d3c31-800w.jpg52.1 KiB
- demo/assets/page-02-0d868fef-f560-45ca-ab35-5dad4fc29059-800w.webp54.3 KiB
- demo/assets/source-preview.jpg34.3 KiB
- demo/index.html34.5 KiB
- demo/preview.jpg30.7 KiB
- demo/source.json3.6 KiB
demo/index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="neuform-sandboxed-demo" content="1">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; connect-src 'self'; frame-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; object-src 'none'">
<title>Sandboxed Neuform demo</title>
<style>
html, body, iframe { width: 100%; height: 100%; margin: 0; border: 0; }
body { overflow: hidden; background: #0b0b0b; }
iframe { display: block; background: white; }
.error { box-sizing: border-box; min-height: 100%; padding: 32px; color: #fff; font: 16px/1.5 system-ui, sans-serif; }
</style>
</head>
<body>
<iframe id="neuform-demo" title="Sandboxed Neuform design demo" sandbox="allow-scripts" referrerpolicy="no-referrer"></iframe>
<script>
const encodedHtml = "PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIiBjbGFzcz0iYW50aWFsaWFzZWQgc2VsZWN0aW9uOmJnLXB1cnBsZS01MDAvMzAgc2VsZWN0aW9uOnRleHQtd2hpdGUiPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9ImRlZmF1bHQtc3JjICdub25lJzsgYmFzZS11cmkgJ25vbmUnOyBjb25uZWN0LXNyYyAnbm9uZSc7IGZvbnQtc3JjIGRhdGE6IGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb207IGZvcm0tYWN0aW9uICdub25lJzsgZnJhbWUtc3JjICdub25lJzsgaW1nLXNyYyBibG9iOjsgbWVkaWEtc3JjIGJsb2I6OyBuYXZpZ2F0ZS10byAnbm9uZSc7IG9iamVjdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyBfX05FVUZPUk1fUlVOVElNRV9TT1VSQ0VTX187IHN0eWxlLXNyYyAndW5zYWZlLWlubGluZScgaHR0cHM6Ly9hcGkuZm9udHNoYXJlLmNvbSBodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tOyB3b3JrZXItc3JjICdub25lJyI+CjxzY3JpcHQgZGF0YS1uZXVmb3JtLWFzc2V0LWJvb3RzdHJhcD4KKCgpID0+IHsKICBsZXQgcmVjZWl2ZWQgPSBmYWxzZTsKICBjb25zdCBvYmplY3RVcmxzID0gW107CiAgY29uc3QgcmVwbGFjZUFsbCA9ICh2YWx1ZSwgcmVwbGFjZW1lbnRzKSA9PiB7CiAgICBsZXQgbmV4dCA9IFN0cmluZyh2YWx1ZSB8fCAiIik7CiAgICBmb3IgKGNvbnN0IFtmaWxlLCBvYmplY3RVcmxdIG9mIHJlcGxhY2VtZW50cykgbmV4dCA9IG5leHQuc3BsaXQoZmlsZSkuam9pbihvYmplY3RVcmwpOwogICAgcmV0dXJuIG5leHQ7CiAgfTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgaWYgKHJlY2VpdmVkIHx8IGV2ZW50LnNvdXJjZSAhPT0gcGFyZW50IHx8IGV2ZW50LmRhdGE/LnR5cGUgIT09ICJuZXVmb3JtLWFzc2V0cy12MSIpIHJldHVybjsKICAgIHJlY2VpdmVkID0gdHJ1ZTsKICAgIGNvbnN0IHJlcGxhY2VtZW50cyA9IFtdOwogICAgZm9yIChjb25zdCBhc3NldCBvZiBldmVudC5kYXRhLmFzc2V0cyB8fCBbXSkgewogICAgICBpZiAoIWFzc2V0IHx8IHR5cGVvZiBhc3NldC5maWxlICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgYXNzZXQuYmFzZTY0ICE9PSAic3RyaW5nIikgY29udGludWU7CiAgICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYXNzZXQuYmFzZTY0KTsKICAgICAgY29uc3QgYnl0ZXMgPSBVaW50OEFycmF5LmZyb20oYmluYXJ5LCAoY2hhcmFjdGVyKSA9PiBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSk7CiAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBhc3NldC5jb250ZW50VHlwZSB8fCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiB9KSk7CiAgICAgIG9iamVjdFVybHMucHVzaChvYmplY3RVcmwpOwogICAgICByZXBsYWNlbWVudHMucHVzaChbYXNzZXQuZmlsZSwgb2JqZWN0VXJsXSk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiKiIpKSB7CiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInNyYyIsICJwb3N0ZXIiLCAic3Jjc2V0IiwgInN0eWxlIl0pIHsKICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgIGlmICh2YWx1ZSkgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgcmVwbGFjZUFsbCh2YWx1ZSwgcmVwbGFjZW1lbnRzKSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSkgewogICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHJlcGxhY2VBbGwoc3R5bGUudGV4dENvbnRlbnQsIHJlcGxhY2VtZW50cyk7CiAgICB9CiAgfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VoaWRlIiwgKCkgPT4gewogICAgZm9yIChjb25zdCBvYmplY3RVcmwgb2Ygb2JqZWN0VXJscykgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpOwogIH0sIHsgb25jZTogdHJ1ZSB9KTsKfSkoKTsKPC9zY3JpcHQ+Cgo8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+QXVyYSAtIEZsdWlkIERyYWcgSW50ZXJhY3Rpb25zPC90aXRsZT4KICAgIAogICAgPCEtLSBGb250cyAtLT4KICAgIDxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSI+CiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20iIGNyb3Nzb3JpZ2luPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1QbHVzK0pha2FydGErU2Fuczp3Z2h0QDQwMDs1MDA7NjAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIAogICAgPCEtLSBUYWlsd2luZCBDU1MgLS0+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vLi4vLi4vYXNzZXRzL3J1bnRpbWUvcnVudGltZS1jY2M4ODk0YjM0MTgtcnVudGltZS5qcyI+PC9zY3JpcHQ+CiAgICAKICAgIDwhLS0gSWNvbmlmeSAtLT4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi8uLi8uLi9hc3NldHMvcnVudGltZS9ydW50aW1lLTE2M2ViZDA4N2NmYy1pY29uaWZ5LWljb24tbWluLmpzIj48L3NjcmlwdD4KICAgIAogICAgPCEtLSBUaHJlZS5qcyAmIEdTQVAgLS0+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vLi4vLi4vYXNzZXRzL3J1bnRpbWUvcnVudGltZS0yNTAyM2I1MjFkNzctdGhyZWUtbWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi8uLi8uLi9hc3NldHMvcnVudGltZS9ydW50aW1lLTAyNzA1MWVmZmE0Ny1nc2FwLW1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8IS0tIEFkZGVkIEdTQVAgRHJhZ2dhYmxlIC0tPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uLy4uL2Fzc2V0cy9ydW50aW1lL3J1bnRpbWUtOGRhMmM5ZTBlNTYyLWRyYWdnYWJsZS1taW4uanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQ+CiAgICAgICAgdGFpbHdpbmQuY29uZmlnID0gewogICAgICAgICAgICB0aGVtZTogewogICAgICAgICAgICAgICAgZXh0ZW5kOiB7CiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogewogICAgICAgICAgICAgICAgICAgICAgICBzYW5zOiBbJyJQbHVzIEpha2FydGEgU2FucyInLCAnc2Fucy1zZXJpZiddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY29sb3JzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZzogJyMxNjA5MjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhcmU6ICcjNUIxRTkxJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIDwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJyZWxhdGl2ZSBtaW4taC1zY3JlZW4gYmctYnJhbmQtYmcgdGV4dC13aGl0ZSBvdmVyZmxvdy1oaWRkZW4iIHN0eWxlPSJmb250LWZhbWlseTogJ1BsdXMgSmFrYXJ0YSBTYW5zJywgc2Fucy1zZXJpZjsiPgoKICAgIDwhLS0gQmFja2dyb3VuZCBFbGVtZW50czogR3JhZGllbnQgRmxhcmUgLS0+CiAgICA8ZGl2IGNsYXNzPSJmaXhlZCBpbnNldC0wIHotMCBwb2ludGVyLWV2ZW50cy1ub25lIiBzdHlsZT0iYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA1MCUgNjAlLCByZ2JhKDkxLCAzMCwgMTQ1LCAwLjUpIDAlLCByZ2JhKDIyLCA5LCAzOSwgMSkgNjUlKTsiPjwvZGl2PgoKICAgIDwhLS0gV2ViR0wgQ2FudmFzIGZvciBEb3QgTWF0cml4IFBhcnRpY2xlIEZpZWxkIC0tPgogICAgPGNhbnZhcyBpZD0id2ViZ2wtY2FudmFzIiBjbGFzcz0iZml4ZWQgaW5zZXQtMCB6LVsxXSBwb2ludGVyLWV2ZW50cy1ub25lIj48L2NhbnZhcz4KCiAgICA8IS0tIERpcmVjdGl2ZTogRnJhbWVkIEdyaWQgTGF5b3V0IC0tPgogICAgPGRpdiBjbGFzcz0iZml4ZWQgaW5zZXQtNCBzbTppbnNldC02IGxnOmluc2V0LTggei0xMCBwb2ludGVyLWV2ZW50cy1ub25lIGJvcmRlciBib3JkZXItd2hpdGUvMTAgcm91bmRlZC1bMzJweF0gb3ZlcmZsb3ctaGlkZGVuIG1peC1ibGVuZC1vdmVybGF5Ij4KICAgICAgICA8IS0tIENvcm5lciBCcmFja2V0cyAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgdy0xMiBoLTEyIGJvcmRlci10IGJvcmRlci1sIGJvcmRlci13aGl0ZS8zMCByb3VuZGVkLXRsLVszMnB4XSI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYWJzb2x1dGUgdG9wLTAgcmlnaHQtMCB3LTEyIGgtMTIgYm9yZGVyLXQgYm9yZGVyLXIgYm9yZGVyLXdoaXRlLzMwIHJvdW5kZWQtdHItWzMycHhdIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy0xMiBoLTEyIGJvcmRlci1iIGJvcmRlci1sIGJvcmRlci13aGl0ZS8zMCByb3VuZGVkLWJsLVszMnB4XSI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYWJzb2x1dGUgYm90dG9tLTAgcmlnaHQtMCB3LTEyIGgtMTIgYm9yZGVyLWIgYm9yZGVyLXIgYm9yZGVyLXdoaXRlLzMwIHJvdW5kZWQtYnItWzMycHhdIj48L2Rpdj4KICAgICAgICAKICAgICAgICA8IS0tIFN1YnRsZSBEaWFnb25hbCBUZXh0dXJlIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIGluc2V0LTAgb3BhY2l0eS1bMC4wM10iIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQgMTBweCwgI2ZmZmZmZiAxMHB4LCAjZmZmZmZmIDExcHgpOyI+PC9kaXY+CiAgICAgICAgPCEtLSBHcmlkIEd1aWRlbGluZXMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iYWJzb2x1dGUgbGVmdC0xLzIgdG9wLTAgYm90dG9tLTAgdy1bMXB4XSBiZy13aGl0ZS81IC10cmFuc2xhdGUteC0xLzIiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIHRvcC1bMjAlXSBsZWZ0LTAgcmlnaHQtMCBoLVsxcHhdIGJnLXdoaXRlLzUiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPCEtLSBNYWluIENvbnRlbnQgLS0+CiAgICA8bWFpbiBjbGFzcz0icmVsYXRpdmUgei0yMCBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBtaW4taC1zY3JlZW4gcHQtOCBzbTpwdC0xMiBweC00IHNtOnB4LTggdy1mdWxsIG1heC13LVsxNDAwcHhdIG14LWF1dG8iPgogICAgICAgIAogICAgICAgIDwhLS0gSGVhZGVyIC0tPgogICAgICAgIDxoZWFkZXIgY2xhc3M9InctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgbWItMTAgc206bWItMTYgaGVyby1hbmltIG9wYWNpdHktMCB0cmFuc2xhdGUteS00Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idy0xMCI+PC9kaXY+IDwhLS0gU3BhY2VyIC0tPgogICAgICAgICAgICAKICAgICAgICAgICAgPCEtLSBMb2dvIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBwci0xMCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LTEwIGgtWzIycHhdIGJnLWdyYWRpZW50LXRvLXIgZnJvbS13aGl0ZSB0by13aGl0ZS80MCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgcHgtWzNweF0gc2hhZG93LVswXzBfMTVweF9yZ2JhKDI1NSwyNTUsMjU1LDAuMildIj4KICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy00IGgtNCBiZy1ibGFjayByb3VuZGVkLWZ1bGwiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dC1bMjJweF0gZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodCI+QXVyYS48L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAKICAgICAgICAgICAgPCEtLSBWaWRlbyBJY29uIEJ1dHRvbiAtLT4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idy0xMSBoLTExIGJnLXdoaXRlLzUgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJhY2tkcm9wLWJsdXItbWQgYm9yZGVyIGJvcmRlci13aGl0ZS8xMCBob3ZlcjpiZy13aGl0ZS8xMCBob3ZlcjpzY2FsZS0xMDUgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMzAwIj4KICAgICAgICAgICAgICAgIDxpY29uaWZ5LWljb24gaWNvbj0ic29sYXI6dmlkZW8tY2FtZXJhLXJlY29yZC1saW5lYXIiIGNsYXNzPSJ0ZXh0LTJ4bCI+PC9pY29uaWZ5LWljb24+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvaGVhZGVyPgoKICAgICAgICA8IS0tIFR5cG9ncmFwaHkgU2VjdGlvbiAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LWNlbnRlciB6LTMwIG1iLTggc206bWItMTYgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgcG9pbnRlci1ldmVudHMtbm9uZSI+CiAgICAgICAgICAgIDxoMSBjbGFzcz0iaGVyby1hbmltIG9wYWNpdHktMCB0cmFuc2xhdGUteS02IHRleHQtNnhsIHNtOnRleHQtOHhsIGxnOnRleHQtWzExMHB4XSBsZWFkaW5nLVswLjldIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRlciBtYi00IHRleHQtdHJhbnNwYXJlbnQgYmctY2xpcC10ZXh0IGJnLWdyYWRpZW50LXRvLWIgZnJvbS1bI0Y1RjVGN10gdG8tWyNBRkFGQjZdIGZpbHRlciBkcm9wLXNoYWRvdy1bMF80cHhfMjRweF9yZ2JhKDAsMCwwLDAuNSldIj4KICAgICAgICAgICAgICAgIEZsdWlkIERyYWcgSW50ZXJhY3Rpb25zCiAgICAgICAgICAgIDwvaDE+CiAgICAgICAgICAgIDxwIGNsYXNzPSJoZXJvLWFuaW0gb3BhY2l0eS0wIHRyYW5zbGF0ZS15LTQgdGV4dC1sZyBzbTp0ZXh0LVsyMnB4XSB0ZXh0LXdoaXRlLzgwIHRyYWNraW5nLXRpZ2h0IGZvbnQtbWVkaXVtIj4KICAgICAgICAgICAgICAgIEdyYWIsIG1vdmUsIGFuZCBhcnJhbmdlIHRoZSBlbGVtZW50cyBmcmVlbHkgYWNyb3NzIHRoZSBjYW52YXMuCiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBGbG9hdGluZyBDYXJkcyBDb21wb3NpdGlvbiAtLT4KICAgICAgICA8IS0tIFNjYWxlZCBkb3duIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgaGFuZGxpbmcgd2hpbGUgbWFpbnRhaW5pbmcgc3RyaWN0IG1hdGggLS0+CiAgICAgICAgPGRpdiBjbGFzcz0icmVsYXRpdmUgdy1mdWxsIG1heC13LVsxMDAwcHhdIGgtWzQwMHB4XSBzbTpoLVs1NTBweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcGVyc3BlY3RpdmUtWzIwMDBweF0gc2NhbGUtWzAuNl0gc206c2NhbGUtNzUgbWQ6c2NhbGUtOTAgbGc6c2NhbGUtMTAwIG10LVstNDBweF0gc206bXQtMCI+CiAgICAgICAgICAgIAogICAgICAgICAgICA8IS0tIENhcmQgMSAoRmFyIExlZnQsIEJsdWUpIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWl0ZW0gY3Vyc29yLWdyYWIgYWN0aXZlOmN1cnNvci1ncmFiYmluZyBhYnNvbHV0ZSB3LVsyNjBweF0gaC1bMzYwcHhdIHJvdW5kZWQtM3hsIHNoYWRvdy0yeGwgb3ZlcmZsb3ctaGlkZGVuIGJnLWdyYWRpZW50LXRvLWJyIGZyb20tWyMyRDNBRTRdIHRvLVsjMTYxRDhBXSB6LTEwIGJvcmRlciBib3JkZXItd2hpdGUvMTAiCiAgICAgICAgICAgICAgICAgc3R5bGU9InRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzgwcHgpIHRyYW5zbGF0ZVkoODBweCkgcm90YXRlKC0yMmRlZykgc2NhbGUoMC44NSk7IHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIGluc2V0LTAgb3BhY2l0eS0yMCBwb2ludGVyLWV2ZW50cy1ub25lIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHJnYmEoMjU1LDI1NSwyNTUsMC4yKSAxcHgsIHRyYW5zcGFyZW50IDFweCksIGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIDFweCwgdHJhbnNwYXJlbnQgMXB4KTsgYmFja2dyb3VuZC1zaXplOiAyMHB4IDIwcHg7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwLTYgaC1mdWxsIGZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIHJlbGF0aXZlIHotMTAgcG9pbnRlci1ldmVudHMtbm9uZSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtWzEwcHhdIHRyYWNraW5nLXdpZGVzdCBmb250LXNlbWlib2xkIHRleHQtd2hpdGUvODAiPkxJVkUgTUVUUklDUzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LTggaC1bMnB4XSBiZy13aGl0ZSBtYi00Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJ0ZXh0LTN4bCBmb250LW1lZGl1bSB0cmFja2luZy10aWdodCBsZWFkaW5nLXRpZ2h0IHRleHQtd2hpdGUvOTAiPkRhdGE8YnI+c3luYzxicj5mbG93PC9oMz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIENhcmQgMiAoTWlkIExlZnQsIFB1cnBsZS9XaGl0ZSkgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaXRlbSBjdXJzb3ItZ3JhYiBhY3RpdmU6Y3Vyc29yLWdyYWJiaW5nIGFic29sdXRlIHctWzI4MHB4XSBoLVszODBweF0gcm91bmRlZC0zeGwgc2hhZG93LVswXzIwcHhfNTBweF9yZ2JhKDAsMCwwLDAuNSldIG92ZXJmbG93LWhpZGRlbiBiZy1ncmFkaWVudC10by1iciBmcm9tLVsjRTJEREZCXSB0by1bI0ZERkRGRF0gei0yMCBib3JkZXIgYm9yZGVyLXdoaXRlLzQwIgogICAgICAgICAgICAgICAgIHN0eWxlPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTIwMHB4KSB0cmFuc2xhdGVZKDIwcHgpIHJvdGF0ZSgtMTBkZWcpIHNjYWxlKDAuOTUpOyB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwLTggaC1mdWxsIGZsZXggZmxleC1jb2wgdGV4dC1ncmF5LTgwMCBwb2ludGVyLWV2ZW50cy1ub25lIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dC1bMTFweF0gdHJhY2tpbmctWzAuMmVtXSBmb250LXNlbWlib2xkIHRleHQtZ3JheS00MDAgbWItNiI+UFVSRSBNSU5JTUFMPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0idGV4dC1bMzRweF0gZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodGVyIGxlYWRpbmctWzAuOTVdIHRleHQtWyNCREI1RTldIj5TcGFjZTxicj5naXZlczxicj5Gb2N1czwvaDM+CiAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgPCEtLSBMYXJnZSBwdXJwbGUgYmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWJzb2x1dGUgLWJvdHRvbS04IC1sZWZ0LTggdy00OCBoLTQ4IGJnLVsjOUIzMkYxXSByb3VuZGVkLTN4bCByb3RhdGUtMTIgc2hhZG93LWxnIHBvaW50ZXItZXZlbnRzLW5vbmUiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gQ2FyZCA0IChNaWQgUmlnaHQsIExpZ2h0IEJsdWUgM0QgZm9sZGVyIGNvbmNlcHQpIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWl0ZW0gY3Vyc29yLWdyYWIgYWN0aXZlOmN1cnNvci1ncmFiYmluZyBhYnNvbHV0ZSB3LVsyODBweF0gaC1bMzgwcHhdIHJvdW5kZWQtM3hsIHNoYWRvdy1bMF8yMHB4XzUwcHhfcmdiYSgwLDAsMCwwLjUpXSBvdmVyZmxvdy1oaWRkZW4gYmctZ3JhZGllbnQtdG8tYiBmcm9tLVsjMkI5NUU5XSB0by1bIzFBRTZGMF0gei0yMCIKICAgICAgICAgICAgICAgICBzdHlsZT0idHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwMHB4KSB0cmFuc2xhdGVZKDIwcHgpIHJvdGF0ZSgxMmRlZykgc2NhbGUoMC45NSk7IHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIDwhLS0gU2ltdWxhdGVkIDNEIEdyYXBoaWMgdG9wIGhhbGYgLS0+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaC1bNTUlXSByZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1lbmQgcGItNCBwb2ludGVyLWV2ZW50cy1ub25lIj4KICAgICAgICAgICAgICAgICAgICAgPCEtLSBBYnN0cmFjdCBibG9ja3kgc2hhcGVzIC0tPgogICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LVsxODBweF0gaC1bMTQwcHhdIGJnLVsjMUU3NEM4XSByb3VuZGVkLXhsIHRyYW5zZm9ybSBwZXJzcGVjdGl2ZS0xMDAwIHJvdGF0ZVgoMjBkZWcpIHJvdGF0ZVkoLTEwZGVnKSByZWxhdGl2ZSBzaGFkb3ctMnhsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci10IGJvcmRlci1sIGJvcmRlci13aGl0ZS8zMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InctWzE2MHB4XSBoLVsxMjBweF0gYmctWyNGMkY2RjldIHJvdW5kZWQtbGcgYWJzb2x1dGUgdG9wLVstMTBweF0gcmlnaHQtWy0xMHB4XSBzaGFkb3ctc20gb3ZlcmZsb3ctaGlkZGVuIGZsZXggZmxleC1jb2wgZ2FwLTIgcC0zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InctZnVsbCBoLTIgYmctZ3JheS0yMDAgcm91bmRlZC1mdWxsIGZsZXggZ2FwLTIiPjxkaXYgY2xhc3M9InctNCBoLWZ1bGwgYmctb3JhbmdlLTQwMCByb3VuZGVkLWZ1bGwiPjwvZGl2PjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy0zLzQgaC0yIGJnLWdyYXktMjAwIHJvdW5kZWQtZnVsbCBmbGV4IGdhcC0yIj48ZGl2IGNsYXNzPSJ3LTYgaC1mdWxsIGJnLWJsdWUtNDAwIHJvdW5kZWQtZnVsbCI+PC9kaXY+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LWZ1bGwgaC0yIGJnLWdyYXktMjAwIHJvdW5kZWQtZnVsbCBtdC00Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InctZnVsbCBoLTIgYmctZ3JheS0yMDAgcm91bmRlZC1mdWxsIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgIDwhLS0gU3BlZWNoIGJ1YmJsZSB0ZXh0IGFyZWEgYm90dG9tIGhhbGYgLS0+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaC1bNDUlXSBiZy1ncmFkaWVudC10by1iIGZyb20tWyNGMkZCRkZdIHRvLVsjRDVGNUZGXSByZWxhdGl2ZSByb3VuZGVkLXQtWzQwcHhdIHAtNiBwdC04IHBvaW50ZXItZXZlbnRzLW5vbmUiPgogICAgICAgICAgICAgICAgICAgICA8IS0tIEJ1YmJsZSB0YWlsIC0tPgogICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYnNvbHV0ZSAtdG9wLTYgbGVmdC0xMCB3LTAgaC0wIGJvcmRlci1sLVsxNXB4XSBib3JkZXItbC10cmFuc3BhcmVudCBib3JkZXItci1bMTVweF0gYm9yZGVyLXItdHJhbnNwYXJlbnQgYm9yZGVyLWItWzI1cHhdIGJvcmRlci1iLVsjRjJGQkZGXSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0idGV4dC1bIzBFNTI2Ql0gZm9udC1zZW1pYm9sZCB0ZXh0LVsyNnB4XSBsZWFkaW5nLVswLjldIHRyYWNraW5nLXRpZ2h0ZXIiPlRIRSBORVhUPGJyPldBVkUgT0Y8YnI+SU5URVJBQ1Q8YnI+REVTSUdOPC9oMz4KICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIENhcmQgNSAoRmFyIFJpZ2h0LCBSZWQpIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWl0ZW0gY3Vyc29yLWdyYWIgYWN0aXZlOmN1cnNvci1ncmFiYmluZyBhYnNvbHV0ZSB3LVsyNjBweF0gaC1bMzYwcHhdIHJvdW5kZWQtM3hsIHNoYWRvdy0yeGwgb3ZlcmZsb3ctaGlkZGVuIGJnLVsjRUIwMDAwXSB6LTEwIgogICAgICAgICAgICAgICAgIHN0eWxlPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMzgwcHgpIHRyYW5zbGF0ZVkoODBweCkgcm90YXRlKDI0ZGVnKSBzY2FsZSgwLjg1KTsgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyI+CiAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSB3aXRoIG11bHRpcGx5IGJsZW5kIC0tPgogICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJhc3NldHMvcGFnZS0wMS00ZjU2NjhjNS1mYzRhLTQ0ZTAtYmM1ZS1hNjY0MTg5ZDNjMzEtODAwdy5qcGciIAogICAgICAgICAgICAgICAgICAgICAgYWx0PSJQb3J0cmFpdCB0ZXh0dXJlIiAKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIHctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvdmVyIG9iamVjdC1sZWZ0IG1peC1ibGVuZC1tdWx0aXBseSBvcGFjaXR5LTgwIGZpbHRlciBncmF5c2NhbGUgY29udHJhc3QtMTI1IHBvaW50ZXItZXZlbnRzLW5vbmUiPgogICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIGluc2V0LTAgYmctZ3JhZGllbnQtdG8tdCBmcm9tLWJsYWNrLzYwIHZpYS10cmFuc3BhcmVudCB0by10cmFuc3BhcmVudCBwb2ludGVyLWV2ZW50cy1ub25lIj48L2Rpdj4KICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYnNvbHV0ZSBib3R0b20tNiByaWdodC02IHRleHQtcmlnaHQgcG9pbnRlci1ldmVudHMtbm9uZSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtd2hpdGUvNjAgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFja2luZy13aWRlc3QiPkhFWDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InRleHQtNHhsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRlciB0ZXh0LXdoaXRlIj45OTwvaDM+CiAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBDYXJkIDMgKENlbnRlciBGb2N1cywgRnJvc3RlZCBHbGFzcyAmIEJvcmRlciBHcmFkaWVudCkgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaXRlbSBjdXJzb3ItZ3JhYiBhY3RpdmU6Y3Vyc29yLWdyYWJiaW5nIGFic29sdXRlIHctWzMwMHB4XSBoLVs0MjBweF0gcm91bmRlZC1bMjRweF0gc2hhZG93LVswXzMwcHhfODBweF9yZ2JhKDAsMCwwLDAuNyldIHotMzAgcC1bMXB4XSBiZy1ncmFkaWVudC10by1iciBmcm9tLXdoaXRlLzYwIHZpYS13aGl0ZS8xMCB0by10cmFuc3BhcmVudCIKICAgICAgICAgICAgICAgICBzdHlsZT0idHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCkgdHJhbnNsYXRlWSgwcHgpIHJvdGF0ZSgwZGVnKSBzY2FsZSgxLjA1KTsgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOyI+CiAgICAgICAgICAgICAgICAgPCEtLSBJbm5lciBDYXJkIENvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVsYXRpdmUgdy1mdWxsIGgtZnVsbCByb3VuZGVkLVsyM3B4XSBvdmVyZmxvdy1oaWRkZW4gYmctWyMyQTIzMjZdIHBvaW50ZXItZXZlbnRzLW5vbmUiPgogICAgICAgICAgICAgICAgICAgICA8IS0tIEJhY2tncm91bmQgVGV4dHVyZTogQmx1cnJlZCB3YXJtIHBvcnRyYWl0IC0tPgogICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iYXNzZXRzL3BhZ2UtMDItMGQ4NjhmZWYtZjU2MC00NWNhLWFiMzUtNWRhZDRmYzI5MDU5LTgwMHcud2VicCIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PSJGcm9zdGVkIGJhY2tncm91bmQiIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIHctWzE1MCVdIGgtWzE1MCVdIG9iamVjdC1jb3ZlciAtbGVmdC0xLzQgLXRvcC0xLzQgZmlsdGVyIGJsdXItWzMwcHhdIG9wYWNpdHktNzAgc2F0dXJhdGUtMTUwIHNlcGlhLVsuM10iPgogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgPCEtLSBEb3QgTWF0cml4IE92ZXJsYXkgc3BlY2lmaWMgdG8gY2VudGVyIGNhcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIGluc2V0LTAgb3BhY2l0eS1bMC4xNV0iIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoI2ZmZiAxcHgsIHRyYW5zcGFyZW50IDFweCk7IGJhY2tncm91bmQtc2l6ZTogNHB4IDRweDsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb2lzZSBPdmVybGF5IC0tPgogICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIG1peC1ibGVuZC1vdmVybGF5IG9wYWNpdHktNDAiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0lMjIwIDAgMjAwIDIwMCUyMiB4bWxucz0lMjJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyMiUzRSUzQ2ZpbHRlciBpZD0lMjJub2lzZUZpbHRlciUyMiUzRSUzQ2ZlVHVyYnVsZW5jZSB0eXBlPSUyMmZyYWN0YWxOb2lzZSUyMiBiYXNlRnJlcXVlbmN5PSUyMjAuODUlMjIgbnVtT2N0YXZlcz0lMjIzJTIyIHN0aXRjaFRpbGVzPSUyMnN0aXRjaCUyMi8lM0UlM0MvZmlsdGVyJTNFJTNDcmVjdCB3aWR0aD0lMjIxMDAlMjUlMjIgaGVpZ2h0PSUyMjEwMCUyNSUyMiBmaWx0ZXI9JTIydXJsKCUyM25vaXNlRmlsdGVyKSUyMi8lM0UlM0Mvc3ZnJTNFJyk7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIDwhLS0gR3JhZGllbnQgbWFza2luZyBmb3IgZWRnZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFic29sdXRlIGluc2V0LTAgc2hhZG93LVtpbnNldF8wXzBfNDBweF9yZ2JhKDAsMCwwLDAuNildIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29udGVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWJzb2x1dGUgaW5zZXQtMCBwLTggZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWVuZCB0ZXh0LXdoaXRlIHBiLTEwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtWzExcHhdIHRyYWNraW5nLVswLjE1ZW1dIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUvOTAgbWItMyBkcm9wLXNoYWRvdy1tZCI+QVVSQSBTWVNURU1TPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9InRleHQtWzQ0cHhdIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctW1stMC4wNGVtXV0gbGVhZGluZy1bMC45XSBkcm9wLXNoYWRvdy1sZyBmbGV4IGZsZXgtY29sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkV4cGFuZGluZzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnRoZSBkaWdpdGFsPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5kIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVjb3JhdGl2ZSBDaXJjbGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy04IGgtOCByb3VuZGVkLWZ1bGwgYm9yZGVyLVs2cHhdIGJvcmRlci1bI0Q5QjVDQV0gYmctdHJhbnNwYXJlbnQgbXQtMSBzaGFkb3ctaW5uZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIAogICAgICAgIDwvZGl2PgogICAgPC9tYWluPgoKICAgIDwhLS0gV2ViR0wgJiBBbmltYXRpb24gU2NyaXB0cyAtLT4KICAgIDxzY3JpcHQ+CiAgICAgICAgLy8gLS0tIFdlYkdMIEJhY2tncm91bmQ6IERvdCBNYXRyaXggUHVsc2UgLS0tCiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYmdsLWNhbnZhcycpOwogICAgICAgIAogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBjYW52YXMsIGFscGhhOiB0cnVlLCBhbnRpYWxpYXM6IGZhbHNlIH0pOwogICAgICAgIHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oTWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW8sIDIpKTsKICAgICAgICAKICAgICAgICBjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpOwogICAgICAgIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSg0NSwgd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsIDEsIDEwMDApOwogICAgICAgIGNhbWVyYS5wb3NpdGlvbi56ID0gMTAwOwoKICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBgCiAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgdVRpbWU7CiAgICAgICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBhT2Zmc2V0OwogICAgICAgICAgICB2YXJ5aW5nIGZsb2F0IHZBbHBoYTsKICAgICAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICAgICAgZmxvYXQgcHVsc2UgPSBzaW4odVRpbWUgKiAwLjUgKyBhT2Zmc2V0KSAqIDAuNSArIDAuNTsKICAgICAgICAgICAgICAgIHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7CiAgICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOwogICAgICAgICAgICAgICAgdkFscGhhID0gc21vb3Roc3RlcCgtMTUwLjAsIDUwLjAsIG12UG9zaXRpb24ueikgKiAoMC4xICsgMC4zICogcHVsc2UpOwogICAgICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gKDIuMCArIHB1bHNlICogMS41KSAqICgxMDAuMCAvIC1tdlBvc2l0aW9uLnopOwogICAgICAgICAgICB9CiAgICAgICAgYDsKCiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBgCiAgICAgICAgICAgIHZhcnlpbmcgZmxvYXQgdkFscGhhOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgICAgICB2ZWMyIGNvb3JkID0gZ2xfUG9pbnRDb29yZCAtIHZlYzIoMC41KTsKICAgICAgICAgICAgICAgIGlmKGxlbmd0aChjb29yZCkgPiAwLjUpIGRpc2NhcmQ7CiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIHZBbHBoYSk7CiAgICAgICAgICAgIH0KICAgICAgICBgOwoKICAgICAgICBjb25zdCBncmlkWCA9IDQwOwogICAgICAgIGNvbnN0IGdyaWRaID0gNDA7CiAgICAgICAgY29uc3Qgc3BhY2luZyA9IDEwOwogICAgICAgIGNvbnN0IHBhcnRpY2xlQ291bnQgPSBncmlkWCAqIGdyaWRaOwogICAgICAgIAogICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkocGFydGljbGVDb3VudCAqIDMpOwogICAgICAgIGNvbnN0IG9mZnNldHMgPSBuZXcgRmxvYXQzMkFycmF5KHBhcnRpY2xlQ291bnQpOwoKICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBncmlkWDsgeCsrKSB7CiAgICAgICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgZ3JpZFo7IHorKykgewogICAgICAgICAgICAgICAgcG9zaXRpb25zW2kgKiAzXSA9ICh4IC0gZ3JpZFggLyAyKSAqIHNwYWNpbmc7CiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaSAqIDMgKyAxXSA9IChNYXRoLnJhbmRvbSgpICogMTApIC0gMTU7CiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaSAqIDMgKyAyXSA9ICh6IC0gZ3JpZFogLyAyKSAqIHNwYWNpbmc7CiAgICAgICAgICAgICAgICBvZmZzZXRzW2ldID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpOwogICAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9ucywgMykpOwogICAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnYU9mZnNldCcsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUob2Zmc2V0cywgMSkpOwoKICAgICAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TaGFkZXJNYXRlcmlhbCh7CiAgICAgICAgICAgIHZlcnRleFNoYWRlciwKICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIsCiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLAogICAgICAgICAgICBkZXB0aFdyaXRlOiBmYWxzZSwKICAgICAgICAgICAgdW5pZm9ybXM6IHsKICAgICAgICAgICAgICAgIHVUaW1lOiB7IHZhbHVlOiAwIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBjb25zdCBwYXJ0aWNsZXMgPSBuZXcgVEhSRUUuUG9pbnRzKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgICAgcGFydGljbGVzLnJvdGF0aW9uLnggPSBNYXRoLlBJICogMC40OwogICAgICAgIHBhcnRpY2xlcy5wb3NpdGlvbi55ID0gLTIwOwogICAgICAgIHNjZW5lLmFkZChwYXJ0aWNsZXMpOwoKICAgICAgICBmdW5jdGlvbiByZXNpemUoKSB7CiAgICAgICAgICAgIGNhbWVyYS5hc3BlY3QgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0U2l6ZSh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZSk7CiAgICAgICAgcmVzaXplKCk7CgogICAgICAgIGxldCBtb3VzZVggPSAwOwogICAgICAgIGxldCBtb3VzZVkgPSAwOwogICAgICAgIGxldCB0YXJnZXRYID0gMDsKICAgICAgICBsZXQgdGFyZ2V0WSA9IDA7CiAgICAgICAgY29uc3Qgd2luZG93SGFsZlggPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDI7CiAgICAgICAgY29uc3Qgd2luZG93SGFsZlkgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyOwoKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHsKICAgICAgICAgICAgbW91c2VYID0gKGV2ZW50LmNsaWVudFggLSB3aW5kb3dIYWxmWCkgKiAwLjA1OwogICAgICAgICAgICBtb3VzZVkgPSAoZXZlbnQuY2xpZW50WSAtIHdpbmRvd0hhbGZZKSAqIDAuMDU7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IGNsb2NrID0gbmV3IFRIUkVFLkNsb2NrKCk7CiAgICAgICAgZnVuY3Rpb24gYW5pbWF0ZSgpIHsKICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpOwogICAgICAgICAgICBjb25zdCBlbGFwc2VkVGltZSA9IGNsb2NrLmdldEVsYXBzZWRUaW1lKCk7CiAgICAgICAgICAgIG1hdGVyaWFsLnVuaWZvcm1zLnVUaW1lLnZhbHVlID0gZWxhcHNlZFRpbWU7CgogICAgICAgICAgICB0YXJnZXRYID0gbW91c2VYICogMC41OwogICAgICAgICAgICB0YXJnZXRZID0gbW91c2VZICogMC41OwogICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueCArPSAodGFyZ2V0WCAtIGNhbWVyYS5wb3NpdGlvbi54KSAqIDAuMDI7CiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi55ICs9ICgtdGFyZ2V0WSAtIGNhbWVyYS5wb3NpdGlvbi55ICsgMTApICogMC4wMjsgCiAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoc2NlbmUucG9zaXRpb24pOwoKICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpOwogICAgICAgIH0KICAgICAgICBhbmltYXRlKCk7CgoKICAgICAgICAvLyAtLS0gR1NBUCBVSSBBbmltYXRpb25zICYgRHJhZyBJbnRlcmFjdGlvbiAtLS0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4gewogICAgICAgICAgICAvLyBIZWFkZXIgJiBUaXRsZSBmYWRlIGluCiAgICAgICAgICAgIGdzYXAudG8oIi5oZXJvLWFuaW0iLCB7CiAgICAgICAgICAgICAgICB5OiAwLAogICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxLAogICAgICAgICAgICAgICAgc3RhZ2dlcjogMC4xNSwKICAgICAgICAgICAgICAgIGVhc2U6ICJwb3dlcjMub3V0IiwKICAgICAgICAgICAgICAgIGRlbGF5OiAwLjIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBDYXJkcyBzZXR1cAogICAgICAgICAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkLWl0ZW0nKTsKICAgICAgICAgICAgbGV0IGhpZ2hlc3RaID0gMTAwOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgZmluYWxTdGF0ZXMgPSBBcnJheS5mcm9tKGNhcmRzKS5tYXAoY2FyZCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBjYXJkLnN0eWxlLnRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoWCA9IHRyYW5zZm9ybS5tYXRjaCgvdHJhbnNsYXRlWFwoKFteKV0rKVwpLyk7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFkgPSB0cmFuc2Zvcm0ubWF0Y2goL3RyYW5zbGF0ZVlcKChbXildKylcKS8pOwogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hSb3QgPSB0cmFuc2Zvcm0ubWF0Y2goL3JvdGF0ZVwoKFteKV0rKVwpLyk7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFNjYWxlID0gdHJhbnNmb3JtLm1hdGNoKC9zY2FsZVwoKFteKV0rKVwpLyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgeDogbWF0Y2hYID8gcGFyc2VGbG9hdChtYXRjaFhbMV0pIDogMCwKICAgICAgICAgICAgICAgICAgICB5OiBtYXRjaFkgPyBwYXJzZUZsb2F0KG1hdGNoWVsxXSkgOiAwLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBtYXRjaFJvdCA/IHBhcnNlRmxvYXQobWF0Y2hSb3RbMV0pIDogMCwKICAgICAgICAgICAgICAgICAgICBzY2FsZTogbWF0Y2hTY2FsZSA/IHBhcnNlRmxvYXQobWF0Y2hTY2FsZVsxXSkgOiAxCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIERyYWdnYWJsZSBwbHVnaW4KICAgICAgICAgICAgZ3NhcC5yZWdpc3RlclBsdWdpbihEcmFnZ2FibGUpOwoKICAgICAgICAgICAgY2FyZHMuZm9yRWFjaCgoY2FyZCwgaSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZmluYWwgPSBmaW5hbFN0YXRlc1tpXTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gRW50cmFuY2UgYW5pbWF0aW9uCiAgICAgICAgICAgICAgICBnc2FwLmZyb21UbyhjYXJkLCAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGZpbmFsLnggKiAxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZpbmFsLnkgKyAxNTAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBmaW5hbC5yb3RhdGlvbiAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IGZpbmFsLnNjYWxlICogMC44LAogICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGZpbmFsLngsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZpbmFsLnksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBmaW5hbC5yb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IGZpbmFsLnNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMS40LAogICAgICAgICAgICAgICAgICAgICAgICBlYXNlOiAiYmFjay5vdXQoMS4yKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAwLjYgKyAoaSAqIDAuMDgpLAogICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY29udGludW91cyBmbG9hdGluZyBhbmltYXRpb24gd2hpY2ggd2lsbCBiZSBwYXVzZWQvcmVzdW1lZCBvbiBkcmFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLmZsb2F0QW5pbSA9IGdzYXAudG8oY2FyZCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6ICIrPSIgKyAoTWF0aC5yYW5kb20oKSAqIDEwIC0gNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246ICIrPSIgKyAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMyArIE1hdGgucmFuZG9tKCkgKiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdDogLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW95bzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXNlOiAic2luZS5pbk91dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAvLyBBZGQgZHJhZyBpbnRlcmFjdGlvbgogICAgICAgICAgICAgICAgRHJhZ2dhYmxlLmNyZWF0ZShjYXJkLCB7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogIngseSIsCiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiB3aW5kb3csCiAgICAgICAgICAgICAgICAgICAgb25QcmVzczogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtpbGwgZW50cmFuY2UgYW5pbSBpZiBzdGlsbCBydW5uaW5nLCBhbmQgcGF1c2UgZmxvYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgZ3NhcC5raWxsVHdlZW5zT2YodGhpcy50YXJnZXQsICJ4LHkscm90YXRpb24sc2NhbGUsb3BhY2l0eSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXQuZmxvYXRBbmltKSB0aGlzLnRhcmdldC5mbG9hdEFuaW0ua2lsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJpbmcgY2FyZCB0byBmcm9udAogICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0WiArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5zdHlsZS56SW5kZXggPSBoaWdoZXN0WjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uUmVsZWFzZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VtZSBmbG9hdGluZyBmcm9tIGl0cyBuZXcgZHJvcHBlZCBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5mbG9hdEFuaW0gPSBnc2FwLnRvKHRoaXMudGFyZ2V0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiAiKz0iICsgKE1hdGgucmFuZG9tKCkgKiAxMCAtIDUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246ICIrPSIgKyAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzICsgTWF0aC5yYW5kb20oKSAqIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQ6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW95bzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhc2U6ICJzaW5lLmluT3V0IgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==";
const assetFiles = ["assets/page-01-4f5668c5-fc4a-44e0-bc5e-a664189d3c31-800w.jpg","assets/page-02-0d868fef-f560-45ca-ab35-5dad4fc29059-800w.webp"];
const runtimeFiles = ["../../../../assets/runtime/runtime-027051effa47-gsap-min.js","../../../../assets/runtime/runtime-163ebd087cfc-iconify-icon-min.js","../../../../assets/runtime/runtime-25023b521d77-three-min.js","../../../../assets/runtime/runtime-8da2c9e0e562-draggable-min.js","../../../../assets/runtime/runtime-ccc8894b3418-runtime.js"];
const frame = document.getElementById("neuform-demo");
const decodeBytes = (value) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0));
const decode = (value) => new TextDecoder().decode(decodeBytes(value));
const encodeBytes = (bytes) => {
let binary = "";
for (let index = 0; index < bytes.length; index += 32768) {
binary += String.fromCharCode(...bytes.subarray(index, index + 32768));
}
return btoa(binary);
};
const mediaTypes = {
avif: "image/avif",
gif: "image/gif",
jpg: "image/jpeg",
jpeg: "image/jpeg",
mp4: "video/mp4",
png: "image/png",
webm: "video/webm",
webp: "image/webp"
};
const loadAsset = async (file) => {
const response = await fetch(file, { cache: "no-store", credentials: "omit", redirect: "error" });
if (!response.ok) throw new Error("Could not load local demo asset: " + file);
const extension = file.split(".").pop().toLowerCase();
const contentType = mediaTypes[extension] || "application/octet-stream";
const bytes = new Uint8Array(await response.arrayBuffer());
return { base64: encodeBytes(bytes), contentType, file, kind: "asset" };
};
Promise.allSettled(assetFiles.map(loadAsset)).then((results) => {
const runtimeSources = runtimeFiles.map((file) => new URL(file, location.href).href).join(" ");
const source = decode(encodedHtml).replace("__NEUFORM_RUNTIME_SOURCES__", runtimeSources);
const mediaAssets = [];
for (const result of results) {
if (result.status !== "fulfilled") continue;
mediaAssets.push(result.value);
}
frame.addEventListener("load", () => {
frame.contentWindow.postMessage({ type: "neuform-assets-v1", assets: mediaAssets }, "*");
}, { once: true });
frame.srcdoc = source;
}).catch((error) => {
document.body.innerHTML = '<div class="error">Unable to load this sandboxed demo.</div>';
console.error(error);
});
</script>
</body>
</html>
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Meng To
- Publisher
- Meng To (Community)
- Source
- MengTo/Skills · agent-skills/web-design/gsap · commit 5ea1661
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Meng To.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download gsap.zip