[{"data":1,"prerenderedAt":1003},["ShallowReactive",2],{"navigation_docs":3,"-nuxthub-overview":181,"-nuxthub-overview-surround":998},[4,30,55,105,122,136],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"icon":54},"Typed Fields","/core-concepts/typed-fields","2.core-concepts/4.typed-fields","i-simple-icons-typescript",{"title":56,"path":57,"stem":58,"children":59,"page":29},"Adapters","/adapters","3.adapters",[60,65,70,75,80,85,90,95,100],{"title":61,"path":62,"stem":63,"icon":64},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":66,"path":67,"stem":68,"icon":69},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":71,"path":72,"stem":73,"icon":74},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":76,"path":77,"stem":78,"icon":79},"PostHog","/adapters/posthog","3.adapters/4.posthog","i-simple-icons-posthog",{"title":81,"path":82,"stem":83,"icon":84},"Sentry","/adapters/sentry","3.adapters/5.sentry","i-simple-icons-sentry",{"title":86,"path":87,"stem":88,"icon":89},"Better Stack","/adapters/better-stack","3.adapters/6.better-stack","i-simple-icons-betterstack",{"title":91,"path":92,"stem":93,"icon":94},"Custom Adapters","/adapters/custom","3.adapters/7.custom","i-lucide-code",{"title":96,"path":97,"stem":98,"icon":99},"Pipeline","/adapters/pipeline","3.adapters/8.pipeline","i-lucide-workflow",{"title":101,"path":102,"stem":103,"icon":104},"Browser","/adapters/browser","3.adapters/9.browser","i-lucide-globe",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Enrichers","/enrichers","4.enrichers",[110,113,118],{"title":61,"path":111,"stem":112,"icon":28},"/enrichers/overview","4.enrichers/1.overview",{"title":114,"path":115,"stem":116,"icon":117},"Built-in","/enrichers/built-in","4.enrichers/2.built-in","i-lucide-puzzle",{"title":119,"path":120,"stem":121,"icon":94},"Custom","/enrichers/custom","4.enrichers/3.custom",{"title":123,"path":124,"stem":125,"children":126,"page":29},"NuxtHub","/nuxthub","5.nuxthub",[127,131],{"title":61,"path":128,"stem":129,"icon":130},"/nuxthub/overview","5.nuxthub/1.overview","i-lucide-database",{"title":132,"path":133,"stem":134,"icon":135},"Retention","/nuxthub/retention","5.nuxthub/2.retention","i-lucide-clock",{"title":137,"path":138,"stem":139,"children":140,"page":29},"Examples","/examples","6.examples",[141,146,151,156,161,166,171,176],{"title":142,"path":143,"stem":144,"icon":145},"Next.js","/examples/nextjs","6.examples/1.nextjs","i-simple-icons-nextdotjs",{"title":147,"path":148,"stem":149,"icon":150},"SvelteKit","/examples/sveltekit","6.examples/2.sveltekit","i-simple-icons-svelte",{"title":152,"path":153,"stem":154,"icon":155},"TanStack Start","/examples/tanstack-start","6.examples/3.tanstack-start","i-custom-tanstack",{"title":157,"path":158,"stem":159,"icon":160},"NestJS","/examples/nestjs","6.examples/4.nestjs","i-simple-icons-nestjs",{"title":162,"path":163,"stem":164,"icon":165},"Express","/examples/express","6.examples/5.express","i-simple-icons-express",{"title":167,"path":168,"stem":169,"icon":170},"Hono","/examples/hono","6.examples/6.hono","i-simple-icons-hono",{"title":172,"path":173,"stem":174,"icon":175},"Fastify","/examples/fastify","6.examples/7.fastify","i-simple-icons-fastify",{"title":177,"path":178,"stem":179,"icon":180},"Elysia","/examples/elysia","6.examples/8.elysia","i-custom-elysia",{"id":182,"title":183,"body":184,"description":985,"extension":986,"links":987,"meta":994,"navigation":995,"path":128,"seo":996,"stem":129,"__hash__":997},"docs/5.nuxthub/1.overview.md","NuxtHub Storage",{"type":185,"value":186,"toc":974},"minimark",[187,195,200,203,232,237,241,321,328,350,354,360,474,487,490,520,538,542,550,560,565,575,794,811,815,818,836,843,847,855,958,962,970],[188,189,190,194],"p",{},[191,192,193],"code",{},"@evlog/nuxthub"," stores your evlog wide events directly in your NuxtHub database. No external logging service needed — your logs live next to your data, with automatic cleanup based on a retention policy.",[196,197,199],"h2",{"id":198},"why-self-hosted-logs","Why Self-Hosted Logs?",[188,201,202],{},"External logging services (Axiom, Datadog, etc.) are great for production at scale. But sometimes you want:",[204,205,206,214,220,226],"ul",{},[207,208,209,213],"li",{},[210,211,212],"strong",{},"Zero external dependencies"," — logs stored in the same database as your app",[207,215,216,219],{},[210,217,218],{},"Full data ownership"," — no third-party access to your log data",[207,221,222,225],{},[210,223,224],{},"Free tier friendly"," — no per-event pricing, just your existing database",[207,227,228,231],{},[210,229,230],{},"Development & staging"," — full log visibility without paying for a service",[188,233,234,236],{},[191,235,193],{}," works as a drop-in drain. Your existing evlog setup stays the same — you just get a database-backed storage layer on top.",[196,238,240],{"id":239},"install","Install",[242,243,244,272,289,305],"code-group",{},[245,246,252],"pre",{"className":247,"code":248,"filename":249,"language":250,"meta":251,"style":251},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @nuxthub/core @evlog/nuxthub\n","pnpm","bash","",[191,253,254],{"__ignoreMap":251},[255,256,259,262,266,269],"span",{"class":257,"line":258},"line",1,[255,260,249],{"class":261},"sBMFI",[255,263,265],{"class":264},"sfazB"," add",[255,267,268],{"class":264}," @nuxthub/core",[255,270,271],{"class":264}," @evlog/nuxthub\n",[245,273,276],{"className":247,"code":274,"filename":275,"language":250,"meta":251,"style":251},"npm install @nuxthub/core @evlog/nuxthub\n","npm",[191,277,278],{"__ignoreMap":251},[255,279,280,282,285,287],{"class":257,"line":258},[255,281,275],{"class":261},[255,283,284],{"class":264}," install",[255,286,268],{"class":264},[255,288,271],{"class":264},[245,290,293],{"className":247,"code":291,"filename":292,"language":250,"meta":251,"style":251},"yarn add @nuxthub/core @evlog/nuxthub\n","yarn",[191,294,295],{"__ignoreMap":251},[255,296,297,299,301,303],{"class":257,"line":258},[255,298,292],{"class":261},[255,300,265],{"class":264},[255,302,268],{"class":264},[255,304,271],{"class":264},[245,306,309],{"className":247,"code":307,"filename":308,"language":250,"meta":251,"style":251},"bun add @nuxthub/core @evlog/nuxthub\n","bun",[191,310,311],{"__ignoreMap":251},[255,312,313,315,317,319],{"class":257,"line":258},[255,314,308],{"class":261},[255,316,265],{"class":264},[255,318,268],{"class":264},[255,320,271],{"class":264},[188,322,323,324,327],{},"Or with ",[191,325,326],{},"nuxi",":",[245,329,331],{"className":247,"code":330,"language":250,"meta":251,"style":251},"npx nuxi module add @nuxthub/core @evlog/nuxthub\n",[191,332,333],{"__ignoreMap":251},[255,334,335,338,341,344,346,348],{"class":257,"line":258},[255,336,337],{"class":261},"npx",[255,339,340],{"class":264}," nuxi",[255,342,343],{"class":264}," module",[255,345,265],{"class":264},[255,347,268],{"class":264},[255,349,271],{"class":264},[196,351,353],{"id":352},"setup","Setup",[188,355,356,357,327],{},"Add the module to your ",[191,358,359],{},"nuxt.config.ts",[245,361,365],{"className":362,"code":363,"filename":359,"language":364,"meta":251,"style":251},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxthub/core', '@evlog/nuxthub'],\n\n  evlog: {\n    retention: '7d',\n  },\n})\n","typescript",[191,366,367,388,424,431,442,459,465],{"__ignoreMap":251},[255,368,369,373,376,380,384],{"class":257,"line":258},[255,370,372],{"class":371},"s7zQu","export",[255,374,375],{"class":371}," default",[255,377,379],{"class":378},"s2Zo4"," defineNuxtConfig",[255,381,383],{"class":382},"sTEyZ","(",[255,385,387],{"class":386},"sMK4o","{\n",[255,389,391,395,397,400,403,406,408,411,414,416,418,421],{"class":257,"line":390},2,[255,392,394],{"class":393},"swJcz","  modules",[255,396,327],{"class":386},[255,398,399],{"class":382}," [",[255,401,402],{"class":386},"'",[255,404,405],{"class":264},"@nuxthub/core",[255,407,402],{"class":386},[255,409,410],{"class":386},",",[255,412,413],{"class":386}," '",[255,415,193],{"class":264},[255,417,402],{"class":386},[255,419,420],{"class":382},"]",[255,422,423],{"class":386},",\n",[255,425,427],{"class":257,"line":426},3,[255,428,430],{"emptyLinePlaceholder":429},true,"\n",[255,432,434,437,439],{"class":257,"line":433},4,[255,435,436],{"class":393},"  evlog",[255,438,327],{"class":386},[255,440,441],{"class":386}," {\n",[255,443,445,448,450,452,455,457],{"class":257,"line":444},5,[255,446,447],{"class":393},"    retention",[255,449,327],{"class":386},[255,451,413],{"class":386},[255,453,454],{"class":264},"7d",[255,456,402],{"class":386},[255,458,423],{"class":386},[255,460,462],{"class":257,"line":461},6,[255,463,464],{"class":386},"  },\n",[255,466,468,471],{"class":257,"line":467},7,[255,469,470],{"class":386},"}",[255,472,473],{"class":382},")\n",[188,475,476,477,479,480,482,483,486],{},"Even if ",[191,478,193],{}," can auto-register missing modules, we recommend explicitly installing ",[191,481,405],{}," and registering it in ",[191,484,485],{},"modules"," for a clearer and more predictable setup.",[188,488,489],{},"That's it. The module automatically:",[491,492,493,503,510,517],"ol",{},[207,494,495,496,499,500,502],{},"Installs ",[191,497,498],{},"evlog/nuxt"," and ",[191,501,405],{}," if not already registered",[207,504,505,506,509],{},"Registers the ",[191,507,508],{},"evlog_events"," database schema with NuxtHub",[207,511,512,513,516],{},"Hooks into ",[191,514,515],{},"evlog:drain"," to store every event in the database",[207,518,519],{},"Schedules a cleanup task based on your retention policy",[521,522,524,527,528,534,535,537],"callout",{"color":523,"icon":13},"info",[210,525,526],{},"Prerequisites:"," Your project must use ",[529,530,123],"a",{"href":531,"rel":532},"https://hub.nuxt.com",[533],"nofollow"," with a database configured. ",[191,536,193],{}," uses Drizzle ORM to interact with the database.",[196,539,541],{"id":540},"how-it-works","How It Works",[245,543,548],{"className":544,"code":546,"language":547},[545],"language-text","Request → evlog wide event → evlog:drain hook → INSERT into evlog_events table\n                                                          ↓\n                          Cron task (automatic) → DELETE events older than retention\n","text",[191,549,546],{"__ignoreMap":251},[188,551,552,553,555,556,559],{},"Every wide event emitted by evlog is stored as a row in the ",[191,554,508],{}," table. The drain plugin handles both single events and batches (when used with the ",[529,557,558],{"href":97},"pipeline",").",[561,562,564],"h3",{"id":563},"database-schema","Database Schema",[188,566,567,568,570,571,574],{},"The ",[191,569,508],{}," table stores indexed columns for fast querying and a ",[191,572,573],{},"data"," JSON column for all remaining fields:",[576,577,578,594],"table",{},[579,580,581],"thead",{},[582,583,584,588,591],"tr",{},[585,586,587],"th",{},"Column",[585,589,590],{},"Type",[585,592,593],{},"Description",[595,596,597,612,626,640,654,668,682,696,711,725,739,753,767,780],"tbody",{},[582,598,599,605,609],{},[600,601,602],"td",{},[191,603,604],{},"id",[600,606,607],{},[191,608,547],{},[600,610,611],{},"UUID primary key",[582,613,614,619,623],{},[600,615,616],{},[191,617,618],{},"timestamp",[600,620,621],{},[191,622,547],{},[600,624,625],{},"Event timestamp",[582,627,628,633,637],{},[600,629,630],{},[191,631,632],{},"level",[600,634,635],{},[191,636,547],{},[600,638,639],{},"Log level (info, warn, error, debug)",[582,641,642,647,651],{},[600,643,644],{},[191,645,646],{},"service",[600,648,649],{},[191,650,547],{},[600,652,653],{},"Service name",[582,655,656,661,665],{},[600,657,658],{},[191,659,660],{},"environment",[600,662,663],{},[191,664,547],{},[600,666,667],{},"Environment (production, staging, etc.)",[582,669,670,675,679],{},[600,671,672],{},[191,673,674],{},"method",[600,676,677],{},[191,678,547],{},[600,680,681],{},"HTTP method",[582,683,684,689,693],{},[600,685,686],{},[191,687,688],{},"path",[600,690,691],{},[191,692,547],{},[600,694,695],{},"Request path",[582,697,698,703,708],{},[600,699,700],{},[191,701,702],{},"status",[600,704,705],{},[191,706,707],{},"integer",[600,709,710],{},"HTTP status code",[582,712,713,718,722],{},[600,714,715],{},[191,716,717],{},"duration_ms",[600,719,720],{},[191,721,707],{},[600,723,724],{},"Request duration in milliseconds",[582,726,727,732,736],{},[600,728,729],{},[191,730,731],{},"request_id",[600,733,734],{},[191,735,547],{},[600,737,738],{},"Request correlation ID",[582,740,741,746,750],{},[600,742,743],{},[191,744,745],{},"source",[600,747,748],{},[191,749,547],{},[600,751,752],{},"Event source (server, client)",[582,754,755,760,764],{},[600,756,757],{},[191,758,759],{},"error",[600,761,762],{},[191,763,547],{},[600,765,766],{},"Error details (JSON string)",[582,768,769,773,777],{},[600,770,771],{},[191,772,573],{},[600,774,775],{},[191,776,547],{},[600,778,779],{},"All remaining event fields (JSON)",[582,781,782,787,791],{},[600,783,784],{},[191,785,786],{},"created_at",[600,788,789],{},[191,790,547],{},[600,792,793],{},"Row insertion timestamp",[188,795,796,797,799,800,799,802,799,804,799,806,799,808,810],{},"Indexed columns: ",[191,798,618],{},", ",[191,801,632],{},[191,803,646],{},[191,805,702],{},[191,807,731],{},[191,809,786],{},".",[561,812,814],{"id":813},"dialect-support","Dialect Support",[188,816,817],{},"The schema is automatically registered for your NuxtHub database dialect:",[204,819,820,826,831],{},[207,821,822,825],{},[210,823,824],{},"SQLite"," (default for Cloudflare D1)",[207,827,828],{},[210,829,830],{},"MySQL",[207,832,833],{},[210,834,835],{},"PostgreSQL",[188,837,838,839,842],{},"The correct schema is selected via the ",[191,840,841],{},"hub:db:schema:extend"," hook based on your NuxtHub configuration.",[196,844,846],{"id":845},"combining-with-external-adapters","Combining with External Adapters",[188,848,849,851,852,854],{},[191,850,193],{}," doesn't replace external adapters — you can use both. The module registers its own ",[191,853,515],{}," hook, so any other drain plugins you have will still work:",[245,856,859],{"className":362,"code":857,"filename":858,"language":364,"meta":251,"style":251},"import { createAxiomDrain } from 'evlog/axiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  // This runs alongside @evlog/nuxthub's built-in drain\n  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())\n})\n","server/plugins/evlog-drain.ts",[191,860,861,886,890,916,922,952],{"__ignoreMap":251},[255,862,863,866,869,872,875,878,880,883],{"class":257,"line":258},[255,864,865],{"class":371},"import",[255,867,868],{"class":386}," {",[255,870,871],{"class":382}," createAxiomDrain",[255,873,874],{"class":386}," }",[255,876,877],{"class":371}," from",[255,879,413],{"class":386},[255,881,882],{"class":264},"evlog/axiom",[255,884,885],{"class":386},"'\n",[255,887,888],{"class":257,"line":390},[255,889,430],{"emptyLinePlaceholder":429},[255,891,892,894,896,899,901,903,907,910,914],{"class":257,"line":426},[255,893,372],{"class":371},[255,895,375],{"class":371},[255,897,898],{"class":378}," defineNitroPlugin",[255,900,383],{"class":382},[255,902,383],{"class":386},[255,904,906],{"class":905},"sHdIc","nitroApp",[255,908,909],{"class":386},")",[255,911,913],{"class":912},"spNyl"," =>",[255,915,441],{"class":386},[255,917,918],{"class":257,"line":433},[255,919,921],{"class":920},"sHwdD","  // This runs alongside @evlog/nuxthub's built-in drain\n",[255,923,924,927,929,932,934,937,939,941,943,945,947,949],{"class":257,"line":444},[255,925,926],{"class":382},"  nitroApp",[255,928,810],{"class":386},[255,930,931],{"class":382},"hooks",[255,933,810],{"class":386},[255,935,936],{"class":378},"hook",[255,938,383],{"class":393},[255,940,402],{"class":386},[255,942,515],{"class":264},[255,944,402],{"class":386},[255,946,410],{"class":386},[255,948,871],{"class":378},[255,950,951],{"class":393},"())\n",[255,953,954,956],{"class":257,"line":461},[255,955,470],{"class":386},[255,957,473],{"class":382},[196,959,961],{"id":960},"next-steps","Next Steps",[204,963,964],{},[207,965,966,969],{},[529,967,968],{"href":133},"Retention & Cleanup"," — Configure retention policy and cleanup scheduling",[971,972,973],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":251,"searchDepth":390,"depth":390,"links":975},[976,977,978,979,983,984],{"id":198,"depth":390,"text":199},{"id":239,"depth":390,"text":240},{"id":352,"depth":390,"text":353},{"id":540,"depth":390,"text":541,"children":980},[981,982],{"id":563,"depth":426,"text":564},{"id":813,"depth":426,"text":814},{"id":845,"depth":390,"text":846},{"id":960,"depth":390,"text":961},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.","md",[988,993],{"label":123,"icon":989,"to":531,"target":990,"color":991,"variant":992},"i-lucide-external-link","_blank","neutral","subtle",{"label":56,"icon":64,"to":62,"color":991,"variant":992},{},{"title":61,"icon":130},{"title":183,"description":985},"F5e3TvYQeqA50ikCUEtSClNVaxTBoTDzLW2Svq_BEQs",[999,1001],{"title":119,"path":120,"stem":121,"description":1000,"icon":94,"children":-1},"Write custom enrichers to add derived context to your wide events. Add deployment metadata, tenant IDs, feature flags, or any computed data.",{"title":132,"path":133,"stem":134,"description":1002,"icon":135,"children":-1},"Configure how long logs are kept in NuxtHub and how they are automatically cleaned up with scheduled tasks, cron jobs, and retention policies.",1772900820331]