Buckets:

HuggingFaceDocBuilder's picture
download
raw
55.3 kB
import{s as It,o as dt,n as Kl}from"../chunks/scheduler.b8c17244.js";import{S as ut,i as mt,e as j,s as a,c as T,h as rt,a as I,d as M,b as J,f as ct,g as i,j as d,k as jt,l as Bt,m as s,n as U,t as p,o as w,p as o}from"../chunks/index.d374165a.js";import{C as Ct,H as b,E as ht}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.8f6ea2ad.js";import{C as B}from"../chunks/CodeBlock.f49d9e4f.js";import{H as bt,a as Ll}from"../chunks/HfOption.f3c7356c.js";function Gt(C){let n,c;return n=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwYSUyMHRlc3QlMjBwcm9qZWN0JTBBbWtkaXIlMjBteV9wcm9qZWN0JTBBY2QlMjBteV9wcm9qZWN0JTBBJTBBJTIzJTIwU3ltbGluayUyMHRoZSUyMHNraWxsJTIwaW50byUyMHRoZSUyMHByb2plY3QncyUyMHNraWxscyUyMGRpcmVjdG9yeSUwQW1rZGlyJTIwLXAlMjAuY2xhdWRlJTJGc2tpbGxzJTBBbG4lMjAtcyUyMCUyRmFic29sdXRlJTJGcGF0aCUyRnRvJTJGaGYtZGF0YXNldC12YWxpZGF0aW9uJTIwLmNsYXVkZSUyRnNraWxscyUyRmhmLWRhdGFzZXQtdmFsaWRhdGlvbiUwQSUwQSUyMyUyMFN0YXJ0JTIwQ2xhdWRlJTIwQ29kZSUyMCVFMiU4MCU5NCUyMGl0JTIwZGlzY292ZXJzJTIwc2tpbGxzJTIwYXV0b21hdGljYWxseSUwQWNsYXVkZSUwQSUwQSUyMyUyMEF0JTIwdGhlJTIwcHJvbXB0JTNBJTBBJTIzJTIwJTIyVmFsaWRhdGUlMjBteSUyMGRhdGFzZXQlMjBhdCUyMHRlc3RfZGF0YSUyRnNhbXBsZS5jc3YlMjI=",highlighted:`<span class="hljs-comment"># Create a test project</span>
<span class="hljs-built_in">mkdir</span> my_project
<span class="hljs-built_in">cd</span> my_project
<span class="hljs-comment"># Symlink the skill into the project&#x27;s skills directory</span>
<span class="hljs-built_in">mkdir</span> -p .claude/skills
<span class="hljs-built_in">ln</span> -s /absolute/path/to/hf-dataset-validation .claude/skills/hf-dataset-validation
<span class="hljs-comment"># Start Claude Code — it discovers skills automatically</span>
claude
<span class="hljs-comment"># At the prompt:</span>
<span class="hljs-comment"># &quot;Validate my dataset at test_data/sample.csv&quot;</span>`,wrap:!1}}),{c(){T(n.$$.fragment)},l(e){i(n.$$.fragment,e)},m(e,r){U(n,e,r),c=!0},p:Kl,i(e){c||(p(n.$$.fragment,e),c=!0)},o(e){w(n.$$.fragment,e),c=!1},d(e){o(n,e)}}}function Zt(C){let n,c;return n=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwYSUyMHRlc3QlMjBwcm9qZWN0JTBBbWtkaXIlMjBteV9wcm9qZWN0JTBBY2QlMjBteV9wcm9qZWN0JTBBJTBBJTIzJTIwU3ltbGluayUyMHRoZSUyMHNraWxsJTIwaW50byUyMHRoZSUyMHJlcG8tc2NvcGVkJTIwc2tpbGxzJTIwZGlyZWN0b3J5JTBBbWtkaXIlMjAtcCUyMC5hZ2VudHMlMkZza2lsbHMlMEFsbiUyMC1zJTIwJTJGYWJzb2x1dGUlMkZwYXRoJTJGdG8lMkZoZi1kYXRhc2V0LXZhbGlkYXRpb24lMjAuYWdlbnRzJTJGc2tpbGxzJTJGaGYtZGF0YXNldC12YWxpZGF0aW9uJTBBJTBBJTIzJTIwU3RhcnQlMjBDb2RleCUwQWNvZGV4JTBBJTBBJTIzJTIwQXQlMjB0aGUlMjBwcm9tcHQlM0ElMEElMjMlMjAlMjJWYWxpZGF0ZSUyMG15JTIwZGF0YXNldCUyMGF0JTIwdGVzdF9kYXRhJTJGc2FtcGxlLmNzdiUyMg==",highlighted:`<span class="hljs-comment"># Create a test project</span>
<span class="hljs-built_in">mkdir</span> my_project
<span class="hljs-built_in">cd</span> my_project
<span class="hljs-comment"># Symlink the skill into the repo-scoped skills directory</span>
<span class="hljs-built_in">mkdir</span> -p .agents/skills
<span class="hljs-built_in">ln</span> -s /absolute/path/to/hf-dataset-validation .agents/skills/hf-dataset-validation
<span class="hljs-comment"># Start Codex</span>
codex
<span class="hljs-comment"># At the prompt:</span>
<span class="hljs-comment"># &quot;Validate my dataset at test_data/sample.csv&quot;</span>`,wrap:!1}}),{c(){T(n.$$.fragment)},l(e){i(n.$$.fragment,e)},m(e,r){U(n,e,r),c=!0},p:Kl,i(e){c||(p(n.$$.fragment,e),c=!0)},o(e){w(n.$$.fragment,e),c=!1},d(e){o(n,e)}}}function Et(C){let n,c;return n=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwYSUyMHRlc3QlMjBwcm9qZWN0JTBBbWtkaXIlMjBteV9wcm9qZWN0JTBBY2QlMjBteV9wcm9qZWN0JTBBJTBBJTIzJTIwU3ltbGluayUyMHRoZSUyMHNraWxsJTIwaW50byUyMHRoZSUyMHByb2plY3QtbG9jYWwlMjBza2lsbHMlMjBkaXJlY3RvcnklMEFta2RpciUyMC1wJTIwLm9wZW5jb2RlJTJGc2tpbGxzJTBBbG4lMjAtcyUyMCUyRmFic29sdXRlJTJGcGF0aCUyRnRvJTJGaGYtZGF0YXNldC12YWxpZGF0aW9uJTIwLm9wZW5jb2RlJTJGc2tpbGxzJTJGaGYtZGF0YXNldC12YWxpZGF0aW9uJTBBJTBBJTIzJTIwU3RhcnQlMjBPcGVuQ29kZSUwQW9wZW5jb2RlJTBBJTBBJTIzJTIwQXQlMjB0aGUlMjBwcm9tcHQlM0ElMEElMjMlMjAlMjJWYWxpZGF0ZSUyMG15JTIwZGF0YXNldCUyMGF0JTIwdGVzdF9kYXRhJTJGc2FtcGxlLmNzdiUyMg==",highlighted:`<span class="hljs-comment"># Create a test project</span>
<span class="hljs-built_in">mkdir</span> my_project
<span class="hljs-built_in">cd</span> my_project
<span class="hljs-comment"># Symlink the skill into the project-local skills directory</span>
<span class="hljs-built_in">mkdir</span> -p .opencode/skills
<span class="hljs-built_in">ln</span> -s /absolute/path/to/hf-dataset-validation .opencode/skills/hf-dataset-validation
<span class="hljs-comment"># Start OpenCode</span>
opencode
<span class="hljs-comment"># At the prompt:</span>
<span class="hljs-comment"># &quot;Validate my dataset at test_data/sample.csv&quot;</span>`,wrap:!1}}),{c(){T(n.$$.fragment)},l(e){i(n.$$.fragment,e)},m(e,r){U(n,e,r),c=!0},p:Kl,i(e){c||(p(n.$$.fragment,e),c=!0)},o(e){w(n.$$.fragment,e),c=!1},d(e){o(n,e)}}}function ft(C){let n,c,e,r,m,G;return n=new Ll({props:{id:"tool",option:"Claude Code",$$slots:{default:[Gt]},$$scope:{ctx:C}}}),e=new Ll({props:{id:"tool",option:"Codex",$$slots:{default:[Zt]},$$scope:{ctx:C}}}),m=new Ll({props:{id:"tool",option:"OpenCode",$$slots:{default:[Et]},$$scope:{ctx:C}}}),{c(){T(n.$$.fragment),c=a(),T(e.$$.fragment),r=a(),T(m.$$.fragment)},l(y){i(n.$$.fragment,y),c=J(y),i(e.$$.fragment,y),r=J(y),i(m.$$.fragment,y)},m(y,u){U(n,y,u),s(y,c,u),U(e,y,u),s(y,r,u),U(m,y,u),G=!0},p(y,u){const h={};u&2&&(h.$$scope={dirty:u,ctx:y}),n.$set(h);const il={};u&2&&(il.$$scope={dirty:u,ctx:y}),e.$set(il);const E={};u&2&&(E.$$scope={dirty:u,ctx:y}),m.$set(E)},i(y){G||(p(n.$$.fragment,y),p(e.$$.fragment,y),p(m.$$.fragment,y),G=!0)},o(y){w(n.$$.fragment,y),w(e.$$.fragment,y),w(m.$$.fragment,y),G=!1},d(y){y&&(M(c),M(r)),o(n,y),o(e,y),o(m,y)}}}function Nt(C){let n,c,e,r,m,G,y,u,h,il="In this lesson you’ll build a <strong>Hugging Face Dataset Validation Skill</strong> from scratch: it checks dataset format and schema, flags common data quality issues, and prints a short report. By the end, you’ll have a working skill that follows the Agent Skills Specification and runs locally with your agent.",E,f,pl,N,Dl="Let’s set up a skill repository following the Agent Skills Specification:",wl,S,ol,Y,Ol="Your directory now looks like:",cl,W,jl,A,Il,R,Pl="Create your main skill file with proper frontmatter and instructions:",dl,Q,ul,X,ml,k,lt="Create references/ directory with examples:",rl,V,tt="<strong>references/examples.md</strong>",Bl,z,Cl,F,hl,g,Mt="List your dependencies:",bl,x,Gl,q,Zl,v,st="Before you rely on it in real work, test it thoroughly:",El,H,fl,$,et="Expected output shows:",Nl,_,at="<li>Number of rows and columns</li> <li>Data types</li> <li>Missing values (if any)</li> <li>Duplicate rows (if any)</li> <li>Quality recommendations</li>",Sl,L,Yl,K,Jt="Set up proper version control:",Wl,D,Al,O,Rl,P,nt="For local iteration, symlink the skill into your agent’s skills directory so edits take effect immediately. Copying still works, but symlinks make mid-session iteration much easier.",Ql,Z,Xl,ll,yt="Your agent should:",kl,tl,Tt="<li>Discover the skill in the local skills directory</li> <li>Match the task to the skill’s description</li> <li>Load the SKILL.md instructions into context</li> <li>Execute helper scripts as needed</li>",Vl,Ml,zl,sl,it="Now test whether the skill fires reliably:",Fl,el,gl,al,Ut="If Prompt 1 works but Prompt 2 does not, your <code>description</code> is still too narrow. Tighten it until both prompts activate the skill.",xl,Jl,pt="This is the point where Codex’s <code>$skill-creator</code> is useful: give it the skill plus a missed prompt and have it rewrite only the triggering description. On Claude Code and OpenCode, do the same revision loop manually by editing the frontmatter, then test again in the same project.",ql,nl,vl,yl,wt="You now have a working skill. As you use it, keep revising the description and helper scripts so the skill stays sharp.",Hl,Tl,$l,Ul,_l;return m=new Ct({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),y=new b({props:{title:"Building Your First Skill",local:"building-your-first-skill",headingTag:"h1"}}),f=new b({props:{title:"Step 1: Create the Skill Directory Structure",local:"step-1-create-the-skill-directory-structure",headingTag:"h2"}}),S=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwYSUyMGRpcmVjdG9yeSUyMGZvciUyMHlvdXIlMjBza2lsbCUwQW1rZGlyJTIwaGYtZGF0YXNldC12YWxpZGF0aW9uJTBBY2QlMjBoZi1kYXRhc2V0LXZhbGlkYXRpb24lMEElMEElMjMlMjBDcmVhdGUlMjB0aGUlMjBkaXJlY3RvcnklMjBzdHJ1Y3R1cmUlMjBwZXIlMjB0aGUlMjBzcGVjaWZpY2F0aW9uJTBBbWtkaXIlMjAtcCUyMHNjcmlwdHMlMjByZWZlcmVuY2VzJTIwYXNzZXRzJTBBJTBBJTIzJTIwQ3JlYXRlJTIwdGhlJTIwbWFpbiUyMGZpbGVzJTBBdG91Y2glMjBTS0lMTC5tZCUyMC5naXRpZ25vcmUlMjByZXF1aXJlbWVudHMudHh0",highlighted:`<span class="hljs-comment"># Create a directory for your skill</span>
<span class="hljs-built_in">mkdir</span> hf-dataset-validation
<span class="hljs-built_in">cd</span> hf-dataset-validation
<span class="hljs-comment"># Create the directory structure per the specification</span>
<span class="hljs-built_in">mkdir</span> -p scripts references assets
<span class="hljs-comment"># Create the main files</span>
<span class="hljs-built_in">touch</span> SKILL.md .gitignore requirements.txt`,wrap:!1}}),W=new B({props:{code:"aGYtZGF0YXNldC12YWxpZGF0aW9uJTJGJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwU0tJTEwubWQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBNYWluJTIwc2tpbGwlMjBmaWxlJTIwKHJlcXVpcmVkKSUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMHJlcXVpcmVtZW50cy50eHQlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBQeXRob24lMjBkZXBlbmRlbmNpZXMlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjAuZ2l0aWdub3JlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwR2l0JTIwaWdub3JlJTIwcnVsZXMlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBzY3JpcHRzJTJGJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwT3B0aW9uYWwlM0ElMjBoZWxwZXIlMjBzY3JpcHRzJTBBJUUyJTk0JTgyJTIwJTIwJTIwJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwdmFsaWRhdGVfZGF0YXNldC5weSUwQSVFMiU5NCU4MiUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMGdlbmVyYXRlX3JlcG9ydC5weSUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMHJlZmVyZW5jZXMlMkYlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBPcHRpb25hbCUzQSUyMGRvY3VtZW50YXRpb24lMEElRTIlOTQlODIlMjAlMjAlMjAlRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlMjBleGFtcGxlcy5tZCUwQSVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMGFzc2V0cyUyRiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME9wdGlvbmFsJTNBJTIwdGVtcGxhdGVzJTBBJTIwJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwdmFsaWRhdGlvbi10ZW1wbGF0ZS50eHQ=",highlighted:`hf-dataset-validation/
├── SKILL.md <span class="hljs-comment"># Main skill file (required)</span>
├── requirements.txt <span class="hljs-comment"># Python dependencies</span>
├── <span class="hljs-string">.gitignore</span> <span class="hljs-comment"># Git ignore rules</span>
├── scripts/ <span class="hljs-comment"># Optional: helper scripts</span>
│ ├── validate_dataset.py
│ └── generate_report.py
├── references/ <span class="hljs-comment"># Optional: documentation</span>
│ └── examples.md
└── assets/ <span class="hljs-comment"># Optional: templates</span>
└── validation-template.txt`,wrap:!1}}),A=new b({props:{title:"Step 2: Write the SKILL.md File",local:"step-2-write-the-skillmd-file",headingTag:"h2"}}),Q=new B({props:{code:"LS0tJTBBbmFtZSUzQSUyMCUyMmhmLWRhdGFzZXQtdmFsaWRhdGlvbiUyMiUwQWRlc2NyaXB0aW9uJTNBJTIwJTIyVmFsaWRhdGUlMjBIdWdnaW5nJTIwRmFjZSUyMGRhdGFzZXRzJTIwZm9yJTIwc2NoZW1hJTJDJTIwZm9ybWF0JTJDJTIwYW5kJTIwZGF0YSUyMHF1YWxpdHklMjBpc3N1ZXMuJTIwVXNlJTIwd2hlbiUyMGNoZWNraW5nJTIwZGF0YXNldHMlMjBiZWZvcmUlMjBwdWJsaXNoaW5nJTJDJTIwdHJhaW5pbmclMkMlMjBvciUyMHNoYXJpbmcuJTIyJTBBbGljZW5zZSUzQSUyMCUyMk1JVCUyMiUwQWNvbXBhdGliaWxpdHklM0ElMjAlMjJQeXRob24lMjAzLjglMkIlMkMlMjByZXF1aXJlcyUyMHBhbmRhcyUyMGFuZCUyMGRhdGFzZXRzJTIyJTBBbWV0YWRhdGElM0ElMEElMjAlMjBhdXRob3IlM0ElMjAlMjJ5b3VyLXVzZXJuYW1lJTIyJTBBJTIwJTIwdmVyc2lvbiUzQSUyMCUyMjEuMC4wJTIyJTBBJTIwJTIwY3JlYXRlZCUzQSUyMCUyMjIwMjYtMDQtMTMlMjIlMEEtLS0lMEElMEElMjMlMjBEYXRhc2V0JTIwVmFsaWRhdGlvbiUyMFNraWxsJTBBJTBBJTIzJTIzJTIwT3ZlcnZpZXclMEElMEFUaGlzJTIwc2tpbGwlMjB0ZWFjaGVzJTIwYWdlbnRzJTIwaG93JTIwdG8lMjB2YWxpZGF0ZSUyMEh1Z2dpbmclMjBGYWNlJTIwZGF0YXNldHMlMjBmb3IlM0ElMEEtJTIwKipTY2hlbWElMjB2YWxpZGF0aW9uKiolM0ElMjBDb3JyZWN0JTIwY29sdW1ucyUyMGFuZCUyMGRhdGElMjB0eXBlcyUwQS0lMjAqKkRhdGElMjBxdWFsaXR5KiolM0ElMjBNaXNzaW5nJTIwdmFsdWVzJTJDJTIwZHVwbGljYXRlcyUyQyUyMG91dGxpZXJzJTBBLSUyMCoqRm9ybWF0JTIwY29tcGxpYW5jZSoqJTNBJTIwQ1NWJTJDJTIwUGFycXVldCUyQyUyMEFycm93JTJDJTIwSlNPTiUyMGZvcm1hdHMlMEEtJTIwKipTaXplJTIwY2hlY2tzKiolM0ElMjBGaWxlJTIwc2l6ZXMlMkMlMjByZWNvcmQlMjBjb3VudHMlMkMlMjBtZW1vcnklMjBmb290cHJpbnQlMEElMEFVc2UlMjB0aGlzJTIwc2tpbGwlMjBiZWZvcmUlMjBwdWJsaXNoaW5nJTIwZGF0YXNldHMlMjBvciUyMHVzaW5nJTIwdGhlbSUyMGZvciUyMHRyYWluaW5nLiUwQSUwQSUyMyUyMyUyMFByZXJlcXVpc2l0ZXMlMjBDaGVja2xpc3QlMEElMEEtJTIwJTVCJTIwJTVEJTIwUHl0aG9uJTIwMy44JTIwb3IlMjBoaWdoZXIlMjBpbnN0YWxsZWQlMEEtJTIwJTVCJTIwJTVEJTIwcGFuZGFzJTIwbGlicmFyeSUyMGluc3RhbGxlZCUyMCglNjBwaXAlMjBpbnN0YWxsJTIwcGFuZGFzJTYwKSUwQS0lMjAlNUIlMjAlNUQlMjBkYXRhc2V0cyUyMGxpYnJhcnklMjBpbnN0YWxsZWQlMjAoJTYwcGlwJTIwaW5zdGFsbCUyMGRhdGFzZXRzJTYwKSUwQS0lMjAlNUIlMjAlNUQlMjBEYXRhc2V0JTIwZmlsZSUyMGFjY2Vzc2libGUlMjBsb2NhbGx5JTBBJTBBJTIzJTIzJTIwU3RlcC1ieS1TdGVwJTIwR3VpZGUlMEElMEElMjMlMjMlMjMlMjBTdGVwJTIwMSUzQSUyMEluc3RhbGwlMjBEZXBlbmRlbmNpZXMlMEElMEElNjAlNjAlNjBiYXNoJTBBcGlwJTIwaW5zdGFsbCUyMHBhbmRhcyUyMGRhdGFzZXRzJTIwbnVtcHklMEElNjAlNjAlNjAlMEElMEElMjMlMjMlMjMlMjBTdGVwJTIwMiUzQSUyMENoZWNrJTIwRGF0YXNldCUyMEZvcm1hdCUwQSUwQUlkZW50aWZ5JTIwd2hhdCUyMGZvcm1hdCUyMHlvdXIlMjBkYXRhc2V0JTIwaXMlMjBpbiUzQSUwQSUwQSU2MCU2MCU2MHB5dGhvbiUwQWZyb20lMjBwYXRobGliJTIwaW1wb3J0JTIwUGF0aCUwQSUwQWZpbGVfcGF0aCUyMCUzRCUyMCUyMmRhdGElMkZteV9kYXRhc2V0LmNzdiUyMiUwQSUwQSUyMyUyMENoZWNrJTIwZmlsZSUyMGV4dGVuc2lvbiUwQWlmJTIwZmlsZV9wYXRoLmVuZHN3aXRoKCcuY3N2JyklM0ElMEElMjAlMjAlMjAlMjBwcmludCglMjJGb3JtYXQlM0ElMjBDU1YlMjIpJTBBZWxpZiUyMGZpbGVfcGF0aC5lbmRzd2l0aCgnLnBhcnF1ZXQnKSUzQSUwQSUyMCUyMCUyMCUyMHByaW50KCUyMkZvcm1hdCUzQSUyMFBhcnF1ZXQlMjIpJTBBZWxpZiUyMGZpbGVfcGF0aC5lbmRzd2l0aCgnLmpzb24nKSUzQSUwQSUyMCUyMCUyMCUyMHByaW50KCUyMkZvcm1hdCUzQSUyMEpTT04lMjIpJTBBZWxzZSUzQSUwQSUyMCUyMCUyMCUyMHByaW50KCUyMlVua25vd24lMjBmb3JtYXQlMjIpJTBBJTYwJTYwJTYwJTBBJTBBJTIzJTIzJTIzJTIwU3RlcCUyMDMlM0ElMjBMb2FkJTIwYW5kJTIwSW5zcGVjdCUwQSUwQUxvYWQlMjB5b3VyJTIwZGF0YXNldCUyMGFuZCUyMGNoZWNrJTIwYmFzaWMlMjBwcm9wZXJ0aWVzJTNBJTBBJTBBJTYwJTYwJTYwcHl0aG9uJTBBaW1wb3J0JTIwcGFuZGFzJTIwYXMlMjBwZCUwQSUwQSUyMyUyMExvYWQlMjBDU1YlMjBkYXRhc2V0JTBBZGYlMjAlM0QlMjBwZC5yZWFkX2NzdiglMjJkYXRhJTJGbXlfZGF0YXNldC5jc3YlMjIpJTBBJTBBJTIzJTIwQ2hlY2slMjBzaGFwZSUyMGFuZCUyMGNvbHVtbnMlMEFwcmludChmJTIyU2hhcGUlM0ElMjAlN0JkZi5zaGFwZSU3RCUyMiklMjAlMjAlMjMlMjAocm93cyUyQyUyMGNvbHVtbnMpJTBBcHJpbnQoZiUyMkNvbHVtbnMlM0ElMjAlN0JsaXN0KGRmLmNvbHVtbnMpJTdEJTIyKSUwQXByaW50KGYlMjJEYXRhJTIwdHlwZXMlM0ElNUMlNUNuJTdCZGYuZHR5cGVzJTdEJTIyKSUwQSU2MCU2MCU2MCUwQSUwQSUyMyUyMyUyMyUyMFN0ZXAlMjA0JTNBJTIwVmFsaWRhdGUlMjBTY2hlbWElMEElMEFDaGVjayUyMHRoYXQlMjB5b3VyJTIwZGF0YXNldCUyMGhhcyUyMGV4cGVjdGVkJTIwY29sdW1ucyUyMGFuZCUyMGNvcnJlY3QlMjBkYXRhJTIwdHlwZXMlM0ElMEElMEElNjAlNjAlNjBweXRob24lMEElMjMlMjBEZWZpbmUlMjBleHBlY3RlZCUyMHNjaGVtYSUwQWV4cGVjdGVkX2NvbHVtbnMlMjAlM0QlMjAlN0IndGV4dCclMkMlMjAnbGFiZWwnJTJDJTIwJ3NwbGl0JyU3RCUwQWFjdHVhbF9jb2x1bW5zJTIwJTNEJTIwc2V0KGRmLmNvbHVtbnMpJTBBJTBBJTIzJTIwQ2hlY2slMjBhbGwlMjByZXF1aXJlZCUyMGNvbHVtbnMlMjBleGlzdCUwQW1pc3NpbmclMjAlM0QlMjBleHBlY3RlZF9jb2x1bW5zJTIwLSUyMGFjdHVhbF9jb2x1bW5zJTBBaWYlMjBtaXNzaW5nJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMkVSUk9SJTNBJTIwTWlzc2luZyUyMGNvbHVtbnMlM0ElMjAlN0JtaXNzaW5nJTdEJTIyKSUwQSUwQSUyMyUyMENoZWNrJTIwZm9yJTIwdW5leHBlY3RlZCUyMGNvbHVtbnMlMEFleHRyYSUyMCUzRCUyMGFjdHVhbF9jb2x1bW5zJTIwLSUyMGV4cGVjdGVkX2NvbHVtbnMlMEFpZiUyMGV4dHJhJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMldBUk5JTkclM0ElMjBFeHRyYSUyMGNvbHVtbnMlM0ElMjAlN0JleHRyYSU3RCUyMiklMEElMEElMjMlMjBWZXJpZnklMjBkYXRhJTIwdHlwZXMlMEFpZiUyMGRmJTVCJ2xhYmVsJyU1RC5kdHlwZSUyMG5vdCUyMGluJTIwJTVCJ2ludDY0JyUyQyUyMCdvYmplY3QnJTVEJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoJTIyV0FSTklORyUzQSUyMGxhYmVsJTIwY29sdW1uJTIwc2hvdWxkJTIwYmUlMjBpbnRlZ2VyJTIwb3IlMjBzdHJpbmclMjIpJTBBJTYwJTYwJTYwJTBBJTBBJTIzJTIzJTIzJTIwU3RlcCUyMDUlM0ElMjBDaGVjayUyMERhdGElMjBRdWFsaXR5JTBBJTBBSWRlbnRpZnklMjBjb21tb24lMjBkYXRhJTIwcXVhbGl0eSUyMGlzc3VlcyUzQSUwQSUwQSU2MCU2MCU2MHB5dGhvbiUwQSUyMyUyMENoZWNrJTIwZm9yJTIwbWlzc2luZyUyMHZhbHVlcyUwQW1pc3NpbmdfY291bnQlMjAlM0QlMjBkZi5pc25hKCkuc3VtKCklMEFpZiUyMG1pc3NpbmdfY291bnQuYW55KCklM0ElMEElMjAlMjAlMjAlMjBwcmludCglMjJNaXNzaW5nJTIwdmFsdWVzJTIwZm91bmQlM0ElMjIpJTBBJTIwJTIwJTIwJTIwcHJpbnQobWlzc2luZ19jb3VudCU1Qm1pc3NpbmdfY291bnQlMjAlM0UlMjAwJTVEKSUwQSUwQSUyMyUyMENoZWNrJTIwZm9yJTIwZHVwbGljYXRlcyUwQWR1cGxpY2F0ZXMlMjAlM0QlMjBkZi5kdXBsaWNhdGVkKCkuc3VtKCklMEFpZiUyMGR1cGxpY2F0ZXMlMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMldBUk5JTkclM0ElMjAlN0JkdXBsaWNhdGVzJTdEJTIwZHVwbGljYXRlJTIwcm93cyUyMGZvdW5kJTIyKSUwQSUwQSUyMyUyMENoZWNrJTIwZm9yJTIwZW1wdHklMjBzdHJpbmdzJTBBZm9yJTIwY29sJTIwaW4lMjBkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGUlM0Qnb2JqZWN0JykuY29sdW1ucyUzQSUwQSUyMCUyMCUyMCUyMGVtcHR5JTIwJTNEJTIwKGRmJTVCY29sJTVELnN0ci5zdHJpcCgpJTIwJTNEJTNEJTIwJycpLnN1bSgpJTBBJTIwJTIwJTIwJTIwaWYlMjBlbXB0eSUyMCUzRSUyMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludChmJTIyV0FSTklORyUzQSUyMENvbHVtbiUyMCclN0Jjb2wlN0QnJTIwaGFzJTIwJTdCZW1wdHklN0QlMjBlbXB0eSUyMHN0cmluZ3MlMjIpJTBBJTYwJTYwJTYwJTBBJTBBJTIzJTIzJTIzJTIwU3RlcCUyMDYlM0ElMjBHZW5lcmF0ZSUyMFZhbGlkYXRpb24lMjBSZXBvcnQlMEElMEFVc2UlMjB0aGUlMjBwcm92aWRlZCUyMHZhbGlkYXRpb24lMjBzY3JpcHQlMjAoc2VlJTIwcmVmZXJlbmNlcyUyMGJlbG93KSUzQSUwQSUwQSU2MCU2MCU2MGJhc2glMEFweXRob24lMjBzY3JpcHRzJTJGdmFsaWRhdGVfZGF0YXNldC5weSUyMGRhdGElMkZteV9kYXRhc2V0LmNzdiUwQSU2MCU2MCU2MCUwQSUwQVRoZSUyMHJlcG9ydCUyMGluY2x1ZGVzJTNBJTBBLSUyMERhdGFzZXQlMjBzdW1tYXJ5JTIwKHJvd3MlMkMlMjBjb2x1bW5zJTJDJTIwc2l6ZSklMEEtJTIwRGF0YSUyMHF1YWxpdHklMjBtZXRyaWNzJTBBLSUyMElzc3VlcyUyMGZvdW5kJTIwYW5kJTIwcmVjb21tZW5kYXRpb25zJTBBLSUyMFJlbWVkaWF0aW9uJTIwc3VnZ2VzdGlvbnMlMEElMEElMjMlMjMlMjBDb21tb24lMjBJc3N1ZXMlMjBhbmQlMjBTb2x1dGlvbnMlMEElMEElMjMlMjMlMjMlMjBJc3N1ZSUzQSUyMEVuY29kaW5nJTIwRXJyb3IlMjBSZWFkaW5nJTIwQ1NWJTBBJTBBKipQcm9ibGVtKiolM0ElMjAlNjBVbmljb2RlRGVjb2RlRXJyb3IlNjAlMjB3aGVuJTIwbG9hZGluZyUyMGZpbGUlMEElMEEqKlNvbHV0aW9uKiolM0ElMjBUcnklMjBkaWZmZXJlbnQlMjBjaGFyYWN0ZXIlMjBlbmNvZGluZ3MlMEElNjAlNjAlNjBweXRob24lMEFlbmNvZGluZ3MlMjAlM0QlMjAlNUIndXRmLTgnJTJDJTIwJ2xhdGluLTEnJTJDJTIwJ2lzby04ODU5LTEnJTVEJTBBZm9yJTIwZW5jb2RpbmclMjBpbiUyMGVuY29kaW5ncyUzQSUwQSUyMCUyMCUyMCUyMHRyeSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRmJTIwJTNEJTIwcGQucmVhZF9jc3YoJTIyZmlsZS5jc3YlMjIlMkMlMjBlbmNvZGluZyUzRGVuY29kaW5nKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJTdWNjZXNzJTIwd2l0aCUyMCU3QmVuY29kaW5nJTdEJTIyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTBBJTIwJTIwJTIwJTIwZXhjZXB0JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udGludWUlMEElNjAlNjAlNjAlMEElMEElMjMlMjMlMjMlMjBJc3N1ZSUzQSUyME1lbW9yeSUyMEVycm9yJTIwd2l0aCUyMExhcmdlJTIwRmlsZXMlMEElMEEqKlByb2JsZW0qKiUzQSUyMCU2ME1lbW9yeUVycm9yJTYwJTIwd2hlbiUyMGxvYWRpbmclMjBsYXJnZSUyMENTViUwQSUwQSoqU29sdXRpb24qKiUzQSUyMFJlYWQlMjBpbiUyMGNodW5rcyUwQSU2MCU2MCU2MHB5dGhvbiUwQWNodW5rcyUyMCUzRCUyMHBkLnJlYWRfY3N2KCUyMmxhcmdlX2ZpbGUuY3N2JTIyJTJDJTIwY2h1bmtzaXplJTNEMTAwMDApJTBBZm9yJTIwaSUyQyUyMGNodW5rJTIwaW4lMjBlbnVtZXJhdGUoY2h1bmtzKSUzQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjJQcm9jZXNzaW5nJTIwY2h1bmslMjAlN0JpJTdELi4uJTIyKSUwQSUyMCUyMCUyMCUyMCUyMyUyMFByb2Nlc3MlMjBlYWNoJTIwY2h1bmslMEElNjAlNjAlNjAlMEElMEElMjMlMjMlMjMlMjBJc3N1ZSUzQSUyMEluY29uc2lzdGVudCUyMENvbHVtbiUyME5hbWVzJTBBJTBBKipQcm9ibGVtKiolM0ElMjBDb2x1bW4lMjBuYW1lcyUyMGhhdmUlMjBtaXhlZCUyMGNhcGl0YWxpemF0aW9uJTIwb3IlMjBzcGFjZXMlMEElMEEqKlNvbHV0aW9uKiolM0ElMjBTdGFuZGFyZGl6ZSUyMGNvbHVtbiUyMG5hbWVzJTBBJTYwJTYwJTYwcHl0aG9uJTBBZGYuY29sdW1ucyUyMCUzRCUyMGRmLmNvbHVtbnMuc3RyLmxvd2VyKCkuc3RyLnJlcGxhY2UoJyUyMCclMkMlMjAnXycpJTBBcHJpbnQoZGYuY29sdW1ucyklMEElNjAlNjAlNjAlMEElMEElMjMlMjMlMjBIZWxwZXIlMjBTY3JpcHRzJTBBJTBBJTIzJTIzJTIzJTIwc2NyaXB0cyUyRnZhbGlkYXRlX2RhdGFzZXQucHklMEElMEElNjAlNjAlNjBweXRob24lMEElMjMhJTJGdXNyJTJGYmluJTJGZW52JTIwcHl0aG9uMyUwQSUyMiUyMiUyMlZhbGlkYXRlJTIwSHVnZ2luZyUyMEZhY2UlMjBkYXRhc2V0cy4lMjIlMjIlMjIlMEElMEFpbXBvcnQlMjBqc29uJTBBaW1wb3J0JTIwc3lzJTBBaW1wb3J0JTIwcGFuZGFzJTIwYXMlMjBwZCUwQWZyb20lMjBwYXRobGliJTIwaW1wb3J0JTIwUGF0aCUwQSUwQWRlZiUyMHZhbGlkYXRlX2NzdihmaWxlcGF0aCklM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJWYWxpZGF0ZSUyMGElMjBDU1YlMjBkYXRhc2V0JTIwZmlsZS4lMjIlMjIlMjIlMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBlcnJvcnMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjB3YXJuaW5ncyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMHJlcG9ydCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmZpbGVwYXRoJTIyJTNBJTIwZmlsZXBhdGglMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJmb3JtYXQlMjIlM0ElMjAlMjJjc3YlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlcnJvcnMlMjIlM0ElMjBlcnJvcnMlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ3YXJuaW5ncyUyMiUzQSUyMHdhcm5pbmdzJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIybWV0YWRhdGElMjIlM0ElMjAlN0IlN0QlMEElMjAlMjAlMjAlMjAlN0QlMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjMlMjBDaGVjayUyMGZpbGUlMjBleGlzdHMlMEElMjAlMjAlMjAlMjBpZiUyMG5vdCUyMFBhdGgoZmlsZXBhdGgpLmV4aXN0cygpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXJyb3JzLmFwcGVuZChmJTIyRmlsZSUyMG5vdCUyMGZvdW5kJTNBJTIwJTdCZmlsZXBhdGglN0QlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwcmVwb3J0JTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwTG9hZCUyMGZpbGUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZiUyMCUzRCUyMHBkLnJlYWRfY3N2KGZpbGVwYXRoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcG9ydCU1QiUyMm1ldGFkYXRhJTIyJTVEJTVCJTIycm93cyUyMiU1RCUyMCUzRCUyMGxlbihkZiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXBvcnQlNUIlMjJtZXRhZGF0YSUyMiU1RCU1QiUyMmNvbHVtbnMlMjIlNUQlMjAlM0QlMjBsaXN0KGRmLmNvbHVtbnMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVwb3J0JTVCJTIybWV0YWRhdGElMjIlNUQlNUIlMjJkdHlwZXMlMjIlNUQlMjAlM0QlMjAlN0JrJTNBJTIwc3RyKHYpJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGRmLmR0eXBlcy5pdGVtcygpJTdEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ2hlY2slMjBmb3IlMjBtaXNzaW5nJTIwdmFsdWVzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWlzc2luZyUyMCUzRCUyMGRmLmlzbmEoKS5zdW0oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwbWlzc2luZy5hbnkoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlcG9ydCU1QiUyMm1ldGFkYXRhJTIyJTVEJTVCJTIybWlzc2luZ192YWx1ZXMlMjIlNUQlMjAlM0QlMjBtaXNzaW5nLnRvX2RpY3QoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwZm9yJTIwZHVwbGljYXRlcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR1cF9jb3VudCUyMCUzRCUyMGRmLmR1cGxpY2F0ZWQoKS5zdW0oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwZHVwX2NvdW50JTIwJTNFJTIwMCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdhcm5pbmdzLmFwcGVuZChmJTIyRm91bmQlMjAlN0JkdXBfY291bnQlN0QlMjBkdXBsaWNhdGUlMjByb3dzJTIyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwZm9yJTIwZW1wdHklMjBzdHJpbmdzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwY29sJTIwaW4lMjBkZi5zZWxlY3RfZHR5cGVzKGluY2x1ZGUlM0Qnb2JqZWN0JykuY29sdW1ucyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVtcHR5JTIwJTNEJTIwKGRmJTVCY29sJTVELnN0ci5zdHJpcCgpJTIwJTNEJTNEJTIwJycpLnN1bSgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBlbXB0eSUyMCUzRSUyMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3YXJuaW5ncy5hcHBlbmQoZiUyMkNvbHVtbiUyMCclN0Jjb2wlN0QnJTIwaGFzJTIwJTdCZW1wdHklN0QlMjBlbXB0eSUyMHN0cmluZ3MlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwRXhjZXB0aW9uJTIwYXMlMjBlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXJyb3JzLmFwcGVuZChmJTIyRXJyb3IlMjByZWFkaW5nJTIwZmlsZSUzQSUyMCU3QnN0cihlKSU3RCUyMiklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjByZXR1cm4lMjByZXBvcnQlMEElMEFkZWYlMjBtYWluKCklM0ElMEElMjAlMjAlMjAlMjBpZiUyMGxlbihzeXMuYXJndiklMjAlM0MlMjAyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQoJTIyVXNhZ2UlM0ElMjBweXRob24lMjB2YWxpZGF0ZV9kYXRhc2V0LnB5JTIwJTNDZmlsZXBhdGglM0UlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3lzLmV4aXQoMSklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBmaWxlcGF0aCUyMCUzRCUyMHN5cy5hcmd2JTVCMSU1RCUwQSUyMCUyMCUyMCUyMHJlcG9ydCUyMCUzRCUyMHZhbGlkYXRlX2NzdihmaWxlcGF0aCklMEElMjAlMjAlMjAlMjBwcmludChqc29uLmR1bXBzKHJlcG9ydCUyQyUyMGluZGVudCUzRDIpKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMGlmJTIwcmVwb3J0JTVCJTIyZXJyb3JzJTIyJTVEJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3lzLmV4aXQoMSklMEElMEFpZiUyMF9fbmFtZV9fJTIwJTNEJTNEJTIwJTIyX19tYWluX18lMjIlM0ElMEElMjAlMjAlMjAlMjBtYWluKCklMEElNjAlNjAlNjAlMEElMEElMjMlMjMlMjMlMjBzY3JpcHRzJTJGZ2VuZXJhdGVfcmVwb3J0LnB5JTBBJTBBJTYwJTYwJTYwcHl0aG9uJTBBJTIzISUyRnVzciUyRmJpbiUyRmVudiUyMHB5dGhvbjMlMEElMjIlMjIlMjJHZW5lcmF0ZSUyMGElMjBodW1hbi1yZWFkYWJsZSUyMHZhbGlkYXRpb24lMjByZXBvcnQuJTIyJTIyJTIyJTBBJTBBaW1wb3J0JTIwc3lzJTBBaW1wb3J0JTIwcGFuZGFzJTIwYXMlMjBwZCUwQWZyb20lMjBwYXRobGliJTIwaW1wb3J0JTIwUGF0aCUwQSUwQWRlZiUyMGdlbmVyYXRlX3JlcG9ydChmaWxlcGF0aCklM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJHZW5lcmF0ZSUyMGElMjB0ZXh0JTIwcmVwb3J0JTIwZm9yJTIwYSUyMGRhdGFzZXQuJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwcmVwb3J0JTIwJTNEJTIwJTVCJTVEJTBBJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZCglMjIlM0QlMjIlMjAqJTIwNjApJTBBJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZCglMjJEQVRBU0VUJTIwVkFMSURBVElPTiUyMFJFUE9SVCUyMiklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKCUyMiUzRCUyMiUyMColMjA2MCklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKGYlMjIlNUNuRmlsZSUzQSUyMCU3QmZpbGVwYXRoJTdEJTVDbiUyMiklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBpZiUyMG5vdCUyMFBhdGgoZmlsZXBhdGgpLmV4aXN0cygpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZChmJTIyRVJST1IlM0ElMjBGaWxlJTIwbm90JTIwZm91bmQlM0ElMjAlN0JmaWxlcGF0aCU3RCUyMiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjIlNUNuJTIyLmpvaW4ocmVwb3J0KSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHRyeSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRmJTIwJTNEJTIwcGQucmVhZF9jc3YoZmlsZXBhdGgpJTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwRXhjZXB0aW9uJTIwYXMlMjBlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZChmJTIyRVJST1IlM0ElMjBDb3VsZCUyMG5vdCUyMHJlYWQlMjBmaWxlJTNBJTIwJTdCZSU3RCUyMiklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjIlNUNuJTIyLmpvaW4ocmVwb3J0KSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMEJhc2ljJTIwc3RhdHMlMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKCUyMkJBU0lDJTIwU1RBVElTVElDUyUyMiklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKGYlMjIlMjAlMjBSb3dzJTNBJTIwJTdCbGVuKGRmKSU3RCUyMiklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKGYlMjIlMjAlMjBDb2x1bW5zJTNBJTIwJTdCbGVuKGRmLmNvbHVtbnMpJTdEJTIyKSUwQSUyMCUyMCUyMCUyMHJlcG9ydC5hcHBlbmQoZiUyMiUyMCUyME1lbW9yeSUzQSUyMCU3QmRmLm1lbW9yeV91c2FnZShkZWVwJTNEVHJ1ZSkuc3VtKCklMjAlMkYlMjAxMDI0KioyJTNBLjJmJTdEJTIwTUIlMjIpJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIzJTIwQ29sdW1uJTIwaW5mbyUwQSUyMCUyMCUyMCUyMHJlcG9ydC5hcHBlbmQoJTIyJTVDbkNPTFVNTiUyMElORk9STUFUSU9OJTIyKSUwQSUyMCUyMCUyMCUyMGZvciUyMGNvbCUyMGluJTIwZGYuY29sdW1ucyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGR0eXBlJTIwJTNEJTIwZGYlNUJjb2wlNUQuZHR5cGUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBub25fbnVsbCUyMCUzRCUyMGRmJTVCY29sJTVELm5vdG5hKCkuc3VtKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKGYlMjIlMjAlMjAlN0Jjb2wlN0QlM0ElMjAlN0JkdHlwZSU3RCUyMCglN0Jub25fbnVsbCU3RCUyRiU3QmxlbihkZiklN0QlMjBub24tbnVsbCklMjIpJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIzJTIwRGF0YSUyMHF1YWxpdHklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKCUyMiU1Q25EQVRBJTIwUVVBTElUWSUyMiklMEElMjAlMjAlMjAlMjBtaXNzaW5nJTIwJTNEJTIwZGYuaXNuYSgpLnN1bSgpLnN1bSgpJTBBJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZChmJTIyJTIwJTIwTWlzc2luZyUyMHZhbHVlcyUzQSUyMCU3Qm1pc3NpbmclN0QlMjIpJTBBJTIwJTIwJTIwJTIwZHVwbGljYXRlcyUyMCUzRCUyMGRmLmR1cGxpY2F0ZWQoKS5zdW0oKSUwQSUyMCUyMCUyMCUyMHJlcG9ydC5hcHBlbmQoZiUyMiUyMCUyMER1cGxpY2F0ZSUyMHJvd3MlM0ElMjAlN0JkdXBsaWNhdGVzJTdEJTIyKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMFJlY29tbWVuZGF0aW9ucyUwQSUyMCUyMCUyMCUyMHJlcG9ydC5hcHBlbmQoJTIyJTVDblJFQ09NTUVOREFUSU9OUyUyMiklMEElMjAlMjAlMjAlMjBpZiUyMG1pc3NpbmclMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZCglMjIlMjAlMjAtJTIwSGFuZGxlJTIwbWlzc2luZyUyMHZhbHVlcyUyMChkcm9wJTIwb3IlMjBpbXB1dGUpJTIyKSUwQSUyMCUyMCUyMCUyMGlmJTIwZHVwbGljYXRlcyUyMCUzRSUyMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKCUyMiUyMCUyMC0lMjBSZW1vdmUlMjBkdXBsaWNhdGUlMjByb3dzJTIyKSUwQSUyMCUyMCUyMCUyMHJlcG9ydC5hcHBlbmQoJTIyJTIwJTIwLSUyMERvY3VtZW50JTIwZGF0YXNldCUyMGFuZCUyMHByZXByb2Nlc3NpbmclMjBzdGVwcyUyMiklMEElMjAlMjAlMjAlMjByZXBvcnQuYXBwZW5kKCUyMiUyMCUyMC0lMjBBZGQlMjBMSUNFTlNFJTIwYW5kJTIwUkVBRE1FLm1kJTIwZmlsZXMlMjIpJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwcmVwb3J0LmFwcGVuZCglMjIlNUNuJTIyJTIwJTJCJTIwJTIyJTNEJTIyJTIwKiUyMDYwKSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCUyMiU1Q24lMjIuam9pbihyZXBvcnQpJTBBJTBBZGVmJTIwbWFpbigpJTNBJTBBJTIwJTIwJTIwJTIwaWYlMjBsZW4oc3lzLmFyZ3YpJTIwJTNDJTIwMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KCUyMlVzYWdlJTNBJTIwcHl0aG9uJTIwZ2VuZXJhdGVfcmVwb3J0LnB5JTIwJTNDZmlsZXBhdGglM0UlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3lzLmV4aXQoMSklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBmaWxlcGF0aCUyMCUzRCUyMHN5cy5hcmd2JTVCMSU1RCUwQSUyMCUyMCUyMCUyMHByaW50KGdlbmVyYXRlX3JlcG9ydChmaWxlcGF0aCkpJTBBJTBBaWYlMjBfX25hbWVfXyUyMCUzRCUzRCUyMCUyMl9fbWFpbl9fJTIyJTNBJTBBJTIwJTIwJTIwJTIwbWFpbigpJTBBJTYwJTYwJTYw",highlighted:`---
name: &quot;hf-dataset-validation&quot;
description: &quot;Validate Hugging Face datasets for schema, format, and data quality issues. Use when checking datasets before publishing, training, or sharing.&quot;
license: &quot;MIT&quot;
compatibility: &quot;Python 3.8+, requires pandas and datasets&quot;
metadata:
author: &quot;your-username&quot;
version: &quot;1.0.0&quot;
<span class="hljs-section"> created: &quot;2026-04-13&quot;
---</span>
<span class="hljs-section"># Dataset Validation Skill</span>
<span class="hljs-section">## Overview</span>
This skill teaches agents how to validate Hugging Face datasets for:
<span class="hljs-bullet">-</span> <span class="hljs-strong">**Schema validation**</span>: Correct columns and data types
<span class="hljs-bullet">-</span> <span class="hljs-strong">**Data quality**</span>: Missing values, duplicates, outliers
<span class="hljs-bullet">-</span> <span class="hljs-strong">**Format compliance**</span>: CSV, Parquet, Arrow, JSON formats
<span class="hljs-bullet">-</span> <span class="hljs-strong">**Size checks**</span>: File sizes, record counts, memory footprint
Use this skill before publishing datasets or using them for training.
<span class="hljs-section">## Prerequisites Checklist</span>
<span class="hljs-bullet">-</span> [ ] Python 3.8 or higher installed
<span class="hljs-bullet">-</span> [ ] pandas library installed (<span class="hljs-code">\`pip install pandas\`</span>)
<span class="hljs-bullet">-</span> [ ] datasets library installed (<span class="hljs-code">\`pip install datasets\`</span>)
<span class="hljs-bullet">-</span> [ ] Dataset file accessible locally
<span class="hljs-section">## Step-by-Step Guide</span>
<span class="hljs-section">### Step 1: Install Dependencies</span>
<span class="hljs-code">\`\`\`bash
pip install pandas datasets numpy
\`\`\`</span>
<span class="hljs-section">### Step 2: Check Dataset Format</span>
Identify what format your dataset is in:
<span class="hljs-code">\`\`\`python
from pathlib import Path
file_path = &quot;data/my_dataset.csv&quot;
# Check file extension
if file_path.endswith(&#x27;.csv&#x27;):
print(&quot;Format: CSV&quot;)
elif file_path.endswith(&#x27;.parquet&#x27;):
print(&quot;Format: Parquet&quot;)
elif file_path.endswith(&#x27;.json&#x27;):
print(&quot;Format: JSON&quot;)
else:
print(&quot;Unknown format&quot;)
\`\`\`</span>
<span class="hljs-section">### Step 3: Load and Inspect</span>
Load your dataset and check basic properties:
<span class="hljs-code">\`\`\`python
import pandas as pd
# Load CSV dataset
df = pd.read_csv(&quot;data/my_dataset.csv&quot;)
# Check shape and columns
print(f&quot;Shape: {df.shape}&quot;) # (rows, columns)
print(f&quot;Columns: {list(df.columns)}&quot;)
print(f&quot;Data types:\\\\n{df.dtypes}&quot;)
\`\`\`</span>
<span class="hljs-section">### Step 4: Validate Schema</span>
Check that your dataset has expected columns and correct data types:
<span class="hljs-code">\`\`\`python
# Define expected schema
expected_columns = {&#x27;text&#x27;, &#x27;label&#x27;, &#x27;split&#x27;}
actual_columns = set(df.columns)
# Check all required columns exist
missing = expected_columns - actual_columns
if missing:
print(f&quot;ERROR: Missing columns: {missing}&quot;)
# Check for unexpected columns
extra = actual_columns - expected_columns
if extra:
print(f&quot;WARNING: Extra columns: {extra}&quot;)
# Verify data types
if df[&#x27;label&#x27;].dtype not in [&#x27;int64&#x27;, &#x27;object&#x27;]:
print(&quot;WARNING: label column should be integer or string&quot;)
\`\`\`</span>
<span class="hljs-section">### Step 5: Check Data Quality</span>
Identify common data quality issues:
<span class="hljs-code">\`\`\`python
# Check for missing values
missing_count = df.isna().sum()
if missing_count.any():
print(&quot;Missing values found:&quot;)
print(missing_count[missing_count &gt; 0])
# Check for duplicates
duplicates = df.duplicated().sum()
if duplicates &gt; 0:
print(f&quot;WARNING: {duplicates} duplicate rows found&quot;)
# Check for empty strings
for col in df.select_dtypes(include=&#x27;object&#x27;).columns:
empty = (df[col].str.strip() == &#x27;&#x27;).sum()
if empty &gt; 0:
print(f&quot;WARNING: Column &#x27;{col}&#x27; has {empty} empty strings&quot;)
\`\`\`</span>
<span class="hljs-section">### Step 6: Generate Validation Report</span>
Use the provided validation script (see references below):
<span class="hljs-code">\`\`\`bash
python scripts/validate_dataset.py data/my_dataset.csv
\`\`\`</span>
The report includes:
<span class="hljs-bullet">-</span> Dataset summary (rows, columns, size)
<span class="hljs-bullet">-</span> Data quality metrics
<span class="hljs-bullet">-</span> Issues found and recommendations
<span class="hljs-bullet">-</span> Remediation suggestions
<span class="hljs-section">## Common Issues and Solutions</span>
<span class="hljs-section">### Issue: Encoding Error Reading CSV</span>
<span class="hljs-strong">**Problem**</span>: <span class="hljs-code">\`UnicodeDecodeError\`</span> when loading file
<span class="hljs-strong">**Solution**</span>: Try different character encodings
<span class="hljs-code">\`\`\`python
encodings = [&#x27;utf-8&#x27;, &#x27;latin-1&#x27;, &#x27;iso-8859-1&#x27;]
for encoding in encodings:
try:
df = pd.read_csv(&quot;file.csv&quot;, encoding=encoding)
print(f&quot;Success with {encoding}&quot;)
break
except:
continue
\`\`\`</span>
<span class="hljs-section">### Issue: Memory Error with Large Files</span>
<span class="hljs-strong">**Problem**</span>: <span class="hljs-code">\`MemoryError\`</span> when loading large CSV
<span class="hljs-strong">**Solution**</span>: Read in chunks
<span class="hljs-code">\`\`\`python
chunks = pd.read_csv(&quot;large_file.csv&quot;, chunksize=10000)
for i, chunk in enumerate(chunks):
print(f&quot;Processing chunk {i}...&quot;)
# Process each chunk
\`\`\`</span>
<span class="hljs-section">### Issue: Inconsistent Column Names</span>
<span class="hljs-strong">**Problem**</span>: Column names have mixed capitalization or spaces
<span class="hljs-strong">**Solution**</span>: Standardize column names
<span class="hljs-code">\`\`\`python
df.columns = df.columns.str.lower().str.replace(&#x27; &#x27;, &#x27;_&#x27;)
print(df.columns)
\`\`\`</span>
<span class="hljs-section">## Helper Scripts</span>
<span class="hljs-section">### scripts/validate<span class="hljs-emphasis">_dataset.py
\`\`\`python
#!/usr/bin/env python3
&quot;&quot;&quot;Validate Hugging Face datasets.&quot;&quot;&quot;
import json
import sys
import pandas as pd
from pathlib import Path
def validate_</span>csv(filepath):</span>
<span class="hljs-code"> &quot;&quot;&quot;Validate a CSV dataset file.&quot;&quot;&quot;
errors = []
warnings = []
report = {
&quot;filepath&quot;: filepath,
&quot;format&quot;: &quot;csv&quot;,
&quot;errors&quot;: errors,
&quot;warnings&quot;: warnings,
&quot;metadata&quot;: {}
}
# Check file exists
if not Path(filepath).exists():
errors.append(f&quot;File not found: {filepath}&quot;)
return report
try:
# Load file
df = pd.read_csv(filepath)
report[&quot;metadata&quot;][&quot;rows&quot;] = len(df)
report[&quot;metadata&quot;][&quot;columns&quot;] = list(df.columns)
report[&quot;metadata&quot;][&quot;dtypes&quot;] = {k: str(v) for k, v in df.dtypes.items()}
# Check for missing values
missing = df.isna().sum()
if missing.any():
report[&quot;metadata&quot;][&quot;missing_values&quot;] = missing.to_dict()
# Check for duplicates
dup_count = df.duplicated().sum()
if dup_count &gt; 0:
warnings.append(f&quot;Found {dup_count} duplicate rows&quot;)
# Check for empty strings
for col in df.select_dtypes(include=&#x27;object&#x27;).columns:
empty = (df[col].str.strip() == &#x27;&#x27;).sum()
if empty &gt; 0:
warnings.append(f&quot;Column &#x27;{col}&#x27; has {empty} empty strings&quot;)
except Exception as e:
errors.append(f&quot;Error reading file: {str(e)}&quot;)
return report
</span>
def main():
<span class="hljs-code"> if len(sys.argv) &lt; 2:
print(&quot;Usage: python validate_dataset.py &lt;filepath&gt;&quot;)
sys.exit(1)
filepath = sys.argv[1]
report = validate_csv(filepath)
print(json.dumps(report, indent=2))
if report[&quot;errors&quot;]:
sys.exit(1)
</span>
if <span class="hljs-strong">__name__</span> == &quot;<span class="hljs-strong">__main__</span>&quot;:
<span class="hljs-code"> main()
\`\`\`
</span>
<span class="hljs-section">### scripts/generate<span class="hljs-emphasis">_report.py
\`\`\`python
#!/usr/bin/env python3
&quot;&quot;&quot;Generate a human-readable validation report.&quot;&quot;&quot;
import sys
import pandas as pd
from pathlib import Path
def generate_</span>report(filepath):</span>
<span class="hljs-code"> &quot;&quot;&quot;Generate a text report for a dataset.&quot;&quot;&quot;
report = []
report.append(&quot;=&quot; * 60)
report.append(&quot;DATASET VALIDATION REPORT&quot;)
report.append(&quot;=&quot; * 60)
report.append(f&quot;\\nFile: {filepath}\\n&quot;)
if not Path(filepath).exists():
report.append(f&quot;ERROR: File not found: {filepath}&quot;)
return &quot;\\n&quot;.join(report)
try:
df = pd.read_csv(filepath)
except Exception as e:
report.append(f&quot;ERROR: Could not read file: {e}&quot;)
return &quot;\\n&quot;.join(report)
# Basic stats
report.append(&quot;BASIC STATISTICS&quot;)
report.append(f&quot; Rows: {len(df)}&quot;)
report.append(f&quot; Columns: {len(df.columns)}&quot;)
report.append(f&quot; Memory: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB&quot;)
# Column info
report.append(&quot;\\nCOLUMN INFORMATION&quot;)
for col in df.columns:
dtype = df[col].dtype
non_null = df[col].notna().sum()
report.append(f&quot; {col}: {dtype} ({non_null}/{len(df)} non-null)&quot;)
# Data quality
report.append(&quot;\\nDATA QUALITY&quot;)
missing = df.isna().sum().sum()
report.append(f&quot; Missing values: {missing}&quot;)
duplicates = df.duplicated().sum()
report.append(f&quot; Duplicate rows: {duplicates}&quot;)
# Recommendations
report.append(&quot;\\nRECOMMENDATIONS&quot;)
if missing &gt; 0:
report.append(&quot; - Handle missing values (drop or impute)&quot;)
if duplicates &gt; 0:
report.append(&quot; - Remove duplicate rows&quot;)
report.append(&quot; - Document dataset and preprocessing steps&quot;)
report.append(&quot; - Add LICENSE and README.md files&quot;)
report.append(&quot;\\n&quot; + &quot;=&quot; * 60)
return &quot;\\n&quot;.join(report)
</span>
def main():
<span class="hljs-code"> if len(sys.argv) &lt; 2:
print(&quot;Usage: python generate_report.py &lt;filepath&gt;&quot;)
sys.exit(1)
filepath = sys.argv[1]
print(generate_report(filepath))
</span>
if <span class="hljs-strong">__name__</span> == &quot;<span class="hljs-strong">__main__</span>&quot;:
<span class="hljs-code"> main()
\`\`\`</span>`,wrap:!1}}),X=new b({props:{title:"Step 3: Add Documentation",local:"step-3-add-documentation",headingTag:"h2"}}),z=new B({props:{code:"JTIzJTIwVXNhZ2UlMjBFeGFtcGxlcyUwQSUwQSUyMyUyMyUyMFZhbGlkYXRlJTIwYSUyMENTViUyMGZpbGUlMEElNjAlNjAlNjBiYXNoJTBBcHl0aG9uJTIwc2NyaXB0cyUyRnZhbGlkYXRlX2RhdGFzZXQucHklMjBkYXRhJTJGbXlfZGF0YXNldC5jc3YlMEElNjAlNjAlNjAlMEElMEFPdXRwdXQlM0ElMEElNjAlNjAlNjBqc29uJTBBJTdCJTBBJTIwJTIwJTIyZmlsZXBhdGglMjIlM0ElMjAlMjJkYXRhJTJGbXlfZGF0YXNldC5jc3YlMjIlMkMlMEElMjAlMjAlMjJmb3JtYXQlMjIlM0ElMjAlMjJjc3YlMjIlMkMlMEElMjAlMjAlMjJlcnJvcnMlMjIlM0ElMjAlNUIlNUQlMkMlMEElMjAlMjAlMjJ3YXJuaW5ncyUyMiUzQSUyMCU1QiUyMkZvdW5kJTIwMiUyMGR1cGxpY2F0ZSUyMHJvd3MlMjIlNUQlMkMlMEElMjAlMjAlMjJtZXRhZGF0YSUyMiUzQSUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMnJvd3MlMjIlM0ElMjAxMDAwJTJDJTBBJTIwJTIwJTIwJTIwJTIyY29sdW1ucyUyMiUzQSUyMCU1QiUyMnRleHQlMjIlMkMlMjAlMjJsYWJlbCUyMiUyQyUyMCUyMnNwbGl0JTIyJTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIybWlzc2luZ192YWx1ZXMlMjIlM0ElMjAlN0IlMjJ0ZXh0JTIyJTNBJTIwMCU3RCUwQSUyMCUyMCU3RCUwQSU3RCUwQSU2MCU2MCU2MCUwQSUwQSUyMyUyMyUyMFZhbGlkYXRlJTIwaW4lMjBQeXRob24lMEElNjAlNjAlNjBweXRob24lMEFmcm9tJTIwcGF0aGxpYiUyMGltcG9ydCUyMFBhdGglMEFpbXBvcnQlMjBzeXMlMEFzeXMucGF0aC5pbnNlcnQoMCUyQyUyMCUyMnNjcmlwdHMlMjIpJTBBZnJvbSUyMHZhbGlkYXRlX2RhdGFzZXQlMjBpbXBvcnQlMjB2YWxpZGF0ZV9jc3YlMEElMEFyZXBvcnQlMjAlM0QlMjB2YWxpZGF0ZV9jc3YoJTIyZGF0YSUyRm15X2RhdGFzZXQuY3N2JTIyKSUwQXByaW50KHJlcG9ydCklMEElNjAlNjAlNjA=",highlighted:`<span class="hljs-section"># Usage Examples</span>
<span class="hljs-section">## Validate a CSV file</span>
<span class="hljs-code">\`\`\`bash
python scripts/validate_dataset.py data/my_dataset.csv
\`\`\`</span>
Output:
<span class="hljs-code">\`\`\`json
{
&quot;filepath&quot;: &quot;data/my_dataset.csv&quot;,
&quot;format&quot;: &quot;csv&quot;,
&quot;errors&quot;: [],
&quot;warnings&quot;: [&quot;Found 2 duplicate rows&quot;],
&quot;metadata&quot;: {
&quot;rows&quot;: 1000,
&quot;columns&quot;: [&quot;text&quot;, &quot;label&quot;, &quot;split&quot;],
&quot;missing_values&quot;: {&quot;text&quot;: 0}
}
}
\`\`\`</span>
<span class="hljs-section">## Validate in Python</span>
<span class="hljs-code">\`\`\`python
from pathlib import Path
import sys
sys.path.insert(0, &quot;scripts&quot;)
from validate_dataset import validate_csv
report = validate_csv(&quot;data/my_dataset.csv&quot;)
print(report)
\`\`\`</span>`,wrap:!1}}),F=new b({props:{title:"Step 4: Create requirements.txt",local:"step-4-create-requirementstxt",headingTag:"h2"}}),x=new B({props:{code:"cGFuZGFzJTNFJTNEMS4zLjAlMEFkYXRhc2V0cyUzRSUzRDIuMC4wJTBBbnVtcHklM0UlM0QxLjIwLjA=",highlighted:`<span class="hljs-attribute">pandas</span>&gt;=<span class="hljs-number">1</span>.<span class="hljs-number">3</span>.<span class="hljs-number">0</span>
<span class="hljs-attribute">datasets</span>&gt;=<span class="hljs-number">2</span>.<span class="hljs-number">0</span>.<span class="hljs-number">0</span>
<span class="hljs-attribute">numpy</span>&gt;=<span class="hljs-number">1</span>.<span class="hljs-number">20</span>.<span class="hljs-number">0</span>`,wrap:!1}}),q=new b({props:{title:"Step 5: Test Your Skill",local:"step-5-test-your-skill",headingTag:"h2"}}),H=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwdGVzdCUyMGRhdGElMEFta2RpciUyMC1wJTIwdGVzdF9kYXRhJTBBY2F0JTIwJTNFJTIwdGVzdF9kYXRhJTJGc2FtcGxlLmNzdiUyMCUzQyUzQyUyMCdFT0YnJTBBdGV4dCUyQ2xhYmVsJTJDc3BsaXQlMEFIZWxsbyUyMHdvcmxkJTJDMCUyQ3RyYWluJTBBR3JlYXQlMjBqb2IlMkMxJTJDdHJhaW4lMEFUaGlzJTIwaXMlMjBiYWQlMkMwJTJDdGVzdCUwQUVPRiUwQSUwQSUyMyUyMFRlc3QlMjB2YWxpZGF0aW9uJTIwc2NyaXB0JTBBcHl0aG9uJTIwc2NyaXB0cyUyRnZhbGlkYXRlX2RhdGFzZXQucHklMjB0ZXN0X2RhdGElMkZzYW1wbGUuY3N2JTBBJTBBJTIzJTIwVGVzdCUyMHJlcG9ydCUyMGdlbmVyYXRpb24lMEFweXRob24lMjBzY3JpcHRzJTJGZ2VuZXJhdGVfcmVwb3J0LnB5JTIwdGVzdF9kYXRhJTJGc2FtcGxlLmNzdg==",highlighted:`<span class="hljs-comment"># Create test data</span>
<span class="hljs-built_in">mkdir</span> -p test_data
<span class="hljs-built_in">cat</span> &gt; test_data/sample.csv &lt;&lt; <span class="hljs-string">&#x27;EOF&#x27;</span>
text,label,<span class="hljs-built_in">split</span>
Hello world,0,train
Great job,1,train
This is bad,0,<span class="hljs-built_in">test</span>
EOF
<span class="hljs-comment"># Test validation script</span>
python scripts/validate_dataset.py test_data/sample.csv
<span class="hljs-comment"># Test report generation</span>
python scripts/generate_report.py test_data/sample.csv`,wrap:!1}}),L=new b({props:{title:"Step 6: Initialize Git Repository",local:"step-6-initialize-git-repository",headingTag:"h2"}}),D=new B({props:{code:"JTIzJTIwQ3JlYXRlJTIwLmdpdGlnbm9yZSUwQWNhdCUyMCUzRSUyMC5naXRpZ25vcmUlMjAlM0MlM0MlMjAnRU9GJyUwQV9fcHljYWNoZV9fJTJGJTBBKi5weWMlMEEqLnB5byUwQS5EU19TdG9yZSUwQSouZWdnLWluZm8lMkYlMEFkaXN0JTJGJTBBYnVpbGQlMkYlMEEudmVudiUyRiUwQXZlbnYlMkYlMEF2YWxpZGF0aW9uX3JlcG9ydC5qc29uJTBBRU9GJTBBJTBBJTIzJTIwQ3JlYXRlJTIwTElDRU5TRSUyMGZpbGUlMjAoTUlUKSUwQWNhdCUyMCUzRSUyMExJQ0VOU0UlMjAlM0MlM0MlMjAnRU9GJyUwQU1JVCUyMExpY2Vuc2UlMEElMEFDb3B5cmlnaHQlMjAoYyklMjAyMDI2JTIwWW91ciUyME5hbWUlMEElMEFQZXJtaXNzaW9uJTIwaXMlMjBoZXJlYnklMjBncmFudGVkJTJDJTIwZnJlZSUyMG9mJTIwY2hhcmdlJTJDJTIwdG8lMjBhbnklMjBwZXJzb24lMjBvYnRhaW5pbmclMjBhJTIwY29weSUwQW9mJTIwdGhpcyUyMHNvZnR3YXJlJTIwYW5kJTIwYXNzb2NpYXRlZCUyMGRvY3VtZW50YXRpb24lMjBmaWxlcyUyMCh0aGUlMjAlMjJTb2Z0d2FyZSUyMiklMkMlMjB0byUyMGRlYWwlMEFpbiUyMHRoZSUyMFNvZnR3YXJlJTIwd2l0aG91dCUyMHJlc3RyaWN0aW9uJTJDJTIwaW5jbHVkaW5nJTIwd2l0aG91dCUyMGxpbWl0YXRpb24lMjB0aGUlMjByaWdodHMlMEF0byUyMHVzZSUyQyUyMGNvcHklMkMlMjBtb2RpZnklMkMlMjBtZXJnZSUyQyUyMHB1Ymxpc2glMkMlMjBkaXN0cmlidXRlJTJDJTIwYW5kJTJGb3IlMjBzZWxsJTIwY29waWVzJTIwb2YlMjB0aGUlMEFTb2Z0d2FyZS4uLiUwQUVPRiUwQSUwQSUyMyUyMEFkZCUyMGFsbCUyMGZpbGVzJTIwdG8lMjBnaXQlMEFnaXQlMjBhZGQlMjAuJTBBZ2l0JTIwY29tbWl0JTIwLW0lMjAlMjJJbml0aWFsJTIwY29tbWl0JTNBJTIwRGF0YXNldCUyMHZhbGlkYXRpb24lMjBza2lsbCUyMg==",highlighted:`<span class="hljs-comment"># Create .gitignore</span>
<span class="hljs-built_in">cat</span> &gt; .gitignore &lt;&lt; <span class="hljs-string">&#x27;EOF&#x27;</span>
__pycache__/
*.pyc
*.pyo
.DS_Store
*.egg-info/
dist/
build/
.venv/
venv/
validation_report.json
EOF
<span class="hljs-comment"># Create LICENSE file (MIT)</span>
<span class="hljs-built_in">cat</span> &gt; LICENSE &lt;&lt; <span class="hljs-string">&#x27;EOF&#x27;</span>
MIT License
Copyright (c) 2026 Your Name
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the <span class="hljs-string">&quot;Software&quot;</span>), to deal
<span class="hljs-keyword">in</span> the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, and/or sell copies of the
Software...
EOF
<span class="hljs-comment"># Add all files to git</span>
git add .
git commit -m <span class="hljs-string">&quot;Initial commit: Dataset validation skill&quot;</span>`,wrap:!1}}),O=new b({props:{title:"Step 7: Test with Your Agent",local:"step-7-test-with-your-agent",headingTag:"h2"}}),Z=new bt({props:{id:"tool",options:["Claude Code","Codex","OpenCode"],$$slots:{default:[ft]},$$scope:{ctx:C}}}),Ml=new b({props:{title:"Step 8: Debug Activation and Tighten the Description",local:"step-8-debug-activation-and-tighten-the-description",headingTag:"h2"}}),el=new B({props:{code:"UHJvbXB0JTIwMSUzQSUyMCUyMlZhbGlkYXRlJTIwbXklMjBkYXRhc2V0JTIwYXQlMjB0ZXN0X2RhdGElMkZzYW1wbGUuY3N2JTIwYmVmb3JlJTIwSSUyMHVzZSUyMGl0JTIwZm9yJTIwdHJhaW5pbmcuJTIyJTBBUHJvbXB0JTIwMiUzQSUyMCUyMkNhbiUyMHlvdSUyMGNoZWNrJTIwd2hldGhlciUyMHRoaXMlMjBDU1YlMjBpcyUyMHJlYWR5JTIwdG8lMjBzaGFyZSUzRiUyMg==",highlighted:`Prompt 1: &quot;Validate my dataset at test_data/sample.csv before I use it for training.&quot;
Prompt 2: &quot;Can you check whether this CSV is ready to share?&quot;`,wrap:!1}}),nl=new b({props:{title:"Next Steps",local:"next-steps",headingTag:"h2"}}),Tl=new ht({props:{source:"https://github.com/huggingface/context-course/blob/main/units/en/unit1/building-skills.mdx"}}),{c(){n=j("meta"),c=a(),e=j("p"),r=a(),T(m.$$.fragment),G=a(),T(y.$$.fragment),u=a(),h=j("p"),h.innerHTML=il,E=a(),T(f.$$.fragment),pl=a(),N=j("p"),N.textContent=Dl,wl=a(),T(S.$$.fragment),ol=a(),Y=j("p"),Y.textContent=Ol,cl=a(),T(W.$$.fragment),jl=a(),T(A.$$.fragment),Il=a(),R=j("p"),R.textContent=Pl,dl=a(),T(Q.$$.fragment),ul=a(),T(X.$$.fragment),ml=a(),k=j("p"),k.textContent=lt,rl=a(),V=j("p"),V.innerHTML=tt,Bl=a(),T(z.$$.fragment),Cl=a(),T(F.$$.fragment),hl=a(),g=j("p"),g.textContent=Mt,bl=a(),T(x.$$.fragment),Gl=a(),T(q.$$.fragment),Zl=a(),v=j("p"),v.textContent=st,El=a(),T(H.$$.fragment),fl=a(),$=j("p"),$.textContent=et,Nl=a(),_=j("ul"),_.innerHTML=at,Sl=a(),T(L.$$.fragment),Yl=a(),K=j("p"),K.textContent=Jt,Wl=a(),T(D.$$.fragment),Al=a(),T(O.$$.fragment),Rl=a(),P=j("p"),P.textContent=nt,Ql=a(),T(Z.$$.fragment),Xl=a(),ll=j("p"),ll.textContent=yt,kl=a(),tl=j("ol"),tl.innerHTML=Tt,Vl=a(),T(Ml.$$.fragment),zl=a(),sl=j("p"),sl.textContent=it,Fl=a(),T(el.$$.fragment),gl=a(),al=j("p"),al.innerHTML=Ut,xl=a(),Jl=j("p"),Jl.innerHTML=pt,ql=a(),T(nl.$$.fragment),vl=a(),yl=j("p"),yl.textContent=wt,Hl=a(),T(Tl.$$.fragment),$l=a(),Ul=j("p"),this.h()},l(l){const t=rt("svelte-u9bgzb",document.head);n=I(t,"META",{name:!0,content:!0}),t.forEach(M),c=J(l),e=I(l,"P",{}),ct(e).forEach(M),r=J(l),i(m.$$.fragment,l),G=J(l),i(y.$$.fragment,l),u=J(l),h=I(l,"P",{"data-svelte-h":!0}),d(h)!=="svelte-y0brhc"&&(h.innerHTML=il),E=J(l),i(f.$$.fragment,l),pl=J(l),N=I(l,"P",{"data-svelte-h":!0}),d(N)!=="svelte-9ysi36"&&(N.textContent=Dl),wl=J(l),i(S.$$.fragment,l),ol=J(l),Y=I(l,"P",{"data-svelte-h":!0}),d(Y)!=="svelte-hwm4xp"&&(Y.textContent=Ol),cl=J(l),i(W.$$.fragment,l),jl=J(l),i(A.$$.fragment,l),Il=J(l),R=I(l,"P",{"data-svelte-h":!0}),d(R)!=="svelte-96fk7d"&&(R.textContent=Pl),dl=J(l),i(Q.$$.fragment,l),ul=J(l),i(X.$$.fragment,l),ml=J(l),k=I(l,"P",{"data-svelte-h":!0}),d(k)!=="svelte-1jqt5en"&&(k.textContent=lt),rl=J(l),V=I(l,"P",{"data-svelte-h":!0}),d(V)!=="svelte-7c993o"&&(V.innerHTML=tt),Bl=J(l),i(z.$$.fragment,l),Cl=J(l),i(F.$$.fragment,l),hl=J(l),g=I(l,"P",{"data-svelte-h":!0}),d(g)!=="svelte-1xdnzva"&&(g.textContent=Mt),bl=J(l),i(x.$$.fragment,l),Gl=J(l),i(q.$$.fragment,l),Zl=J(l),v=I(l,"P",{"data-svelte-h":!0}),d(v)!=="svelte-3lz2yi"&&(v.textContent=st),El=J(l),i(H.$$.fragment,l),fl=J(l),$=I(l,"P",{"data-svelte-h":!0}),d($)!=="svelte-13czwpl"&&($.textContent=et),Nl=J(l),_=I(l,"UL",{"data-svelte-h":!0}),d(_)!=="svelte-1nwrq4a"&&(_.innerHTML=at),Sl=J(l),i(L.$$.fragment,l),Yl=J(l),K=I(l,"P",{"data-svelte-h":!0}),d(K)!=="svelte-j399mq"&&(K.textContent=Jt),Wl=J(l),i(D.$$.fragment,l),Al=J(l),i(O.$$.fragment,l),Rl=J(l),P=I(l,"P",{"data-svelte-h":!0}),d(P)!=="svelte-1absoes"&&(P.textContent=nt),Ql=J(l),i(Z.$$.fragment,l),Xl=J(l),ll=I(l,"P",{"data-svelte-h":!0}),d(ll)!=="svelte-1wtcexz"&&(ll.textContent=yt),kl=J(l),tl=I(l,"OL",{"data-svelte-h":!0}),d(tl)!=="svelte-1ajn12k"&&(tl.innerHTML=Tt),Vl=J(l),i(Ml.$$.fragment,l),zl=J(l),sl=I(l,"P",{"data-svelte-h":!0}),d(sl)!=="svelte-k4b1e"&&(sl.textContent=it),Fl=J(l),i(el.$$.fragment,l),gl=J(l),al=I(l,"P",{"data-svelte-h":!0}),d(al)!=="svelte-1xn87t1"&&(al.innerHTML=Ut),xl=J(l),Jl=I(l,"P",{"data-svelte-h":!0}),d(Jl)!=="svelte-1wfzigt"&&(Jl.innerHTML=pt),ql=J(l),i(nl.$$.fragment,l),vl=J(l),yl=I(l,"P",{"data-svelte-h":!0}),d(yl)!=="svelte-1dpihfd"&&(yl.textContent=wt),Hl=J(l),i(Tl.$$.fragment,l),$l=J(l),Ul=I(l,"P",{}),ct(Ul).forEach(M),this.h()},h(){jt(n,"name","hf:doc:metadata"),jt(n,"content",St)},m(l,t){Bt(document.head,n),s(l,c,t),s(l,e,t),s(l,r,t),U(m,l,t),s(l,G,t),U(y,l,t),s(l,u,t),s(l,h,t),s(l,E,t),U(f,l,t),s(l,pl,t),s(l,N,t),s(l,wl,t),U(S,l,t),s(l,ol,t),s(l,Y,t),s(l,cl,t),U(W,l,t),s(l,jl,t),U(A,l,t),s(l,Il,t),s(l,R,t),s(l,dl,t),U(Q,l,t),s(l,ul,t),U(X,l,t),s(l,ml,t),s(l,k,t),s(l,rl,t),s(l,V,t),s(l,Bl,t),U(z,l,t),s(l,Cl,t),U(F,l,t),s(l,hl,t),s(l,g,t),s(l,bl,t),U(x,l,t),s(l,Gl,t),U(q,l,t),s(l,Zl,t),s(l,v,t),s(l,El,t),U(H,l,t),s(l,fl,t),s(l,$,t),s(l,Nl,t),s(l,_,t),s(l,Sl,t),U(L,l,t),s(l,Yl,t),s(l,K,t),s(l,Wl,t),U(D,l,t),s(l,Al,t),U(O,l,t),s(l,Rl,t),s(l,P,t),s(l,Ql,t),U(Z,l,t),s(l,Xl,t),s(l,ll,t),s(l,kl,t),s(l,tl,t),s(l,Vl,t),U(Ml,l,t),s(l,zl,t),s(l,sl,t),s(l,Fl,t),U(el,l,t),s(l,gl,t),s(l,al,t),s(l,xl,t),s(l,Jl,t),s(l,ql,t),U(nl,l,t),s(l,vl,t),s(l,yl,t),s(l,Hl,t),U(Tl,l,t),s(l,$l,t),s(l,Ul,t),_l=!0},p(l,[t]){const ot={};t&2&&(ot.$$scope={dirty:t,ctx:l}),Z.$set(ot)},i(l){_l||(p(m.$$.fragment,l),p(y.$$.fragment,l),p(f.$$.fragment,l),p(S.$$.fragment,l),p(W.$$.fragment,l),p(A.$$.fragment,l),p(Q.$$.fragment,l),p(X.$$.fragment,l),p(z.$$.fragment,l),p(F.$$.fragment,l),p(x.$$.fragment,l),p(q.$$.fragment,l),p(H.$$.fragment,l),p(L.$$.fragment,l),p(D.$$.fragment,l),p(O.$$.fragment,l),p(Z.$$.fragment,l),p(Ml.$$.fragment,l),p(el.$$.fragment,l),p(nl.$$.fragment,l),p(Tl.$$.fragment,l),_l=!0)},o(l){w(m.$$.fragment,l),w(y.$$.fragment,l),w(f.$$.fragment,l),w(S.$$.fragment,l),w(W.$$.fragment,l),w(A.$$.fragment,l),w(Q.$$.fragment,l),w(X.$$.fragment,l),w(z.$$.fragment,l),w(F.$$.fragment,l),w(x.$$.fragment,l),w(q.$$.fragment,l),w(H.$$.fragment,l),w(L.$$.fragment,l),w(D.$$.fragment,l),w(O.$$.fragment,l),w(Z.$$.fragment,l),w(Ml.$$.fragment,l),w(el.$$.fragment,l),w(nl.$$.fragment,l),w(Tl.$$.fragment,l),_l=!1},d(l){l&&(M(c),M(e),M(r),M(G),M(u),M(h),M(E),M(pl),M(N),M(wl),M(ol),M(Y),M(cl),M(jl),M(Il),M(R),M(dl),M(ul),M(ml),M(k),M(rl),M(V),M(Bl),M(Cl),M(hl),M(g),M(bl),M(Gl),M(Zl),M(v),M(El),M(fl),M($),M(Nl),M(_),M(Sl),M(Yl),M(K),M(Wl),M(Al),M(Rl),M(P),M(Ql),M(Xl),M(ll),M(kl),M(tl),M(Vl),M(zl),M(sl),M(Fl),M(gl),M(al),M(xl),M(Jl),M(ql),M(vl),M(yl),M(Hl),M($l),M(Ul)),M(n),o(m,l),o(y,l),o(f,l),o(S,l),o(W,l),o(A,l),o(Q,l),o(X,l),o(z,l),o(F,l),o(x,l),o(q,l),o(H,l),o(L,l),o(D,l),o(O,l),o(Z,l),o(Ml,l),o(el,l),o(nl,l),o(Tl,l)}}}const St='{"title":"Building Your First Skill","local":"building-your-first-skill","sections":[{"title":"Step 1: Create the Skill Directory Structure","local":"step-1-create-the-skill-directory-structure","sections":[],"depth":2},{"title":"Step 2: Write the SKILL.md File","local":"step-2-write-the-skillmd-file","sections":[],"depth":2},{"title":"Step 3: Add Documentation","local":"step-3-add-documentation","sections":[],"depth":2},{"title":"Step 4: Create requirements.txt","local":"step-4-create-requirementstxt","sections":[],"depth":2},{"title":"Step 5: Test Your Skill","local":"step-5-test-your-skill","sections":[],"depth":2},{"title":"Step 6: Initialize Git Repository","local":"step-6-initialize-git-repository","sections":[],"depth":2},{"title":"Step 7: Test with Your Agent","local":"step-7-test-with-your-agent","sections":[],"depth":2},{"title":"Step 8: Debug Activation and Tighten the Description","local":"step-8-debug-activation-and-tighten-the-description","sections":[],"depth":2},{"title":"Next Steps","local":"next-steps","sections":[],"depth":2}],"depth":1}';function Yt(C){return dt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class kt extends ut{constructor(n){super(),mt(this,n,Yt,Nt,It,{})}}export{kt as component};

Xet Storage Details

Size:
55.3 kB
·
Xet hash:
6048327329e95cad4e93e16459afef526eeb7edef3be3345c1c2db63a9f6f036

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.