[{"data":1,"prerenderedAt":1612},["ShallowReactive",2],{"navigation_docs":3,"-integrations-analytics-posthog":322,"-integrations-analytics-posthog-surround":1607},[4,10,62,88,241,307],{"title":5,"path":6,"stem":7,"icon":8,"exact":9},"Introduction","\u002F","0.index","i-lucide-book-open",true,{"title":11,"icon":12,"modifiedAt":13,"path":14,"stem":15,"children":16,"page":12},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[17,22,27,32,37,42,47,52,57],{"title":18,"path":19,"stem":20,"icon":21},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":23,"path":24,"stem":25,"icon":26},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":28,"path":29,"stem":30,"icon":31},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":33,"path":34,"stem":35,"icon":36},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":38,"path":39,"stem":40,"icon":41},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":48,"path":49,"stem":50,"icon":51},"Experiments","\u002Fgetting-started\u002Fexperiments","1.getting-started\u002F7.experiments","i-lucide-flask-round",{"title":53,"path":54,"stem":55,"icon":56},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F8.segments","i-lucide-squares-intersect",{"title":58,"path":59,"stem":60,"icon":61},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F9.pricing-and-billing","i-lucide-credit-card",{"title":63,"modifiedAt":64,"defaultOpen":9,"path":65,"stem":66,"children":67,"page":12},"Monitoring","2026-09-24T23:33:20.000Z","\u002Fmonitoring","2.monitoring",[68,73,78,83],{"title":69,"path":70,"stem":71,"icon":72},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":74,"path":75,"stem":76,"icon":77},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":79,"path":80,"stem":81,"icon":82},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":84,"path":85,"stem":86,"icon":87},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":89,"modifiedAt":64,"defaultOpen":9,"path":90,"stem":91,"children":92,"page":12},"SDKs","\u002Fsdks","3.sdks",[93,98,119,144,160,191,236],{"title":94,"path":95,"stem":96,"icon":97},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":99,"modifiedAt":64,"icon":100,"defaultOpen":12,"path":101,"stem":102,"children":103,"page":12},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[104,109,114],{"title":105,"path":106,"stem":107,"icon":108},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":110,"path":111,"stem":112,"icon":113},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":115,"path":116,"stem":117,"icon":118},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":120,"modifiedAt":64,"icon":121,"defaultOpen":12,"path":122,"stem":123,"children":124,"page":12},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[125,129,134,139],{"title":126,"path":127,"stem":128,"icon":113},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":130,"path":131,"stem":132,"icon":133},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":135,"path":136,"stem":137,"icon":138},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":140,"path":141,"stem":142,"icon":143},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":145,"modifiedAt":64,"icon":146,"defaultOpen":12,"path":147,"stem":148,"children":149,"page":12},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[150,155],{"title":151,"path":152,"stem":153,"icon":154},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":156,"path":157,"stem":158,"icon":159},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":161,"modifiedAt":64,"icon":162,"defaultOpen":12,"path":163,"stem":164,"children":165,"page":12},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[166,171,176,181,186],{"title":167,"path":168,"stem":169,"icon":170},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":172,"path":173,"stem":174,"icon":175},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":177,"path":178,"stem":179,"icon":180},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":182,"path":183,"stem":184,"icon":185},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":187,"path":188,"stem":189,"icon":190},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":192,"modifiedAt":64,"icon":193,"defaultOpen":12,"path":194,"stem":195,"children":196},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature\u002Findex",[197,199,204,208,212,216,220,224,228,232],{"title":198,"path":194,"stem":195,"icon":193},"Overview",{"title":200,"path":201,"stem":202,"icon":193,"icons":203},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[193,108],{"title":135,"path":205,"stem":206,"icon":193,"icons":207},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[193,138],{"title":140,"path":209,"stem":210,"icon":193,"icons":211},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[193,143],{"title":130,"path":213,"stem":214,"icon":193,"icons":215},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[193,133],{"title":167,"path":217,"stem":218,"icon":193,"icons":219},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[193,170],{"title":172,"path":221,"stem":222,"icon":193,"icons":223},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[193,175],{"title":177,"path":225,"stem":226,"icon":193,"icons":227},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[193,180],{"title":182,"path":229,"stem":230,"icon":193,"icons":231},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[193,185],{"title":187,"path":233,"stem":234,"icon":193,"icons":235},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[193,190],{"title":237,"path":238,"stem":239,"icon":240},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":242,"modifiedAt":64,"defaultOpen":9,"path":243,"stem":244,"children":245,"page":12},"Integrations","\u002Fintegrations","4.integrations",[246,251,256,261,266,270,275,280],{"title":247,"path":248,"stem":249,"icon":250},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F1.mcp","cd-logos-mcp",{"title":252,"path":253,"stem":254,"icon":255},"Agent Skills","\u002Fintegrations\u002Fagents","4.integrations\u002F2.agents","i-lucide-bot",{"title":257,"path":258,"stem":259,"icon":260},"CLI","\u002Fintegrations\u002Fcli","4.integrations\u002F3.cli","cd-logos-cli",{"title":262,"path":263,"stem":264,"icon":265},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F4.terraform","cd-logos-terraform",{"title":267,"path":268,"stem":269,"icon":41},"Admin API","\u002Fintegrations\u002Fadmin-api","4.integrations\u002F5.admin-api",{"title":271,"path":272,"stem":273,"icon":274},"Webhooks","\u002Fintegrations\u002Fwebhooks","4.integrations\u002F6.webhooks","i-lucide-webhook",{"title":276,"path":277,"stem":278,"icon":279},"Analytics integrations","\u002Fintegrations\u002Fanalytics-integrations","4.integrations\u002F7.analytics-integrations","i-lucide-blocks",{"title":281,"modifiedAt":282,"icon":283,"defaultOpen":12,"path":284,"stem":285,"children":286,"page":12},"Analytics","2026-11-08T06:12:58.000Z","i-lucide-chart-line","\u002Fintegrations\u002Fanalytics","4.integrations\u002F8.analytics",[287,291,295,299,303],{"title":288,"path":289,"stem":290,"icon":283},"Amplitude","\u002Fintegrations\u002Fanalytics\u002Famplitude","4.integrations\u002F8.analytics\u002F1.amplitude",{"title":292,"path":293,"stem":294,"icon":283},"Mixpanel","\u002Fintegrations\u002Fanalytics\u002Fmixpanel","4.integrations\u002F8.analytics\u002F2.mixpanel",{"title":296,"path":297,"stem":298,"icon":283},"Google Analytics 4","\u002Fintegrations\u002Fanalytics\u002Fga4","4.integrations\u002F8.analytics\u002F3.ga4",{"title":300,"path":301,"stem":302,"icon":283},"Segment","\u002Fintegrations\u002Fanalytics\u002Fsegment","4.integrations\u002F8.analytics\u002F4.segment",{"title":304,"path":305,"stem":306,"icon":283},"PostHog","\u002Fintegrations\u002Fanalytics\u002Fposthog","4.integrations\u002F8.analytics\u002F5.posthog",{"title":308,"modifiedAt":309,"defaultOpen":9,"path":310,"stem":311,"children":312,"page":12},"Migration Guides","2026-10-16T17:57:49.000Z","\u002Fmigration-guides","5.migration-guides",[313,318],{"title":314,"path":315,"stem":316,"icon":317},"From LaunchDarkly","\u002Fmigration-guides\u002Flaunchdarkly","5.migration-guides\u002F1.launchdarkly","i-lucide-baggage-claim",{"title":319,"path":320,"stem":321,"icon":317},"From Firebase Remote Config","\u002Fmigration-guides\u002Ffirebase-remote-config","5.migration-guides\u002F2.firebase-remote-config",{"id":323,"title":304,"body":324,"description":1598,"extension":1599,"links":1600,"meta":1601,"navigation":1602,"path":305,"seo":1603,"stem":306,"__hash__":1606},"docs\u002F4.integrations\u002F8.analytics\u002F5.posthog.md",{"type":325,"value":326,"toc":1590},"minimark",[327,331,340,343,347,362,415,418,435,439,459,951,959,973,985,989,996,1481,1493,1497,1500,1518,1522,1531,1545,1559,1562,1576,1579,1586],[328,329,5],"h2",{"id":330},"introduction",[332,333,334,335,339],"p",{},"To compare an ",[336,337,338],"a",{"href":49},"experiment","'s variations in PostHog, your application tells PostHog which variation each user saw. You add a handler once, and PostHog joins those exposures to the events you already send it.",[332,341,342],{},"Nothing passes through ConfigDirector, and ConfigDirector never holds your PostHog API key.",[328,344,346],{"id":345},"what-posthog-reads","What PostHog reads",[332,348,349,350,361],{},"PostHog's experiments count a user as exposed when it receives a ",[336,351,356,360],{"href":352,"rel":353,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Fexposures#what-is-an-exposure",[354],"noopener","_blank",[357,358,359],"code",{},"$feature_flag_called"," event"," with two properties:",[363,364,365,381],"table",{},[366,367,368],"thead",{},[369,370,371,375,378],"tr",{},[372,373,374],"th",{},"Property",[372,376,377],{},"What you send",[372,379,380],{},"Example",[382,383,384,400],"tbody",{},[369,385,386,392,395],{},[387,388,389],"td",{},[357,390,391],{},"$feature_flag",[387,393,394],{},"The config key",[387,396,397],{},[357,398,399],{},"checkout-cta-copy",[369,401,402,407,410],{},[387,403,404],{},[357,405,406],{},"$feature_flag_response",[387,408,409],{},"The variation's name",[387,411,412],{},[357,413,414],{},"treatment-a",[332,416,417],{},"PostHog's SDKs normally send this event themselves when they read one of its own flags. Your handler sends it instead, because ConfigDirector serves the variation.",[332,419,420,421,424,425,430,431,434],{},"If you would rather use an event you already send, such as ",[357,422,423],{},"$pageview",", PostHog also ",[336,426,429],{"href":427,"rel":428,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Frunning-experiments-without-feature-flags",[354],"accepts a custom exposure event",": choose it in the experiment's settings, and send the variation in a ",[357,432,433],{},"$feature\u002Fcheckout-cta-copy"," property.",[328,436,438],{"id":437},"add-the-handler","Add the handler",[332,440,441,442,445,446,450,451,454,455,458],{},"Add a handler for the ",[357,443,444],{},"configEvaluated"," hook where you create the client, in the ",[336,447,449],{"href":448},"\u002Fsdks\u002Fbrowser\u002Fjavascript#hooks","browser"," or in ",[336,452,167],{"href":453},"\u002Fsdks\u002Fserver\u002Fnode-js#hooks",". The examples use PostHog's US host; on its EU cloud, use ",[357,456,457],{},"https:\u002F\u002Feu.i.posthog.com",":",[460,461,462,717],"code-group",{},[463,464,470],"pre",{"className":465,"code":466,"filename":467,"language":468,"meta":469,"style":469},"language-ts shiki shiki-themes github-light-high-contrast github-light github-dark","import { createClient } from \"@configdirector\u002Fclient-sdk\";\nimport posthog from \"posthog-js\";\n\nposthog.init(\"YOUR-POSTHOG-PROJECT-API-KEY\", { api_host: \"https:\u002F\u002Fus.i.posthog.com\" });\n\nexport const client = createClient(\"YOUR-CLIENT-SDK-KEY\", {\n  hooks: {\n    configEvaluated: ({ evaluation }) => {\n      const variationName = evaluation.variation?.name;\n      if (!variationName) return;\n\n      posthog.capture(\"$feature_flag_called\", {\n        $feature_flag: evaluation.key,\n        $feature_flag_response: variationName,\n      });\n    },\n  },\n});\n\nawait client.initialize({ id: \"user-42\" });\n","Browser","ts","",[357,471,472,495,510,516,541,546,573,579,601,615,635,640,656,662,668,674,680,686,692,697],{"__ignoreMap":469},[473,474,477,481,485,488,492],"span",{"class":475,"line":476},"line",1,[473,478,480],{"class":479},"sLDKn","import",[473,482,484],{"class":483},"sbRM4"," { createClient } ",[473,486,487],{"class":479},"from",[473,489,491],{"class":490},"suztq"," \"@configdirector\u002Fclient-sdk\"",[473,493,494],{"class":483},";\n",[473,496,498,500,503,505,508],{"class":475,"line":497},2,[473,499,480],{"class":479},[473,501,502],{"class":483}," posthog ",[473,504,487],{"class":479},[473,506,507],{"class":490}," \"posthog-js\"",[473,509,494],{"class":483},[473,511,513],{"class":475,"line":512},3,[473,514,515],{"emptyLinePlaceholder":9},"\n",[473,517,519,522,526,529,532,535,538],{"class":475,"line":518},4,[473,520,521],{"class":483},"posthog.",[473,523,525],{"class":524},"sEIia","init",[473,527,528],{"class":483},"(",[473,530,531],{"class":490},"\"YOUR-POSTHOG-PROJECT-API-KEY\"",[473,533,534],{"class":483},", { api_host: ",[473,536,537],{"class":490},"\"https:\u002F\u002Fus.i.posthog.com\"",[473,539,540],{"class":483}," });\n",[473,542,544],{"class":475,"line":543},5,[473,545,515],{"emptyLinePlaceholder":9},[473,547,549,552,555,559,562,565,567,570],{"class":475,"line":548},6,[473,550,551],{"class":479},"export",[473,553,554],{"class":479}," const",[473,556,558],{"class":557},"sxMNI"," client",[473,560,561],{"class":479}," =",[473,563,564],{"class":524}," createClient",[473,566,528],{"class":483},[473,568,569],{"class":490},"\"YOUR-CLIENT-SDK-KEY\"",[473,571,572],{"class":483},", {\n",[473,574,576],{"class":475,"line":575},7,[473,577,578],{"class":483},"  hooks: {\n",[473,580,582,585,588,592,595,598],{"class":475,"line":581},8,[473,583,584],{"class":524},"    configEvaluated",[473,586,587],{"class":483},": ({ ",[473,589,591],{"class":590},"syyZu","evaluation",[473,593,594],{"class":483}," }) ",[473,596,597],{"class":479},"=>",[473,599,600],{"class":483}," {\n",[473,602,604,607,610,612],{"class":475,"line":603},9,[473,605,606],{"class":479},"      const",[473,608,609],{"class":557}," variationName",[473,611,561],{"class":479},[473,613,614],{"class":483}," evaluation.variation?.name;\n",[473,616,618,621,624,627,630,633],{"class":475,"line":617},10,[473,619,620],{"class":479},"      if",[473,622,623],{"class":483}," (",[473,625,626],{"class":479},"!",[473,628,629],{"class":483},"variationName) ",[473,631,632],{"class":479},"return",[473,634,494],{"class":483},[473,636,638],{"class":475,"line":637},11,[473,639,515],{"emptyLinePlaceholder":9},[473,641,643,646,649,651,654],{"class":475,"line":642},12,[473,644,645],{"class":483},"      posthog.",[473,647,648],{"class":524},"capture",[473,650,528],{"class":483},[473,652,653],{"class":490},"\"$feature_flag_called\"",[473,655,572],{"class":483},[473,657,659],{"class":475,"line":658},13,[473,660,661],{"class":483},"        $feature_flag: evaluation.key,\n",[473,663,665],{"class":475,"line":664},14,[473,666,667],{"class":483},"        $feature_flag_response: variationName,\n",[473,669,671],{"class":475,"line":670},15,[473,672,673],{"class":483},"      });\n",[473,675,677],{"class":475,"line":676},16,[473,678,679],{"class":483},"    },\n",[473,681,683],{"class":475,"line":682},17,[473,684,685],{"class":483},"  },\n",[473,687,689],{"class":475,"line":688},18,[473,690,691],{"class":483},"});\n",[473,693,695],{"class":475,"line":694},19,[473,696,515],{"emptyLinePlaceholder":9},[473,698,700,703,706,709,712,715],{"class":475,"line":699},20,[473,701,702],{"class":479},"await",[473,704,705],{"class":483}," client.",[473,707,708],{"class":524},"initialize",[473,710,711],{"class":483},"({ id: ",[473,713,714],{"class":490},"\"user-42\"",[473,716,540],{"class":483},[463,718,720],{"className":465,"code":719,"filename":167,"language":468,"meta":469,"style":469},"import { createClient } from \"@configdirector\u002Fserver-sdk\";\nimport { PostHog } from \"posthog-node\";\n\nconst posthog = new PostHog(\"YOUR-POSTHOG-PROJECT-API-KEY\", { host: \"https:\u002F\u002Fus.i.posthog.com\" });\n\nexport const client = createClient(\"YOUR-SERVER-SDK-KEY\", {\n  hooks: {\n    configEvaluated: ({ evaluation }) => {\n      const variationName = evaluation.variation?.name;\n      const userId = evaluation.context?.id;\n      if (!variationName || !userId) return;\n\n      posthog.capture({\n        distinctId: userId,\n        event: \"$feature_flag_called\",\n        properties: {\n          $feature_flag: evaluation.key,\n          $feature_flag_response: variationName,\n        },\n      });\n    },\n  },\n});\n\nawait client.initialize();\n",[357,721,722,735,749,753,780,784,803,807,821,831,843,867,871,880,885,895,900,905,910,915,919,924,929,934,939],{"__ignoreMap":469},[473,723,724,726,728,730,733],{"class":475,"line":476},[473,725,480],{"class":479},[473,727,484],{"class":483},[473,729,487],{"class":479},[473,731,732],{"class":490}," \"@configdirector\u002Fserver-sdk\"",[473,734,494],{"class":483},[473,736,737,739,742,744,747],{"class":475,"line":497},[473,738,480],{"class":479},[473,740,741],{"class":483}," { PostHog } ",[473,743,487],{"class":479},[473,745,746],{"class":490}," \"posthog-node\"",[473,748,494],{"class":483},[473,750,751],{"class":475,"line":512},[473,752,515],{"emptyLinePlaceholder":9},[473,754,755,758,761,763,766,769,771,773,776,778],{"class":475,"line":518},[473,756,757],{"class":479},"const",[473,759,760],{"class":557}," posthog",[473,762,561],{"class":479},[473,764,765],{"class":479}," new",[473,767,768],{"class":524}," PostHog",[473,770,528],{"class":483},[473,772,531],{"class":490},[473,774,775],{"class":483},", { host: ",[473,777,537],{"class":490},[473,779,540],{"class":483},[473,781,782],{"class":475,"line":543},[473,783,515],{"emptyLinePlaceholder":9},[473,785,786,788,790,792,794,796,798,801],{"class":475,"line":548},[473,787,551],{"class":479},[473,789,554],{"class":479},[473,791,558],{"class":557},[473,793,561],{"class":479},[473,795,564],{"class":524},[473,797,528],{"class":483},[473,799,800],{"class":490},"\"YOUR-SERVER-SDK-KEY\"",[473,802,572],{"class":483},[473,804,805],{"class":475,"line":575},[473,806,578],{"class":483},[473,808,809,811,813,815,817,819],{"class":475,"line":581},[473,810,584],{"class":524},[473,812,587],{"class":483},[473,814,591],{"class":590},[473,816,594],{"class":483},[473,818,597],{"class":479},[473,820,600],{"class":483},[473,822,823,825,827,829],{"class":475,"line":603},[473,824,606],{"class":479},[473,826,609],{"class":557},[473,828,561],{"class":479},[473,830,614],{"class":483},[473,832,833,835,838,840],{"class":475,"line":617},[473,834,606],{"class":479},[473,836,837],{"class":557}," userId",[473,839,561],{"class":479},[473,841,842],{"class":483}," evaluation.context?.id;\n",[473,844,845,847,849,851,854,857,860,863,865],{"class":475,"line":637},[473,846,620],{"class":479},[473,848,623],{"class":483},[473,850,626],{"class":479},[473,852,853],{"class":483},"variationName ",[473,855,856],{"class":479},"||",[473,858,859],{"class":479}," !",[473,861,862],{"class":483},"userId) ",[473,864,632],{"class":479},[473,866,494],{"class":483},[473,868,869],{"class":475,"line":642},[473,870,515],{"emptyLinePlaceholder":9},[473,872,873,875,877],{"class":475,"line":658},[473,874,645],{"class":483},[473,876,648],{"class":524},[473,878,879],{"class":483},"({\n",[473,881,882],{"class":475,"line":664},[473,883,884],{"class":483},"        distinctId: userId,\n",[473,886,887,890,892],{"class":475,"line":670},[473,888,889],{"class":483},"        event: ",[473,891,653],{"class":490},[473,893,894],{"class":483},",\n",[473,896,897],{"class":475,"line":676},[473,898,899],{"class":483},"        properties: {\n",[473,901,902],{"class":475,"line":682},[473,903,904],{"class":483},"          $feature_flag: evaluation.key,\n",[473,906,907],{"class":475,"line":688},[473,908,909],{"class":483},"          $feature_flag_response: variationName,\n",[473,911,912],{"class":475,"line":694},[473,913,914],{"class":483},"        },\n",[473,916,917],{"class":475,"line":699},[473,918,673],{"class":483},[473,920,922],{"class":475,"line":921},21,[473,923,679],{"class":483},[473,925,927],{"class":475,"line":926},22,[473,928,685],{"class":483},[473,930,932],{"class":475,"line":931},23,[473,933,691],{"class":483},[473,935,937],{"class":475,"line":936},24,[473,938,515],{"emptyLinePlaceholder":9},[473,940,942,944,946,948],{"class":475,"line":941},25,[473,943,702],{"class":479},[473,945,705],{"class":483},[473,947,708],{"class":524},[473,949,950],{"class":483},"();\n",[332,952,953,954,958],{},"Only an experiment's evaluations carry a variation, so the check skips every other config, along with the in-code default value. It also skips a variation without a name, so ",[336,955,957],{"href":956},"\u002Fgetting-started\u002Fexperiments#create-the-experiment","name each one",".",[332,960,961,962,965,966,969,970,972],{},"In the browser, PostHog attaches the exposure to the user you have identified to it. In Node.js, the handler passes the context's ",[357,963,964],{},"id"," as the ",[357,967,968],{},"distinctId",", so it has to be the ID your other PostHog events use. A context without an ",[357,971,964],{}," is skipped, since it does not take part in the split on a server.",[332,974,975,976,979,980,984],{},"The handler needs version 1.11.0 or later of the JavaScript SDK, or 1.13.0 or later of the Node.js SDK. React, Vue and React Native take the same handler in their ",[357,977,978],{},"hooks",". The ",[336,981,983],{"href":982},"\u002Fgetting-started\u002Fexperiments#send-exposures-to-your-analytics-tool","Experiments guide"," lists the hook for every other SDK.",[328,986,988],{"id":987},"with-openfeature","With OpenFeature",[332,990,991,992,995],{},"In an OpenFeature application, a hook does the same job, with the ",[357,993,994],{},"variant"," as the variation's name. Every config has a variant, not only experiments: on any other config it is ConfigDirector's ID for the value. So attach the hook to the reads of your experiments instead of registering it for every read:",[460,997,998,1216],{},[463,999,1001],{"className":465,"code":1000,"filename":200,"language":468,"meta":469,"style":469},"import { OpenFeature, type Hook } from \"@openfeature\u002Fweb-sdk\";\nimport posthog from \"posthog-js\";\n\nposthog.init(\"YOUR-POSTHOG-PROJECT-API-KEY\", { api_host: \"https:\u002F\u002Fus.i.posthog.com\" });\n\nconst reportExposure: Hook = {\n  after: (hookContext, details) => {\n    if (!details.variant) return;\n\n    posthog.capture(\"$feature_flag_called\", {\n      $feature_flag: hookContext.flagKey,\n      $feature_flag_response: details.variant,\n    });\n  },\n};\n\nconst client = OpenFeature.getClient();\n\nconst buttonLabel = client.getStringValue(\"checkout-cta-copy\", \"Start free trial\", {\n  hooks: [reportExposure],\n});\n",[357,1002,1003,1023,1035,1039,1055,1059,1076,1100,1116,1120,1133,1138,1143,1148,1152,1157,1161,1177,1181,1207,1212],{"__ignoreMap":469},[473,1004,1005,1007,1010,1013,1016,1018,1021],{"class":475,"line":476},[473,1006,480],{"class":479},[473,1008,1009],{"class":483}," { OpenFeature, ",[473,1011,1012],{"class":479},"type",[473,1014,1015],{"class":483}," Hook } ",[473,1017,487],{"class":479},[473,1019,1020],{"class":490}," \"@openfeature\u002Fweb-sdk\"",[473,1022,494],{"class":483},[473,1024,1025,1027,1029,1031,1033],{"class":475,"line":497},[473,1026,480],{"class":479},[473,1028,502],{"class":483},[473,1030,487],{"class":479},[473,1032,507],{"class":490},[473,1034,494],{"class":483},[473,1036,1037],{"class":475,"line":512},[473,1038,515],{"emptyLinePlaceholder":9},[473,1040,1041,1043,1045,1047,1049,1051,1053],{"class":475,"line":518},[473,1042,521],{"class":483},[473,1044,525],{"class":524},[473,1046,528],{"class":483},[473,1048,531],{"class":490},[473,1050,534],{"class":483},[473,1052,537],{"class":490},[473,1054,540],{"class":483},[473,1056,1057],{"class":475,"line":543},[473,1058,515],{"emptyLinePlaceholder":9},[473,1060,1061,1063,1066,1068,1072,1074],{"class":475,"line":548},[473,1062,757],{"class":479},[473,1064,1065],{"class":557}," reportExposure",[473,1067,458],{"class":479},[473,1069,1071],{"class":1070},"sA9AF"," Hook",[473,1073,561],{"class":479},[473,1075,600],{"class":483},[473,1077,1078,1081,1084,1087,1090,1093,1096,1098],{"class":475,"line":575},[473,1079,1080],{"class":524},"  after",[473,1082,1083],{"class":483},": (",[473,1085,1086],{"class":590},"hookContext",[473,1088,1089],{"class":483},", ",[473,1091,1092],{"class":590},"details",[473,1094,1095],{"class":483},") ",[473,1097,597],{"class":479},[473,1099,600],{"class":483},[473,1101,1102,1105,1107,1109,1112,1114],{"class":475,"line":581},[473,1103,1104],{"class":479},"    if",[473,1106,623],{"class":483},[473,1108,626],{"class":479},[473,1110,1111],{"class":483},"details.variant) ",[473,1113,632],{"class":479},[473,1115,494],{"class":483},[473,1117,1118],{"class":475,"line":603},[473,1119,515],{"emptyLinePlaceholder":9},[473,1121,1122,1125,1127,1129,1131],{"class":475,"line":617},[473,1123,1124],{"class":483},"    posthog.",[473,1126,648],{"class":524},[473,1128,528],{"class":483},[473,1130,653],{"class":490},[473,1132,572],{"class":483},[473,1134,1135],{"class":475,"line":637},[473,1136,1137],{"class":483},"      $feature_flag: hookContext.flagKey,\n",[473,1139,1140],{"class":475,"line":642},[473,1141,1142],{"class":483},"      $feature_flag_response: details.variant,\n",[473,1144,1145],{"class":475,"line":658},[473,1146,1147],{"class":483},"    });\n",[473,1149,1150],{"class":475,"line":664},[473,1151,685],{"class":483},[473,1153,1154],{"class":475,"line":670},[473,1155,1156],{"class":483},"};\n",[473,1158,1159],{"class":475,"line":676},[473,1160,515],{"emptyLinePlaceholder":9},[473,1162,1163,1165,1167,1169,1172,1175],{"class":475,"line":682},[473,1164,757],{"class":479},[473,1166,558],{"class":557},[473,1168,561],{"class":479},[473,1170,1171],{"class":483}," OpenFeature.",[473,1173,1174],{"class":524},"getClient",[473,1176,950],{"class":483},[473,1178,1179],{"class":475,"line":688},[473,1180,515],{"emptyLinePlaceholder":9},[473,1182,1183,1185,1188,1190,1192,1195,1197,1200,1202,1205],{"class":475,"line":694},[473,1184,757],{"class":479},[473,1186,1187],{"class":557}," buttonLabel",[473,1189,561],{"class":479},[473,1191,705],{"class":483},[473,1193,1194],{"class":524},"getStringValue",[473,1196,528],{"class":483},[473,1198,1199],{"class":490},"\"checkout-cta-copy\"",[473,1201,1089],{"class":483},[473,1203,1204],{"class":490},"\"Start free trial\"",[473,1206,572],{"class":483},[473,1208,1209],{"class":475,"line":699},[473,1210,1211],{"class":483},"  hooks: [reportExposure],\n",[473,1213,1214],{"class":475,"line":921},[473,1215,691],{"class":483},[463,1217,1219],{"className":465,"code":1218,"filename":167,"language":468,"meta":469,"style":469},"import { OpenFeature, type Hook } from \"@openfeature\u002Fserver-sdk\";\nimport { PostHog } from \"posthog-node\";\n\nconst posthog = new PostHog(\"YOUR-POSTHOG-PROJECT-API-KEY\", { host: \"https:\u002F\u002Fus.i.posthog.com\" });\n\nconst reportExposure: Hook = {\n  after: (hookContext, details) => {\n    const userId = hookContext.context.targetingKey;\n    if (!details.variant || !userId) return;\n\n    posthog.capture({\n      distinctId: userId,\n      event: \"$feature_flag_called\",\n      properties: {\n        $feature_flag: hookContext.flagKey,\n        $feature_flag_response: details.variant,\n      },\n    });\n  },\n};\n\nconst client = OpenFeature.getClient();\n\nconst buttonLabel = await client.getStringValue(\n  \"checkout-cta-copy\",\n  \"Start free trial\",\n  { targetingKey: \"user-42\" },\n  { hooks: [reportExposure] },\n);\n",[357,1220,1221,1238,1250,1254,1276,1280,1294,1312,1324,1345,1349,1357,1362,1371,1376,1381,1386,1391,1395,1399,1403,1407,1421,1425,1443,1450,1458,1469,1475],{"__ignoreMap":469},[473,1222,1223,1225,1227,1229,1231,1233,1236],{"class":475,"line":476},[473,1224,480],{"class":479},[473,1226,1009],{"class":483},[473,1228,1012],{"class":479},[473,1230,1015],{"class":483},[473,1232,487],{"class":479},[473,1234,1235],{"class":490}," \"@openfeature\u002Fserver-sdk\"",[473,1237,494],{"class":483},[473,1239,1240,1242,1244,1246,1248],{"class":475,"line":497},[473,1241,480],{"class":479},[473,1243,741],{"class":483},[473,1245,487],{"class":479},[473,1247,746],{"class":490},[473,1249,494],{"class":483},[473,1251,1252],{"class":475,"line":512},[473,1253,515],{"emptyLinePlaceholder":9},[473,1255,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274],{"class":475,"line":518},[473,1257,757],{"class":479},[473,1259,760],{"class":557},[473,1261,561],{"class":479},[473,1263,765],{"class":479},[473,1265,768],{"class":524},[473,1267,528],{"class":483},[473,1269,531],{"class":490},[473,1271,775],{"class":483},[473,1273,537],{"class":490},[473,1275,540],{"class":483},[473,1277,1278],{"class":475,"line":543},[473,1279,515],{"emptyLinePlaceholder":9},[473,1281,1282,1284,1286,1288,1290,1292],{"class":475,"line":548},[473,1283,757],{"class":479},[473,1285,1065],{"class":557},[473,1287,458],{"class":479},[473,1289,1071],{"class":1070},[473,1291,561],{"class":479},[473,1293,600],{"class":483},[473,1295,1296,1298,1300,1302,1304,1306,1308,1310],{"class":475,"line":575},[473,1297,1080],{"class":524},[473,1299,1083],{"class":483},[473,1301,1086],{"class":590},[473,1303,1089],{"class":483},[473,1305,1092],{"class":590},[473,1307,1095],{"class":483},[473,1309,597],{"class":479},[473,1311,600],{"class":483},[473,1313,1314,1317,1319,1321],{"class":475,"line":581},[473,1315,1316],{"class":479},"    const",[473,1318,837],{"class":557},[473,1320,561],{"class":479},[473,1322,1323],{"class":483}," hookContext.context.targetingKey;\n",[473,1325,1326,1328,1330,1332,1335,1337,1339,1341,1343],{"class":475,"line":603},[473,1327,1104],{"class":479},[473,1329,623],{"class":483},[473,1331,626],{"class":479},[473,1333,1334],{"class":483},"details.variant ",[473,1336,856],{"class":479},[473,1338,859],{"class":479},[473,1340,862],{"class":483},[473,1342,632],{"class":479},[473,1344,494],{"class":483},[473,1346,1347],{"class":475,"line":617},[473,1348,515],{"emptyLinePlaceholder":9},[473,1350,1351,1353,1355],{"class":475,"line":637},[473,1352,1124],{"class":483},[473,1354,648],{"class":524},[473,1356,879],{"class":483},[473,1358,1359],{"class":475,"line":642},[473,1360,1361],{"class":483},"      distinctId: userId,\n",[473,1363,1364,1367,1369],{"class":475,"line":658},[473,1365,1366],{"class":483},"      event: ",[473,1368,653],{"class":490},[473,1370,894],{"class":483},[473,1372,1373],{"class":475,"line":664},[473,1374,1375],{"class":483},"      properties: {\n",[473,1377,1378],{"class":475,"line":670},[473,1379,1380],{"class":483},"        $feature_flag: hookContext.flagKey,\n",[473,1382,1383],{"class":475,"line":676},[473,1384,1385],{"class":483},"        $feature_flag_response: details.variant,\n",[473,1387,1388],{"class":475,"line":682},[473,1389,1390],{"class":483},"      },\n",[473,1392,1393],{"class":475,"line":688},[473,1394,1147],{"class":483},[473,1396,1397],{"class":475,"line":694},[473,1398,685],{"class":483},[473,1400,1401],{"class":475,"line":699},[473,1402,1156],{"class":483},[473,1404,1405],{"class":475,"line":921},[473,1406,515],{"emptyLinePlaceholder":9},[473,1408,1409,1411,1413,1415,1417,1419],{"class":475,"line":926},[473,1410,757],{"class":479},[473,1412,558],{"class":557},[473,1414,561],{"class":479},[473,1416,1171],{"class":483},[473,1418,1174],{"class":524},[473,1420,950],{"class":483},[473,1422,1423],{"class":475,"line":931},[473,1424,515],{"emptyLinePlaceholder":9},[473,1426,1427,1429,1431,1433,1436,1438,1440],{"class":475,"line":936},[473,1428,757],{"class":479},[473,1430,1187],{"class":557},[473,1432,561],{"class":479},[473,1434,1435],{"class":479}," await",[473,1437,705],{"class":483},[473,1439,1194],{"class":524},[473,1441,1442],{"class":483},"(\n",[473,1444,1445,1448],{"class":475,"line":941},[473,1446,1447],{"class":490},"  \"checkout-cta-copy\"",[473,1449,894],{"class":483},[473,1451,1453,1456],{"class":475,"line":1452},26,[473,1454,1455],{"class":490},"  \"Start free trial\"",[473,1457,894],{"class":483},[473,1459,1461,1464,1466],{"class":475,"line":1460},27,[473,1462,1463],{"class":483},"  { targetingKey: ",[473,1465,714],{"class":490},[473,1467,1468],{"class":483}," },\n",[473,1470,1472],{"class":475,"line":1471},28,[473,1473,1474],{"class":483},"  { hooks: [reportExposure] },\n",[473,1476,1478],{"class":475,"line":1477},29,[473,1479,1480],{"class":483},");\n",[332,1482,1483,1484,1488,1489,958],{},"A variation without a name also has ConfigDirector's ID for the value as its variant, so name each one. The hook needs version 1.11.0 or later of the ",[336,1485,1487],{"href":1486},"\u002Fsdks\u002Fopenfeature\u002Fweb#evaluation-details-and-hooks","Web provider",", or 1.13.0 or later of the ",[336,1490,1492],{"href":1491},"\u002Fsdks\u002Fopenfeature\u002Fnode-js#evaluation-details-and-hooks","Node.js provider",[328,1494,1496],{"id":1495},"when-the-handler-runs","When the handler runs",[332,1498,1499],{},"The handler runs once per evaluation, whenever your application reads the config. So read an experiment where the user reaches the change rather than at startup, or users who never see it count as exposed.",[332,1501,1502,1503,1508,1509,1514,1515,1517],{},"A config read on every render sends an event each time. That does not skew the results, because PostHog ",[336,1504,1507],{"href":1505,"rel":1506,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Fexposures#exposure-deduplication",[354],"counts one exposure per user per variant",". PostHog's ",[336,1510,1513],{"href":1511,"rel":1512,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fbilling\u002Fcommon-questions",[354],"billing page"," lists ",[357,1516,359],{}," as not billed.",[328,1519,1521],{"id":1520},"compare-the-variations","Compare the variations",[332,1523,1524,1525,1530],{},"The outcomes you compare are the events your application already sends to PostHog, so there is nothing more to add to your code. PostHog ",[336,1526,1529],{"href":1527,"rel":1528,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Fexposures#metric-events-dont-need-a-variant-property",[354],"counts an event"," only if it happens after the user's first exposure, and it attributes the event to that user's variant.",[332,1532,1533,1538,1539,1544],{},[336,1534,1537],{"href":1535,"rel":1536,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Fcreating-an-experiment",[354],"Create an experiment in PostHog"," that matches yours, because PostHog ",[336,1540,1543],{"href":1541,"rel":1542,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Frunning-experiments-without-feature-flags#common-issues",[354],"compares these values exactly",", including capitalization:",[1546,1547,1548,1552],"ul",{},[1549,1550,1551],"li",{},"Set its feature flag key to your config key. PostHog's flag keys allow only letters, numbers, hyphens and underscores, so this does not work for a config key with a dot in it.",[1549,1553,1554,1555,1558],{},"Name its variants after your variations. PostHog treats a variant named ",[357,1556,1557],{},"control"," as the baseline, or else the first one.",[332,1560,1561],{},"PostHog creates a feature flag for the experiment, which your application never reads, since ConfigDirector still decides who gets which variation.",[332,1563,1564,1565,1570,1571,1575],{},"The handler also runs outside the split: before the run starts, after you ship and when a conditional rule serves a variation. So launch the PostHog experiment after you start the run and end it when the run ends. Otherwise a user served one variation before the run and another during it counts as ",[336,1566,1569],{"href":1567,"rel":1568,"target":355},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Fexperiments\u002Frunning-experiments-without-feature-flags#multiple-variant-handling",[354],"exposed to both",", and PostHog leaves them out of the analysis by default. A conditional rule above the split can still make PostHog's numbers higher than the ",[1572,1573,1574],"strong",{},"Exposures"," card, which counts only the contexts the split served.",[332,1577,1578],{},"Keep each variation's name for the length of the run, because PostHog compares against the variant names you set.",[332,1580,1581,1582,958],{},"To mark each run's start, split change, ship and stop on these charts without code, set up a ",[336,1583,1585],{"href":1584},"\u002Fintegrations\u002Fanalytics-integrations#posthog","PostHog integration",[1587,1588,1589],"style",{},"html pre.shiki code .sLDKn, html code.shiki .sLDKn{--shiki-light:#A0111F;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbRM4, html code.shiki .sbRM4{--shiki-light:#0E1116;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .suztq, html code.shiki .suztq{--shiki-light:#032563;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sEIia, html code.shiki .sEIia{--shiki-light:#622CBC;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxMNI, html code.shiki .sxMNI{--shiki-light:#023B95;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syyZu, html code.shiki .syyZu{--shiki-light:#702C00;--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .sA9AF, html code.shiki .sA9AF{--shiki-light:#702C00;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":469,"searchDepth":497,"depth":497,"links":1591},[1592,1593,1594,1595,1596,1597],{"id":330,"depth":497,"text":5},{"id":345,"depth":497,"text":346},{"id":437,"depth":497,"text":438},{"id":987,"depth":497,"text":988},{"id":1495,"depth":497,"text":1496},{"id":1520,"depth":497,"text":1521},"Report experiment exposures to PostHog from your application, so you can compare the variations next to the events you already track there.","md",null,{"modifiedAt":282},{"title":304,"icon":283},{"title":1604,"description":1605},"Analyze Experiments in PostHog","Send ConfigDirector experiment exposures to PostHog as $feature_flag_called events from the browser, Node.js or an OpenFeature hook, then compare the variations in a PostHog experiment.","t3oAPupfekv8BVV87eYM2wy8kqJl-3MnCoQYLwMpNQE",[1608,1610],{"title":300,"path":301,"stem":302,"description":1609,"icon":283,"children":-1},"Report experiment exposures to Segment from your application, so the destinations you have connected receive the variation each user saw.",{"title":314,"path":315,"stem":316,"description":1611,"icon":317,"children":-1},"Move your feature flags from LaunchDarkly to ConfigDirector. How projects, environments, flags, contexts, segments, and rollouts map, how to recreate the flags, and how to switch the SDKs over without a risky release.",1794120696891]