From 633e827ec4203d20d3a7819ee2dedcb929569813 Mon Sep 17 00:00:00 2001 From: QAComet Date: Fri, 31 May 2024 02:20:47 -0600 Subject: [PATCH] update --- 200.html | 22 ++-- 404.html | 22 ++-- _nuxt/{lFVxmSVb.js => 21sqjsY3.js} | 2 +- _nuxt/3fa5i0ew.js | 1 + _nuxt/{DgaJ7ELG.js => 6Heezgxy.js} | 2 +- _nuxt/9UJQMWko.js | 1 - _nuxt/{mB4jvhnn.js => B-TIRWGp.js} | 2 +- _nuxt/{BBg3Df_v.js => B54bitx_.js} | 2 +- _nuxt/{DmSip271.js => B8xSpQ_7.js} | 2 +- _nuxt/BASUvlMQ.js | 1 + _nuxt/BK5dMROA.js | 1 - _nuxt/BMo7zexA.js | 1 - _nuxt/{CToKNNT4.js => BNzAhPet.js} | 2 +- _nuxt/BOU-aCie.js | 1 + _nuxt/BQDZ21oy.js | 1 + _nuxt/BQoE-4GE.js | 1 + _nuxt/{C_1yPr0e.js => BTfD_XlD.js} | 2 +- _nuxt/{CFwVd7gV.js => BWKb2ttN.js} | 2 +- _nuxt/BXBBK3p1.js | 1 + _nuxt/{ti0Z0EYt.js => BaQW3ob4.js} | 2 +- _nuxt/BamxlSPu.js | 1 + _nuxt/{DxghXiKV.js => BasclreZ.js} | 2 +- _nuxt/Bh_R0szF.js | 1 + _nuxt/BlS8upJP.js | 29 ----- _nuxt/BnI7OW5X.js | 1 - _nuxt/BneHlRLI.js | 1 - _nuxt/BnwjeOpX.js | 1 - _nuxt/{BECgZIvk.js => BpUWW4O-.js} | 4 +- _nuxt/BqBwjWqG.js | 1 - _nuxt/BqUvtMHT.js | 1 + _nuxt/BsYmvPZw.js | 1 - _nuxt/BzoHbl1P.js | 1 - _nuxt/C-v3KzvZ.js | 1 + _nuxt/{Cst9DoAH.js => C3TgqYuk.js} | 2 +- _nuxt/{B0VAc3Z5.js => C4g8nH2O.js} | 2 +- _nuxt/C5ITgUyT.js | 1 + _nuxt/{C17h_atD.js => C5JBqY-4.js} | 2 +- _nuxt/CCgfT4mO.js | 1 - _nuxt/CFzORWKb.js | 1 - _nuxt/{BhCbx3Wd.js => CGDdIL0g.js} | 2 +- _nuxt/{Q0Y17sdK.js => CI0Itg7s.js} | 2 +- _nuxt/CRh1_mKz.js | 1 - _nuxt/CSXQV5-h.js | 1 - _nuxt/{BB7G3joz.js => CW_zoPMf.js} | 2 +- _nuxt/CZcQ1mDI.js | 1 - _nuxt/{BRsYUypn.js => CZxlAbJ7.js} | 2 +- _nuxt/{DQA0lbK1.js => CaXXO5HX.js} | 2 +- _nuxt/{Bse8ef0b.js => Cb50__Mb.js} | 2 +- _nuxt/{D2xr6gf6.js => Cfp4urEI.js} | 2 +- _nuxt/{maW11VfC.js => ChQXwC9l.js} | 2 +- _nuxt/Ci9wJC62.js | 1 + _nuxt/{4r0YjvSz.js => Ck8lORen.js} | 2 +- _nuxt/Ck9OydBO.js | 1 + _nuxt/{CGfQlKlL.js => Ckubu9hk.js} | 2 +- _nuxt/Cn1tIV_T.js | 1 - _nuxt/{dzMqTbw3.js => CukA5Xl1.js} | 2 +- _nuxt/{R-gFWJPL.js => Cw0Mq-1J.js} | 2 +- _nuxt/{B60RBlQ9.js => Cw7TSr0H.js} | 2 +- _nuxt/Cz78Sion.js | 1 - _nuxt/Czu_W2CL.js | 1 - _nuxt/{DF1VbFfH.js => DEZhdWR8.js} | 9 +- _nuxt/{BxiCSTFT.js => DMFARuCF.js} | 2 +- _nuxt/DNJ0aMK4.js | 1 + _nuxt/{_tWtRPYx.js => DN_H2i4g.js} | 2 +- _nuxt/DS-4onvx.js | 1 - _nuxt/DSPAbem3.js | 1 + _nuxt/DcjfjkQm.js | 1 + _nuxt/DdJ-Ewyp.js | 1 + _nuxt/Dhont5qJ.js | 1 - _nuxt/DiyP6pou.js | 24 ++++ _nuxt/Djecwb_v.js | 1 + _nuxt/{J2jEMbcE.js => DsFcf1tA.js} | 2 +- _nuxt/Du8iVdrZ.js | 1 + _nuxt/{DkuQMAl2.js => DvvkLF7V.js} | 2 +- _nuxt/DzaeZ-yb.js | 1 + _nuxt/{N8b39uzv.js => F9KTxAVD.js} | 2 +- _nuxt/FwdM-4d8.js | 1 + ...de.DPIjDHas.css => ProseCode.C53feiBF.css} | 2 +- _nuxt/Quote.DvdHt3k9.css | 1 + _nuxt/Testimonial.B-jLyaoL.css | 1 + _nuxt/Testimonial.BamnguDL.css | 1 - _nuxt/{DbrryaCF.js => WX_X95mj.js} | 2 +- _nuxt/{ByDkrM4K.js => Ya7nsG7s.js} | 2 +- _nuxt/{X2wNORNR.js => YcXSTn_u.js} | 9 +- _nuxt/ZkJgmw7I.js | 1 - _nuxt/_ufwR5o8.js | 1 + _nuxt/{DQv0CMQg.js => aHVSc_rA.js} | 2 +- _nuxt/builds/latest.json | 2 +- .../c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621.json | 1 + .../d8c635a6-4df4-43ae-ac4a-a06023848560.json | 1 - _nuxt/e4iyi0z6.js | 1 + _nuxt/{dGARKcZ6.js => eKBtyYuL.js} | 2 +- _nuxt/entry.DiT2Mvoi.css | 1 - _nuxt/entry.DrGH3nHD.css | 1 + ...04.CyhgO96i.css => error-404.JekaaCis.css} | 2 +- _nuxt/error-500.CNP9nqm1.css | 1 + _nuxt/error-500.Cph627d6.css | 1 - _nuxt/{CZNwzoXQ.js => h4BmERJ-.js} | 2 +- _nuxt/index.DrXF56mq.css | 1 + _nuxt/index.yI_g7lt1.css | 1 - _nuxt/{BsvTfDZ0.js => mKNKLkDI.js} | 2 +- _nuxt/medusa-logo.B_CCAbp4.svg | 1 + _nuxt/thinkk-logo.B37igL3_.png | Bin 0 -> 14172 bytes _payload.json | 2 +- api/_content/cache.1714258600178.json | 1 - api/_content/cache.1717143045798.json | 1 + ...178.json => 9C0VBep6PV.1717143045798.json} | 0 ...178.json => Cr3vX64g4U.1717143045798.json} | 0 .../query/FQBYG5nyVD.1717143045798.json | 1 + .../query/Qfdjvn2t5d.1714258600178.json | 1 - .../query/Qfdjvn2t5d.1717143045798.json | 1 + .../query/SdPqqtG5SL.1717143045798.json | 1 + ...178.json => VlbRDfyd5U.1717143045798.json} | 0 ...178.json => c1NuIkbLFt.1717143045798.json} | 0 ...178.json => jaZDQs2Nrb.1717143045798.json} | 0 ...178.json => muguO0VHIr.1717143045798.json} | 0 ...178.json => x1MOVa2EhJ.1717143045798.json} | 0 case-studies/_payload.json | 2 +- case-studies/automatisch/_payload.json | 2 +- case-studies/automatisch/index.html | 67 +++++------ case-studies/index.html | 34 +++--- .../how_does_qa_impact_investment_58634.pdf | Bin 0 -> 204621 bytes img/open-graph-banner-linkedin.jpg | Bin 0 -> 116437 bytes img/white-papers/frederic-headshot.png | Bin 0 -> 27448 bytes .../qa-and-vc-investment-open-graph.jpg | Bin 0 -> 112304 bytes img/white-papers/white-paper-open-graph.jpg | Bin 0 -> 108658 bytes img/white-papers/yianni-headshot.png | Bin 0 -> 17428 bytes index.html | 51 ++++---- playwright/_payload.json | 2 +- playwright/architecture/_payload.json | 2 +- playwright/architecture/index.html | 77 +++++++------ .../how-playwright-initializes/_payload.json | 2 +- .../how-playwright-initializes/index.html | 109 +++++++++--------- playwright/index.html | 33 +++--- privacy-policy/_payload.json | 2 +- privacy-policy/index.html | 68 +++++------ sitemap.xml | 2 +- terms-and-conditions/_payload.json | 2 +- terms-and-conditions/index.html | 60 +++++----- terms-of-service/_payload.json | 2 +- terms-of-service/index.html | 64 +++++----- white-papers/_payload.json | 1 + .../_payload.json | 1 + .../index.html | 59 ++++++++++ white-papers/index.html | 43 +++++++ 145 files changed, 526 insertions(+), 421 deletions(-) rename _nuxt/{lFVxmSVb.js => 21sqjsY3.js} (71%) create mode 100644 _nuxt/3fa5i0ew.js rename _nuxt/{DgaJ7ELG.js => 6Heezgxy.js} (65%) delete mode 100644 _nuxt/9UJQMWko.js rename _nuxt/{mB4jvhnn.js => B-TIRWGp.js} (64%) rename _nuxt/{BBg3Df_v.js => B54bitx_.js} (64%) rename _nuxt/{DmSip271.js => B8xSpQ_7.js} (64%) create mode 100644 _nuxt/BASUvlMQ.js delete mode 100644 _nuxt/BK5dMROA.js delete mode 100644 _nuxt/BMo7zexA.js rename _nuxt/{CToKNNT4.js => BNzAhPet.js} (63%) create mode 100644 _nuxt/BOU-aCie.js create mode 100644 _nuxt/BQDZ21oy.js create mode 100644 _nuxt/BQoE-4GE.js rename _nuxt/{C_1yPr0e.js => BTfD_XlD.js} (71%) rename _nuxt/{CFwVd7gV.js => BWKb2ttN.js} (97%) create mode 100644 _nuxt/BXBBK3p1.js rename _nuxt/{ti0Z0EYt.js => BaQW3ob4.js} (64%) create mode 100644 _nuxt/BamxlSPu.js rename _nuxt/{DxghXiKV.js => BasclreZ.js} (64%) create mode 100644 _nuxt/Bh_R0szF.js delete mode 100644 _nuxt/BlS8upJP.js delete mode 100644 _nuxt/BnI7OW5X.js delete mode 100644 _nuxt/BneHlRLI.js delete mode 100644 _nuxt/BnwjeOpX.js rename _nuxt/{BECgZIvk.js => BpUWW4O-.js} (54%) delete mode 100644 _nuxt/BqBwjWqG.js create mode 100644 _nuxt/BqUvtMHT.js delete mode 100644 _nuxt/BsYmvPZw.js delete mode 100644 _nuxt/BzoHbl1P.js create mode 100644 _nuxt/C-v3KzvZ.js rename _nuxt/{Cst9DoAH.js => C3TgqYuk.js} (65%) rename _nuxt/{B0VAc3Z5.js => C4g8nH2O.js} (95%) create mode 100644 _nuxt/C5ITgUyT.js rename _nuxt/{C17h_atD.js => C5JBqY-4.js} (96%) delete mode 100644 _nuxt/CCgfT4mO.js delete mode 100644 _nuxt/CFzORWKb.js rename _nuxt/{BhCbx3Wd.js => CGDdIL0g.js} (64%) rename _nuxt/{Q0Y17sdK.js => CI0Itg7s.js} (71%) delete mode 100644 _nuxt/CRh1_mKz.js delete mode 100644 _nuxt/CSXQV5-h.js rename _nuxt/{BB7G3joz.js => CW_zoPMf.js} (64%) delete mode 100644 _nuxt/CZcQ1mDI.js rename _nuxt/{BRsYUypn.js => CZxlAbJ7.js} (78%) rename _nuxt/{DQA0lbK1.js => CaXXO5HX.js} (71%) rename _nuxt/{Bse8ef0b.js => Cb50__Mb.js} (89%) rename _nuxt/{D2xr6gf6.js => Cfp4urEI.js} (71%) rename _nuxt/{maW11VfC.js => ChQXwC9l.js} (67%) create mode 100644 _nuxt/Ci9wJC62.js rename _nuxt/{4r0YjvSz.js => Ck8lORen.js} (72%) create mode 100644 _nuxt/Ck9OydBO.js rename _nuxt/{CGfQlKlL.js => Ckubu9hk.js} (64%) delete mode 100644 _nuxt/Cn1tIV_T.js rename _nuxt/{dzMqTbw3.js => CukA5Xl1.js} (79%) rename _nuxt/{R-gFWJPL.js => Cw0Mq-1J.js} (95%) rename _nuxt/{B60RBlQ9.js => Cw7TSr0H.js} (65%) delete mode 100644 _nuxt/Cz78Sion.js delete mode 100644 _nuxt/Czu_W2CL.js rename _nuxt/{DF1VbFfH.js => DEZhdWR8.js} (83%) rename _nuxt/{BxiCSTFT.js => DMFARuCF.js} (89%) create mode 100644 _nuxt/DNJ0aMK4.js rename _nuxt/{_tWtRPYx.js => DN_H2i4g.js} (53%) delete mode 100644 _nuxt/DS-4onvx.js create mode 100644 _nuxt/DSPAbem3.js create mode 100644 _nuxt/DcjfjkQm.js create mode 100644 _nuxt/DdJ-Ewyp.js delete mode 100644 _nuxt/Dhont5qJ.js create mode 100644 _nuxt/DiyP6pou.js create mode 100644 _nuxt/Djecwb_v.js rename _nuxt/{J2jEMbcE.js => DsFcf1tA.js} (82%) create mode 100644 _nuxt/Du8iVdrZ.js rename _nuxt/{DkuQMAl2.js => DvvkLF7V.js} (65%) create mode 100644 _nuxt/DzaeZ-yb.js rename _nuxt/{N8b39uzv.js => F9KTxAVD.js} (77%) create mode 100644 _nuxt/FwdM-4d8.js rename _nuxt/{ProseCode.DPIjDHas.css => ProseCode.C53feiBF.css} (90%) create mode 100644 _nuxt/Quote.DvdHt3k9.css create mode 100644 _nuxt/Testimonial.B-jLyaoL.css delete mode 100644 _nuxt/Testimonial.BamnguDL.css rename _nuxt/{DbrryaCF.js => WX_X95mj.js} (65%) rename _nuxt/{ByDkrM4K.js => Ya7nsG7s.js} (70%) rename _nuxt/{X2wNORNR.js => YcXSTn_u.js} (71%) delete mode 100644 _nuxt/ZkJgmw7I.js create mode 100644 _nuxt/_ufwR5o8.js rename _nuxt/{DQv0CMQg.js => aHVSc_rA.js} (88%) create mode 100644 _nuxt/builds/meta/c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621.json delete mode 100644 _nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json create mode 100644 _nuxt/e4iyi0z6.js rename _nuxt/{dGARKcZ6.js => eKBtyYuL.js} (58%) delete mode 100644 _nuxt/entry.DiT2Mvoi.css create mode 100644 _nuxt/entry.DrGH3nHD.css rename _nuxt/{error-404.CyhgO96i.css => error-404.JekaaCis.css} (54%) create mode 100644 _nuxt/error-500.CNP9nqm1.css delete mode 100644 _nuxt/error-500.Cph627d6.css rename _nuxt/{CZNwzoXQ.js => h4BmERJ-.js} (65%) create mode 100644 _nuxt/index.DrXF56mq.css delete mode 100644 _nuxt/index.yI_g7lt1.css rename _nuxt/{BsvTfDZ0.js => mKNKLkDI.js} (58%) create mode 100644 _nuxt/medusa-logo.B_CCAbp4.svg create mode 100644 _nuxt/thinkk-logo.B37igL3_.png delete mode 100644 api/_content/cache.1714258600178.json create mode 100644 api/_content/cache.1717143045798.json rename api/_content/query/{9C0VBep6PV.1714258600178.json => 9C0VBep6PV.1717143045798.json} (100%) rename api/_content/query/{Cr3vX64g4U.1714258600178.json => Cr3vX64g4U.1717143045798.json} (100%) create mode 100644 api/_content/query/FQBYG5nyVD.1717143045798.json delete mode 100644 api/_content/query/Qfdjvn2t5d.1714258600178.json create mode 100644 api/_content/query/Qfdjvn2t5d.1717143045798.json create mode 100644 api/_content/query/SdPqqtG5SL.1717143045798.json rename api/_content/query/{VlbRDfyd5U.1714258600178.json => VlbRDfyd5U.1717143045798.json} (100%) rename api/_content/query/{c1NuIkbLFt.1714258600178.json => c1NuIkbLFt.1717143045798.json} (100%) rename api/_content/query/{jaZDQs2Nrb.1714258600178.json => jaZDQs2Nrb.1717143045798.json} (100%) rename api/_content/query/{muguO0VHIr.1714258600178.json => muguO0VHIr.1717143045798.json} (100%) rename api/_content/query/{x1MOVa2EhJ.1714258600178.json => x1MOVa2EhJ.1717143045798.json} (100%) create mode 100644 download/pdfs/how_does_qa_impact_investment_58634.pdf create mode 100644 img/open-graph-banner-linkedin.jpg create mode 100644 img/white-papers/frederic-headshot.png create mode 100644 img/white-papers/qa-and-vc-investment-open-graph.jpg create mode 100644 img/white-papers/white-paper-open-graph.jpg create mode 100644 img/white-papers/yianni-headshot.png create mode 100644 white-papers/_payload.json create mode 100644 white-papers/how-qa-factors-into-vc-due-diligence/_payload.json create mode 100644 white-papers/how-qa-factors-into-vc-due-diligence/index.html create mode 100644 white-papers/index.html diff --git a/200.html b/200.html index e2e81fe..79bfb19 100644 --- a/200.html +++ b/200.html @@ -1,14 +1,14 @@ - + - - - - - - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/404.html b/404.html index e2e81fe..79bfb19 100644 --- a/404.html +++ b/404.html @@ -1,14 +1,14 @@ - + - - - - - - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/_nuxt/lFVxmSVb.js b/_nuxt/21sqjsY3.js similarity index 71% rename from _nuxt/lFVxmSVb.js rename to _nuxt/21sqjsY3.js index e498922..3cf013d 100644 --- a/_nuxt/lFVxmSVb.js +++ b/_nuxt/21sqjsY3.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH2",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./DiyP6pou.js";const l=["id"],p=["href"],k=d({__name:"ProseH2",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/3fa5i0ew.js b/_nuxt/3fa5i0ew.js new file mode 100644 index 0000000..03318e0 --- /dev/null +++ b/_nuxt/3fa5i0ew.js @@ -0,0 +1 @@ +import{_ as o}from"./aHVSc_rA.js";import"./DiyP6pou.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";export{o as default}; diff --git a/_nuxt/DgaJ7ELG.js b/_nuxt/6Heezgxy.js similarity index 65% rename from _nuxt/DgaJ7ELG.js rename to _nuxt/6Heezgxy.js index 3eee571..ee06127 100644 --- a/_nuxt/DgaJ7ELG.js +++ b/_nuxt/6Heezgxy.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as n}from"./BlS8upJP.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as n}from"./DiyP6pou.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; diff --git a/_nuxt/9UJQMWko.js b/_nuxt/9UJQMWko.js deleted file mode 100644 index 77d8527..0000000 --- a/_nuxt/9UJQMWko.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o}from"./DQv0CMQg.js";import"./BlS8upJP.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";export{o as default}; diff --git a/_nuxt/mB4jvhnn.js b/_nuxt/B-TIRWGp.js similarity index 64% rename from _nuxt/mB4jvhnn.js rename to _nuxt/B-TIRWGp.js index d5027b0..373fa89 100644 --- a/_nuxt/mB4jvhnn.js +++ b/_nuxt/B-TIRWGp.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./DiyP6pou.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BBg3Df_v.js b/_nuxt/B54bitx_.js similarity index 64% rename from _nuxt/BBg3Df_v.js rename to _nuxt/B54bitx_.js index 0fcb41e..d8ab425 100644 --- a/_nuxt/BBg3Df_v.js +++ b/_nuxt/B54bitx_.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./DiyP6pou.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/DmSip271.js b/_nuxt/B8xSpQ_7.js similarity index 64% rename from _nuxt/DmSip271.js rename to _nuxt/B8xSpQ_7.js index 218fdb8..274fc52 100644 --- a/_nuxt/DmSip271.js +++ b/_nuxt/B8xSpQ_7.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function l(e,n){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./DiyP6pou.js";const c={};function l(e,n){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; diff --git a/_nuxt/BASUvlMQ.js b/_nuxt/BASUvlMQ.js new file mode 100644 index 0000000..a7a9d26 --- /dev/null +++ b/_nuxt/BASUvlMQ.js @@ -0,0 +1 @@ +import{_ as h}from"./Djecwb_v.js";import{u as p}from"./BqUvtMHT.js";import{q as u}from"./DEZhdWR8.js";import{f as m,h as f,c as o,a as e,F as w,r as v,i as y,o as n,t as s,b as d,w as _,d as r}from"./DiyP6pou.js";import"./BpUWW4O-.js";const x={class:"blog-outer"},g={class:"blog-wrapper"},k=e("div",{class:"blog-header"},[e("h1",null,"Case Studies"),e("h2",{class:"subheader"},"A showcase of some recent work we've done")],-1),b={class:"content-wrapper"},C={class:"blog-post-wrapper"},D={class:"date-wrapper"},N={class:"month"},A={class:"day"},B={class:"year"},V={class:"description-wrapper"},z=m({__name:"index",async setup(q){let a,c;const{data:l}=([a,c]=f(()=>p("case-studies",()=>u("/case-studies").only(["title","link","created","shortDescription"]).find())),a=await a,c(),a);return(F,L)=>{const i=h;return n(),o("div",x,[e("div",g,[k,e("div",b,[(n(!0),o(w,null,v(y(l),t=>(n(),o("div",C,[e("div",D,[e("div",N,s(t.created.month),1),e("div",A,s(t.created.day),1),e("div",B,s(t.created.year),1)]),e("div",V,[e("h3",null,[d(i,{to:t.link},{default:_(()=>[r(s(t.title),1)]),_:2},1032,["to"])]),e("p",null,[r(s(t.shortDescription)+" ",1),d(i,{class:"read",to:t.link},{default:_(()=>[r("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{z as default}; diff --git a/_nuxt/BK5dMROA.js b/_nuxt/BK5dMROA.js deleted file mode 100644 index 2d87c00..0000000 --- a/_nuxt/BK5dMROA.js +++ /dev/null @@ -1 +0,0 @@ -import i from"./Cz78Sion.js";import{f as a,c,a as e,b as s,u as m,o as p}from"./BlS8upJP.js";import{u as g}from"./maW11VfC.js";import{_ as l}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const _={class:"page-wrapper"},d={class:"legal-outer"},y=e("h1",{class:"page-header"},"Privacy Policy",-1),I=a({__name:"privacy-policy",setup(u){const o=m(),t=new URL(o.public.baseUrl);t.pathname=l;const n=t.toString();return g({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Privacy Policy for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/privacy"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,f)=>{const r=i;return p(),c("div",_,[e("div",d,[y,s(r,{path:"/privacy-policy"})])])}}});export{I as default}; diff --git a/_nuxt/BMo7zexA.js b/_nuxt/BMo7zexA.js deleted file mode 100644 index 5cd2745..0000000 --- a/_nuxt/BMo7zexA.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as u}from"./CFzORWKb.js";import{u as p}from"./CRh1_mKz.js";import{q as _}from"./DF1VbFfH.js";import{u as h}from"./maW11VfC.js";import{f as g,h as w,c as n,a as e,F as y,r as f,i as C,o as a,t as o,b as d,w as l,d as r}from"./BlS8upJP.js";import"./BECgZIvk.js";const k={class:"blog-outer"},v={class:"blog-wrapper"},A=e("div",{class:"blog-header"},[e("h1",null,"Case Studies"),e("h2",{class:"subheader"},"A showcase of some recent work we've done")],-1),b={class:"content-wrapper"},x={class:"blog-post-wrapper"},Q={class:"date-wrapper"},q={class:"month"},D={class:"day"},N={class:"year"},S={class:"description-wrapper"},R=g({__name:"index",async setup(B){let s,i;const{data:m}=([s,i]=w(()=>p("case-studies",()=>_("/case-studies").only(["title","link","created","shortDescription"]).find())),s=await s,i(),s);return h({title:"QAComet | Case Studies",meta:[{name:"description",content:"Interested in how QAComet could work for you? Check out our case studies guiding you through some of the work we do with our clients."},{property:"og:image",content:"https://qacomet.com/img/case-studies/case_studies_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Case Studies"},{property:"og:url",content:"https://qacomet.com/case-studies"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Curious what working with QAComet would be like? Check out our case studies showing some recent work we've done."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(V,F)=>{const c=u;return a(),n("div",k,[e("div",v,[A,e("div",b,[(a(!0),n(y,null,f(C(m),t=>(a(),n("div",x,[e("div",Q,[e("div",q,o(t.created.month),1),e("div",D,o(t.created.day),1),e("div",N,o(t.created.year),1)]),e("div",S,[e("h3",null,[d(c,{to:t.link},{default:l(()=>[r(o(t.title),1)]),_:2},1032,["to"])]),e("p",null,[r(o(t.shortDescription)+" ",1),d(c,{class:"read",to:t.link},{default:l(()=>[r("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{R as default}; diff --git a/_nuxt/CToKNNT4.js b/_nuxt/BNzAhPet.js similarity index 63% rename from _nuxt/CToKNNT4.js rename to _nuxt/BNzAhPet.js index 71ea8b2..d36b237 100644 --- a/_nuxt/CToKNNT4.js +++ b/_nuxt/BNzAhPet.js @@ -1 +1 @@ -import{_ as r,o,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; +import{_ as r,o,c as t,l as s}from"./DiyP6pou.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BOU-aCie.js b/_nuxt/BOU-aCie.js new file mode 100644 index 0000000..917e87a --- /dev/null +++ b/_nuxt/BOU-aCie.js @@ -0,0 +1 @@ +import{_ as m}from"./Bh_R0szF.js";import"./DiyP6pou.js";export{m as default}; diff --git a/_nuxt/BQDZ21oy.js b/_nuxt/BQDZ21oy.js new file mode 100644 index 0000000..5dd238e --- /dev/null +++ b/_nuxt/BQDZ21oy.js @@ -0,0 +1 @@ +import{_ as i}from"./BamxlSPu.js";import{_ as s}from"./Du8iVdrZ.js";import{f as n,g as r,w as m,u as p,o as c,a as u,b as l}from"./DiyP6pou.js";import"./Djecwb_v.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const h=""+new URL("open-graph-banner-automatisch.CS0Jtz2i.jpg",import.meta.url).href,_={class:"testimonial-outer"},L=n({__name:"automatisch",setup(g){const o=p(),t=new URL(o.public.baseUrl);return t.pathname=h,t.toString(),(d,f)=>{const a=i,e=s;return c(),r(e,{link:"https://automatisch.io",path:"/case-studies/automatisch"},{default:m(()=>[u("div",_,[l(a,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",testimonial:"I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product."})])]),_:1})}}});export{L as default}; diff --git a/_nuxt/BQoE-4GE.js b/_nuxt/BQoE-4GE.js new file mode 100644 index 0000000..6aa0e99 --- /dev/null +++ b/_nuxt/BQoE-4GE.js @@ -0,0 +1 @@ +import{f as w,j as i,k as c,o as t,c as l,l as f,m as _,n as Z,a as e,q as T,s as U,v as E,x as X,y as M,z as G,_ as H,b as v,d as $,A as Q,B as J,t as k,C as Y,w as A,F as I,u as O}from"./DiyP6pou.js";import{u as K}from"./ChQXwC9l.js";import{u as e1}from"./BqUvtMHT.js";import{F as a1,G as t1,_ as l1}from"./BamxlSPu.js";import{_ as o1}from"./e4iyi0z6.js";import"./Djecwb_v.js";const s1=["width","height","fill","transform"],n1={key:0},r1=e("path",{d:"M227.85,46.89a20,20,0,0,0-18.74-18.74c-13.13-.77-46.65.42-74.48,28.24L131,60H74.36a19.83,19.83,0,0,0-14.14,5.86L25.87,100.19a20,20,0,0,0,11.35,33.95l37.14,5.18,42.32,42.32,5.19,37.18A19.88,19.88,0,0,0,135.34,235a20.13,20.13,0,0,0,6.37,1,19.9,19.9,0,0,0,14.1-5.87l34.34-34.35A19.85,19.85,0,0,0,196,181.64V125l3.6-3.59C227.43,93.54,228.62,60,227.85,46.89ZM76,84h31L75.75,115.28l-27.23-3.8ZM151.6,73.37A72.27,72.27,0,0,1,204,52a72.17,72.17,0,0,1-21.38,52.41L128,159,97,128ZM172,180l-27.49,27.49-3.8-27.23L172,149Zm-72,22c-8.71,11.85-26.19,26-60,26a12,12,0,0,1-12-12c0-33.84,14.12-51.32,26-60A12,12,0,1,1,68.18,175.3C62.3,179.63,55.51,187.8,53,203c15.21-2.51,23.37-9.3,27.7-15.18A12,12,0,1,1,100,202Z"},null,-1),i1=[r1],c1={key:1},h1=e("path",{d:"M184,120v61.65a8,8,0,0,1-2.34,5.65l-34.35,34.35a8,8,0,0,1-13.57-4.53L128,176ZM136,72H74.35a8,8,0,0,0-5.65,2.34L34.35,108.69a8,8,0,0,0,4.53,13.57L80,128ZM40,216c37.65,0,50.69-19.69,54.56-28.18L68.18,161.44C59.69,165.31,40,178.35,40,216Z",opacity:"0.2"},null,-1),d1=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),u1=[h1,d1],p1={key:2},g1=e("path",{d:"M101.85,191.14C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Zm122-144a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.4,27.07h0L88,108.7A8,8,0,0,1,76.67,97.39l26.56-26.57A4,4,0,0,0,100.41,64H74.35A15.9,15.9,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A16,16,0,0,0,192,181.65V155.59a4,4,0,0,0-6.83-2.82l-26.57,26.56a8,8,0,0,1-11.71-.42,8.2,8.2,0,0,1,.6-11.1l49.27-49.27h0C223.45,91.86,224.6,59.71,223.85,47.12Z"},null,-1),m1=[g1],v1={key:3},$1=e("path",{d:"M221.86,47.24a14,14,0,0,0-13.11-13.1c-12.31-.73-43.77.39-69.88,26.5L133.52,66H74.35a13.9,13.9,0,0,0-9.89,4.1L30.11,104.44a14,14,0,0,0,7.94,23.76l39.13,5.46,45.16,45.16L127.8,218a14,14,0,0,0,23.76,7.92l34.35-34.35a13.91,13.91,0,0,0,4.1-9.89V122.48l5.35-5.35h0C221.46,91,222.59,59.56,221.86,47.24ZM38.11,115a2,2,0,0,1,.49-2L72.94,78.58A2,2,0,0,1,74.35,78h47.17L77.87,121.64l-38.14-5.32A1.93,1.93,0,0,1,38.11,115ZM178,181.65a2,2,0,0,1-.59,1.41L143.08,217.4a2,2,0,0,1-3.4-1.11l-5.32-38.16L178,134.48Zm8.87-73h0L128,167.51,88.49,128l58.87-58.88a78.47,78.47,0,0,1,60.69-23A2,2,0,0,1,209.88,48,78.47,78.47,0,0,1,186.88,108.64ZM100,190.31C95.68,199.84,81.13,222,40,222a6,6,0,0,1-6-6c0-41.13,22.16-55.68,31.69-60a6,6,0,1,1,5,10.92c-7,3.17-22.53,13.52-24.47,42.91,29.39-1.94,39.74-17.52,42.91-24.47a6,6,0,1,1,10.92,5Z"},null,-1),A1=[$1],y1={key:4},f1=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),w1=[f1],_1={key:5},Z1=e("path",{d:"M219.86,47.36a12,12,0,0,0-11.22-11.22c-12-.71-42.82.38-68.35,25.91L134.35,68h-60a11.9,11.9,0,0,0-8.48,3.52L31.52,105.85a12,12,0,0,0,6.81,20.37l39.79,5.55,46.11,46.11,5.55,39.81a12,12,0,0,0,20.37,6.79l34.34-34.35a11.9,11.9,0,0,0,3.52-8.48v-60l5.94-5.94C219.48,90.18,220.57,59.41,219.86,47.36ZM36.21,115.6a3.94,3.94,0,0,1,1-4.09L71.53,77.17A4,4,0,0,1,74.35,76h52L78.58,123.76,39.44,118.3A3.94,3.94,0,0,1,36.21,115.6ZM180,181.65a4,4,0,0,1-1.17,2.83l-34.35,34.34a4,4,0,0,1-6.79-2.25l-5.46-39.15L180,129.65Zm-52-11.31L85.66,128l60.28-60.29c23.24-23.24,51.25-24.23,62.22-23.58a3.93,3.93,0,0,1,3.71,3.71c.65,11-.35,39-23.58,62.22ZM98.21,189.48C94,198.66,80,220,40,220a4,4,0,0,1-4-4c0-40,21.34-54,30.52-58.21a4,4,0,0,1,3.32,7.28c-7.46,3.41-24.43,14.66-25.76,46.85,32.19-1.33,43.44-18.3,46.85-25.76a4,4,0,1,1,7.28,3.32Z"},null,-1),H1=[Z1],L1={name:"PhRocketLaunch"},x=w({...L1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",n1,i1)):a.value==="duotone"?(t(),l("g",c1,u1)):a.value==="fill"?(t(),l("g",p1,m1)):a.value==="light"?(t(),l("g",v1,A1)):a.value==="regular"?(t(),l("g",y1,w1)):a.value==="thin"?(t(),l("g",_1,H1)):_("",!0)],16,s1))}}),b="__nuxt_component";async function V1(n,o){const s=M(),d=T(),u=G(),{fetchKey:p,_fetchKeyBase:a}=u.proxy.$options,r=(typeof p=="function"?p(()=>""):p)||[a,d.fullPath,d.matched.findIndex(h=>Object.values(h.components||{}).includes(u.type))].join(":"),{data:g,error:m}=await e1(`options:asyncdata:${r}`,()=>s.runWithContext(()=>o(s)));if(m.value)throw U(m.value);g.value&&typeof g.value=="object"&&Object.assign(await n,E(X(g.value)))}const L=function(...o){const[s,d]=o,{setup:u}=s;return!u&&!s.asyncData&&!s.head?{[b]:!0,...s}:{[b]:!0,_fetchKeyBase:d,...s,setup(p,a){const r=M(),g=u?Promise.resolve(r.runWithContext(()=>u(p,a))).then(h=>h||{}):{},m=[];if(s.asyncData&&m.push(V1(g,s.asyncData)),s.head){const h=M();K(typeof s.head=="function"?()=>s.head(h):s.head)}return Promise.resolve(g).then(()=>Promise.all(m)).then(()=>g).finally(()=>{m.length=0})}}},M1=["width","height","fill","transform"],k1={key:0},b1=e("path",{d:"M216,36H68.53a20.09,20.09,0,0,0-17.15,9.71L5.71,121.83a12,12,0,0,0,0,12.34l45.67,76.12A20.09,20.09,0,0,0,68.53,220H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36Zm-4,160H70.8L30,128,70.8,60H212ZM103.51,143.51,119,128l-15.52-15.51a12,12,0,0,1,17-17L136,111l15.51-15.52a12,12,0,0,1,17,17L153,128l15.52,15.51a12,12,0,0,1-17,17L136,145l-15.51,15.52a12,12,0,0,1-17-17Z"},null,-1),x1=[b1],C1={key:1},S1=e("path",{d:"M224,56V200a8,8,0,0,1-8,8H68.53a8,8,0,0,1-6.86-3.88L16,128,61.67,51.88A8,8,0,0,1,68.53,48H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),B1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),z1=[S1,B1],P1={key:2},D1=e("path",{d:"M216,40H68.53a16.12,16.12,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11h0A16.11,16.11,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM165.66,146.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.35,18.35a8,8,0,0,1-11.31-11.32L124.69,128l-18.35-18.34a8,8,0,1,1,11.31-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128Z"},null,-1),R1=[D1],N1={key:3},W1=e("path",{d:"M216,42H68.53a14,14,0,0,0-12,6.8L10.86,124.91a6,6,0,0,0,0,6.18L56.53,207.2a14,14,0,0,0,12,6.8H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42Zm2,158a2,2,0,0,1-2,2H68.53a2,2,0,0,1-1.71-1h0L23,128,66.82,55a2,2,0,0,1,1.71-1H216a2,2,0,0,1,2,2Zm-53.76-91.76L144.48,128l19.76,19.76a6,6,0,1,1-8.48,8.48L136,136.48l-19.76,19.76a6,6,0,0,1-8.48-8.48L127.52,128l-19.76-19.76a6,6,0,0,1,8.48-8.48L136,119.52l19.76-19.76a6,6,0,0,1,8.48,8.48Z"},null,-1),F1=[W1],q1={key:4},j1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),T1=[j1],U1={key:5},E1=e("path",{d:"M216,44H68.53a12.06,12.06,0,0,0-10.29,5.83L12.57,125.94a4,4,0,0,0,0,4.12l45.67,76.11A12.06,12.06,0,0,0,68.53,212H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44Zm4,156a4,4,0,0,1-4,4H68.53a4,4,0,0,1-3.43-1.94L20.67,128,65.1,53.94A4,4,0,0,1,68.53,52H216a4,4,0,0,1,4,4Zm-57.17-93.17L141.66,128l21.17,21.17a4,4,0,0,1-5.66,5.66L136,133.66l-21.17,21.17a4,4,0,0,1-5.66-5.66L130.34,128l-21.17-21.17a4,4,0,0,1,5.66-5.66L136,122.34l21.17-21.17a4,4,0,1,1,5.66,5.66Z"},null,-1),X1=[E1],G1={name:"PhBackspace"},C=w({...G1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",k1,x1)):a.value==="duotone"?(t(),l("g",C1,z1)):a.value==="fill"?(t(),l("g",P1,R1)):a.value==="light"?(t(),l("g",N1,F1)):a.value==="regular"?(t(),l("g",q1,T1)):a.value==="thin"?(t(),l("g",U1,X1)):_("",!0)],16,M1))}}),Q1=["width","height","fill","transform"],J1={key:0},Y1=e("path",{d:"M220,32H76A20,20,0,0,0,56,52V72H36A20,20,0,0,0,16,92V204a20,20,0,0,0,20,20H180a20,20,0,0,0,20-20V184h20a20,20,0,0,0,20-20V52A20,20,0,0,0,220,32ZM176,96v16H40V96Zm0,104H40V136H176Zm40-40H200V92a20,20,0,0,0-20-20H80V56H216Z"},null,-1),I1=[Y1],O1={key:1},K1=e("path",{d:"M224,56V168a8,8,0,0,1-8,8H192V88a8,8,0,0,0-8-8H64V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),e0=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,88H184v16H40ZM184,200H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),a0=[K1,e0],t0={key:2},l0=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm32,80H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),o0=[l0],s0={key:3},n0=e("path",{d:"M216,42H72A14,14,0,0,0,58,56V74H40A14,14,0,0,0,26,88V200a14,14,0,0,0,14,14H184a14,14,0,0,0,14-14V182h18a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,86H184a2,2,0,0,1,2,2v18H38V88A2,2,0,0,1,40,86ZM186,200a2,2,0,0,1-2,2H40a2,2,0,0,1-2-2V118H186Zm32-32a2,2,0,0,1-2,2H198V88a14,14,0,0,0-14-14H70V56a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Z"},null,-1),r0=[n0],i0={key:4},c0=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm0,112H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),h0=[c0],d0={key:5},u0=e("path",{d:"M216,44H72A12,12,0,0,0,60,56V76H40A12,12,0,0,0,28,88V200a12,12,0,0,0,12,12H184a12,12,0,0,0,12-12V180h20a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,84H184a4,4,0,0,1,4,4v20H36V88A4,4,0,0,1,40,84ZM188,200a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V116H188Zm32-32a4,4,0,0,1-4,4H196V88a12,12,0,0,0-12-12H68V56a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Z"},null,-1),p0=[u0],g0={name:"PhBrowsers"},S=w({...g0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",J1,I1)):a.value==="duotone"?(t(),l("g",O1,a0)):a.value==="fill"?(t(),l("g",t0,o0)):a.value==="light"?(t(),l("g",s0,r0)):a.value==="regular"?(t(),l("g",i0,h0)):a.value==="thin"?(t(),l("g",d0,p0)):_("",!0)],16,Q1))}}),m0=["width","height","fill","transform"],v0={key:0},$0=e("path",{d:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},null,-1),A0=[$0],y0={key:1},f0=e("path",{d:"M160,48V208L80,128Z",opacity:"0.2"},null,-1),w0=e("path",{d:"M163.06,40.61a8,8,0,0,0-8.72,1.73l-80,80a8,8,0,0,0,0,11.32l80,80A8,8,0,0,0,168,208V48A8,8,0,0,0,163.06,40.61ZM152,188.69,91.31,128,152,67.31Z"},null,-1),_0=[f0,w0],Z0={key:2},H0=e("path",{d:"M168,48V208a8,8,0,0,1-13.66,5.66l-80-80a8,8,0,0,1,0-11.32l80-80A8,8,0,0,1,168,48Z"},null,-1),L0=[H0],V0={key:3},M0=e("path",{d:"M164.24,203.76a6,6,0,1,1-8.48,8.48l-80-80a6,6,0,0,1,0-8.48l80-80a6,6,0,0,1,8.48,8.48L88.49,128Z"},null,-1),k0=[M0],b0={key:4},x0=e("path",{d:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"},null,-1),C0=[x0],S0={key:5},B0=e("path",{d:"M162.83,205.17a4,4,0,0,1-5.66,5.66l-80-80a4,4,0,0,1,0-5.66l80-80a4,4,0,1,1,5.66,5.66L85.66,128Z"},null,-1),z0=[B0],P0={name:"PhCaretLeft"},D0=w({...P0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",v0,A0)):a.value==="duotone"?(t(),l("g",y0,_0)):a.value==="fill"?(t(),l("g",Z0,L0)):a.value==="light"?(t(),l("g",V0,k0)):a.value==="regular"?(t(),l("g",b0,C0)):a.value==="thin"?(t(),l("g",S0,z0)):_("",!0)],16,m0))}}),R0=["width","height","fill","transform"],N0={key:0},W0=e("path",{d:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},null,-1),F0=[W0],q0={key:1},j0=e("path",{d:"M176,128,96,208V48Z",opacity:"0.2"},null,-1),T0=e("path",{d:"M181.66,122.34l-80-80A8,8,0,0,0,88,48V208a8,8,0,0,0,13.66,5.66l80-80A8,8,0,0,0,181.66,122.34ZM104,188.69V67.31L164.69,128Z"},null,-1),U0=[j0,T0],E0={key:2},X0=e("path",{d:"M181.66,133.66l-80,80A8,8,0,0,1,88,208V48a8,8,0,0,1,13.66-5.66l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),G0=[X0],Q0={key:3},J0=e("path",{d:"M180.24,132.24l-80,80a6,6,0,0,1-8.48-8.48L167.51,128,91.76,52.24a6,6,0,0,1,8.48-8.48l80,80A6,6,0,0,1,180.24,132.24Z"},null,-1),Y0=[J0],I0={key:4},O0=e("path",{d:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),K0=[O0],e2={key:5},a2=e("path",{d:"M178.83,130.83l-80,80a4,4,0,0,1-5.66-5.66L170.34,128,93.17,50.83a4,4,0,0,1,5.66-5.66l80,80A4,4,0,0,1,178.83,130.83Z"},null,-1),t2=[a2],l2={name:"PhCaretRight"},o2=w({...l2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",N0,F0)):a.value==="duotone"?(t(),l("g",q0,U0)):a.value==="fill"?(t(),l("g",E0,G0)):a.value==="light"?(t(),l("g",Q0,Y0)):a.value==="regular"?(t(),l("g",I0,K0)):a.value==="thin"?(t(),l("g",e2,t2)):_("",!0)],16,R0))}}),s2=["width","height","fill","transform"],n2={key:0},r2=e("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},null,-1),i2=[r2],c2={key:1},h2=e("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"},null,-1),d2=e("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),u2=[h2,d2],p2={key:2},g2=e("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),m2=[g2],v2={key:3},$2=e("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"},null,-1),A2=[$2],y2={key:4},f2=e("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"},null,-1),w2=[f2],_2={key:5},Z2=e("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"},null,-1),H2=[Z2],L2={name:"PhCheck"},B=w({...L2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",n2,i2)):a.value==="duotone"?(t(),l("g",c2,u2)):a.value==="fill"?(t(),l("g",p2,m2)):a.value==="light"?(t(),l("g",v2,A2)):a.value==="regular"?(t(),l("g",y2,w2)):a.value==="thin"?(t(),l("g",_2,H2)):_("",!0)],16,s2))}}),V2=["width","height","fill","transform"],M2={key:0},k2=e("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm40.49-92.49a12,12,0,0,1,0,17l-48,48a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L144,143l39.51-39.52A12,12,0,0,1,200.49,103.51Z"},null,-1),b2=[k2],x2={key:1},C2=e("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"},null,-1),S2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),B2=[C2,S2],z2={key:2},P2=e("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-50.27-6.86-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35a8,8,0,0,1,11.32,11.32Z"},null,-1),D2=[P2],R2={key:3},N2=e("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm36.24-94.24a6,6,0,0,1,0,8.48l-48,48a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L144,151.51l43.76-43.75A6,6,0,0,1,196.24,107.76Z"},null,-1),W2=[N2],F2={key:4},q2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),j2=[q2],T2={key:5},U2=e("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm34.83-94.83a4,4,0,0,1,0,5.66l-48,48a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L144,154.34l45.17-45.17A4,4,0,0,1,194.83,109.17Z"},null,-1),E2=[U2],X2={name:"PhCloudCheck"},z=w({...X2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",M2,b2)):a.value==="duotone"?(t(),l("g",x2,B2)):a.value==="fill"?(t(),l("g",z2,D2)):a.value==="light"?(t(),l("g",R2,W2)):a.value==="regular"?(t(),l("g",F2,j2)):a.value==="thin"?(t(),l("g",T2,E2)):_("",!0)],16,V2))}}),G2=["width","height","fill","transform"],Q2={key:0},J2=e("path",{d:"M224,44H32A20,20,0,0,0,12,64V192a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V64A20,20,0,0,0,224,44Zm-4,24V88H36V68ZM36,188V112H220v76Zm172-24a12,12,0,0,1-12,12H164a12,12,0,0,1,0-24h32A12,12,0,0,1,208,164Zm-68,0a12,12,0,0,1-12,12H116a12,12,0,0,1,0-24h12A12,12,0,0,1,140,164Z"},null,-1),Y2=[J2],I2={key:1},O2=e("path",{d:"M232,96v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V96Z",opacity:"0.2"},null,-1),K2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),e6=[O2,K2],a6={key:2},t6=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM136,176H120a8,8,0,0,1,0-16h16a8,8,0,0,1,0,16Zm64,0H168a8,8,0,0,1,0-16h32a8,8,0,0,1,0,16ZM32,88V64H224V88Z"},null,-1),l6=[t6],o6={key:3},s6=e("path",{d:"M224,50H32A14,14,0,0,0,18,64V192a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM32,62H224a2,2,0,0,1,2,2V90H30V64A2,2,0,0,1,32,62ZM224,194H32a2,2,0,0,1-2-2V102H226v90A2,2,0,0,1,224,194Zm-18-26a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h32A6,6,0,0,1,206,168Zm-64,0a6,6,0,0,1-6,6H120a6,6,0,0,1,0-12h16A6,6,0,0,1,142,168Z"},null,-1),n6=[s6],r6={key:4},i6=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),c6=[i6],h6={key:5},d6=e("path",{d:"M224,52H32A12,12,0,0,0,20,64V192a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM32,60H224a4,4,0,0,1,4,4V92H28V64A4,4,0,0,1,32,60ZM224,196H32a4,4,0,0,1-4-4V100H228v92A4,4,0,0,1,224,196Zm-20-28a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h32A4,4,0,0,1,204,168Zm-64,0a4,4,0,0,1-4,4H120a4,4,0,0,1,0-8h16A4,4,0,0,1,140,168Z"},null,-1),u6=[d6],p6={name:"PhCreditCard"},P=w({...p6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",Q2,Y2)):a.value==="duotone"?(t(),l("g",I2,e6)):a.value==="fill"?(t(),l("g",a6,l6)):a.value==="light"?(t(),l("g",o6,n6)):a.value==="regular"?(t(),l("g",r6,c6)):a.value==="thin"?(t(),l("g",h6,u6)):_("",!0)],16,G2))}}),g6=["width","height","fill","transform"],m6={key:0},v6=e("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Zm100.49-60.49a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17,0l-24-24a12,12,0,0,1,17-17L116,155V124a12,12,0,0,1,24,0v31l3.51-3.52A12,12,0,0,1,160.49,151.51Z"},null,-1),$6=[v6],A6={key:1},y6=e("path",{d:"M208,88H152V32Z",opacity:"0.2"},null,-1),f6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),w6=[y6,f6],_6={key:2},Z6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34Zm-56,83.32-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35a8,8,0,0,1,11.32,11.32ZM152,88V44l44,44Z"},null,-1),H6=[Z6],L6={key:3},V6=e("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Zm-43.76-62.24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L122,169.51V120a6,6,0,0,1,12,0v49.51l13.76-13.75A6,6,0,0,1,156.24,155.76Z"},null,-1),M6=[V6],k6={key:4},b6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),x6=[b6],C6={key:5},S6=e("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Zm-45.17-62.83a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L124,174.34V120a4,4,0,0,1,8,0v54.34l17.17-17.17A4,4,0,0,1,154.83,157.17Z"},null,-1),B6=[S6],z6={name:"PhFileArrowDown"},D=w({...z6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",m6,$6)):a.value==="duotone"?(t(),l("g",A6,w6)):a.value==="fill"?(t(),l("g",_6,H6)):a.value==="light"?(t(),l("g",L6,M6)):a.value==="regular"?(t(),l("g",k6,x6)):a.value==="thin"?(t(),l("g",C6,B6)):_("",!0)],16,g6))}}),P6=["width","height","fill","transform"],D6={key:0},R6=e("path",{d:"M216,44H40A12,12,0,0,0,28,56V208a20,20,0,0,0,20,20H88a20,20,0,0,0,20-20V164h40v12a20,20,0,0,0,20,20h40a20,20,0,0,0,20-20V56A12,12,0,0,0,216,44Zm-12,64H172V68h32ZM84,68v40H52V68Zm0,136H52V132H84Zm24-64V68h40v72Zm64,32V132h32v40Z"},null,-1),N6=[R6],W6={key:1},F6=e("path",{d:"M216,56v64H160V56ZM40,208a8,8,0,0,0,8,8H88a8,8,0,0,0,8-8V120H40Z",opacity:"0.2"},null,-1),q6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48Zm-8,64H168V64h40ZM88,64v48H48V64Zm0,144H48V128H88Zm16-64V64h48v80Zm64,32V128h40v48Z"},null,-1),j6=[F6,q6],T6={key:2},U6=e("path",{d:"M160,56v96a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h40A8,8,0,0,1,160,56Zm64-8H184a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4h48a4,4,0,0,0,4-4V56A8,8,0,0,0,224,48Zm4,80H180a4,4,0,0,0-4,4v44a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V132A4,4,0,0,0,228,128ZM80,48H40a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4H84a4,4,0,0,0,4-4V56A8,8,0,0,0,80,48Zm4,80H36a4,4,0,0,0-4,4v76a16,16,0,0,0,16,16H72a16,16,0,0,0,16-16V132A4,4,0,0,0,84,128Z"},null,-1),E6=[U6],X6={key:3},G6=e("path",{d:"M216,50H40a6,6,0,0,0-6,6V208a14,14,0,0,0,14,14H88a14,14,0,0,0,14-14V158h52v18a14,14,0,0,0,14,14h40a14,14,0,0,0,14-14V56A6,6,0,0,0,216,50Zm-6,64H166V62h44ZM90,62v52H46V62Zm0,146a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V126H90Zm12-62V62h52v84Zm106,32H168a2,2,0,0,1-2-2V126h44v50A2,2,0,0,1,208,178Z"},null,-1),Q6=[G6],J6={key:4},Y6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48ZM88,208H48V128H88Zm0-96H48V64H88Zm64,32H104V64h48Zm56,32H168V128h40Zm0-64H168V64h40Z"},null,-1),I6=[Y6],O6={key:5},K6=e("path",{d:"M216,52H40a4,4,0,0,0-4,4V208a12,12,0,0,0,12,12H88a12,12,0,0,0,12-12V156h56v20a12,12,0,0,0,12,12h40a12,12,0,0,0,12-12V56A4,4,0,0,0,216,52ZM92,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V124H92Zm0-92H44V60H92Zm64,32H100V60h56Zm56,28a4,4,0,0,1-4,4H168a4,4,0,0,1-4-4V124h48Zm0-60H164V60h48Z"},null,-1),e4=[K6],a4={name:"PhKanban"},R=w({...a4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",D6,N6)):a.value==="duotone"?(t(),l("g",W6,j6)):a.value==="fill"?(t(),l("g",T6,E6)):a.value==="light"?(t(),l("g",X6,Q6)):a.value==="regular"?(t(),l("g",J6,I6)):a.value==="thin"?(t(),l("g",O6,e4)):_("",!0)],16,P6))}}),t4=["width","height","fill","transform"],l4={key:0},o4=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},null,-1),s4=[o4],n4={key:1},r4=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),i4=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),c4=[r4,i4],h4={key:2},d4=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H72a8,8,0,0,1,0-16H184a8,8,0,0,1,0,16Z"},null,-1),u4=[d4],p4={key:3},g4=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128Z"},null,-1),m4=[g4],v4={key:4},$4=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),A4=[$4],y4={key:5},f4=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128Z"},null,-1),w4=[f4],_4={name:"PhMinus"},Z4=w({..._4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",l4,s4)):a.value==="duotone"?(t(),l("g",n4,c4)):a.value==="fill"?(t(),l("g",h4,u4)):a.value==="light"?(t(),l("g",p4,m4)):a.value==="regular"?(t(),l("g",v4,A4)):a.value==="thin"?(t(),l("g",y4,w4)):_("",!0)],16,t4))}}),H4=["width","height","fill","transform"],L4={key:0},V4=e("path",{d:"M224,154.8l-47.09-21.11-.18-.08a19.94,19.94,0,0,0-19,1.75,13.08,13.08,0,0,0-1.12.84l-22.31,19c-13-7.05-26.43-20.37-33.49-33.21l19.06-22.66a11.76,11.76,0,0,0,.85-1.15,20,20,0,0,0,1.66-18.83,1.42,1.42,0,0,1-.08-.18L101.2,32A20.06,20.06,0,0,0,80.42,20.15,60.27,60.27,0,0,0,28,80c0,81.61,66.39,148,148,148a60.27,60.27,0,0,0,59.85-52.42A20.06,20.06,0,0,0,224,154.8ZM176,204A124.15,124.15,0,0,1,52,80,36.29,36.29,0,0,1,80.48,44.46l18.82,42L80.14,109.28a12,12,0,0,0-.86,1.16A20,20,0,0,0,78,130.08c9.42,19.28,28.83,38.56,48.31,48A20,20,0,0,0,146,176.63a11.63,11.63,0,0,0,1.11-.85l22.43-19.07,42,18.81A36.29,36.29,0,0,1,176,204Z"},null,-1),M4=[V4],k4={key:1},b4=e("path",{d:"M223.94,174.08A48.33,48.33,0,0,1,176,216,136,136,0,0,1,40,80,48.33,48.33,0,0,1,81.92,32.06a8,8,0,0,1,8.3,4.8l21.13,47.2a8,8,0,0,1-.66,7.53L89.32,117a7.93,7.93,0,0,0-.54,7.81c8.27,16.93,25.77,34.22,42.75,42.41a7.92,7.92,0,0,0,7.83-.59l25-21.3a8,8,0,0,1,7.59-.69l47.16,21.13A8,8,0,0,1,223.94,174.08Z",opacity:"0.2"},null,-1),x4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),C4=[b4,x4],S4={key:2},B4=e("path",{d:"M231.88,175.08A56.26,56.26,0,0,1,176,224C96.6,224,32,159.4,32,80A56.26,56.26,0,0,1,80.92,24.12a16,16,0,0,1,16.62,9.52l21.12,47.15,0,.12A16,16,0,0,1,117.39,96c-.18.27-.37.52-.57.77L96,121.45c7.49,15.22,23.41,31,38.83,38.51l24.34-20.71a8.12,8.12,0,0,1,.75-.56,16,16,0,0,1,15.17-1.4l.13.06,47.11,21.11A16,16,0,0,1,231.88,175.08Z"},null,-1),z4=[B4],P4={key:3},D4=e("path",{d:"M221.59,160.3l-47.24-21.17a14,14,0,0,0-13.28,1.22,4.81,4.81,0,0,0-.56.42l-24.69,21a1.88,1.88,0,0,1-1.68.06c-15.87-7.66-32.31-24-40-39.65a1.91,1.91,0,0,1,0-1.68l21.07-25a6.13,6.13,0,0,0,.42-.58,14,14,0,0,0,1.12-13.27L95.73,34.49a14,14,0,0,0-14.56-8.38A54.24,54.24,0,0,0,34,80c0,78.3,63.7,142,142,142a54.25,54.25,0,0,0,53.89-47.17A14,14,0,0,0,221.59,160.3ZM176,210C104.32,210,46,151.68,46,80A42.23,42.23,0,0,1,82.67,38h.23a2,2,0,0,1,1.84,1.31l21.1,47.11a2,2,0,0,1,0,1.67L84.73,113.15a4.73,4.73,0,0,0-.43.57,14,14,0,0,0-.91,13.73c8.87,18.16,27.17,36.32,45.53,45.19a14,14,0,0,0,13.77-1c.19-.13.38-.27.56-.42l24.68-21a1.92,1.92,0,0,1,1.6-.1l47.25,21.17a2,2,0,0,1,1.21,2A42.24,42.24,0,0,1,176,210Z"},null,-1),R4=[D4],N4={key:4},W4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),F4=[W4],q4={key:5},j4=e("path",{d:"M220.78,162.13,173.56,141A12,12,0,0,0,162.18,142a3.37,3.37,0,0,0-.38.28L137,163.42a3.93,3.93,0,0,1-3.7.21c-16.24-7.84-33.05-24.52-40.89-40.57a3.9,3.9,0,0,1,.18-3.69l21.2-25.21c.1-.12.19-.25.28-.38a12,12,0,0,0,1-11.36L93.9,35.28a12,12,0,0,0-12.48-7.19A52.25,52.25,0,0,0,36,80c0,77.2,62.8,140,140,140a52.25,52.25,0,0,0,51.91-45.42A12,12,0,0,0,220.78,162.13ZM220,173.58A44.23,44.23,0,0,1,176,212C103.22,212,44,152.78,44,80A44.23,44.23,0,0,1,82.42,36a3.87,3.87,0,0,1,.48,0,4,4,0,0,1,3.67,2.49l21.11,47.14a4,4,0,0,1-.23,3.6l-21.19,25.2c-.1.13-.2.25-.29.39a12,12,0,0,0-.78,11.75c8.69,17.79,26.61,35.58,44.6,44.27a12,12,0,0,0,11.79-.87l.37-.28,24.83-21.12a3.93,3.93,0,0,1,3.57-.27l47.21,21.16A4,4,0,0,1,220,173.58Z"},null,-1),T4=[j4],U4={name:"PhPhone"},N=w({...U4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",L4,M4)):a.value==="duotone"?(t(),l("g",k4,C4)):a.value==="fill"?(t(),l("g",S4,z4)):a.value==="light"?(t(),l("g",P4,R4)):a.value==="regular"?(t(),l("g",N4,F4)):a.value==="thin"?(t(),l("g",q4,T4)):_("",!0)],16,H4))}}),E4=["width","height","fill","transform"],X4={key:0},G4=e("path",{d:"M137,168l11.52-11.51a12,12,0,0,0-17-17L120,151l-15-15,11.52-11.51a12,12,0,0,0-17-17L88,119,72.49,103.51a12,12,0,0,0-17,17L59,124,38.54,144.49a36,36,0,0,0,0,50.91l2.55,2.54L15.51,223.51a12,12,0,0,0,17,17l25.57-25.58,2.54,2.55a36.06,36.06,0,0,0,50.91,0L132,197l3.51,3.52a12,12,0,0,0,17-17ZM94.54,200.49a12,12,0,0,1-17,0L55.51,178.43a12,12,0,0,1,0-17L76,141l39,39Zm146-185a12,12,0,0,0-17,0L197.94,41.09l-2.54-2.55a36.05,36.05,0,0,0-50.91,0L124,59l-3.51-3.52a12,12,0,0,0-17,17l80,80a12,12,0,0,0,17-17L197,132l20.49-20.49a36,36,0,0,0,0-50.91l-2.55-2.54,25.58-25.57A12,12,0,0,0,240.49,15.51Zm-40,79L180,115,141,76l20.49-20.49a12,12,0,0,1,17,0l22.06,22.06a12,12,0,0,1,0,17Z"},null,-1),Q4=[G4],J4={key:1},Y4=e("path",{d:"M76,124l56,56-29,29a24,24,0,0,1-33.94,0L47,186.91A24,24,0,0,1,47,153ZM209,69.09,186.91,47A24,24,0,0,0,153,47L124,76l56,56,29-29A24,24,0,0,0,209,69.09Z",opacity:"0.2"},null,-1),I4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),O4=[Y4,I4],K4={key:2},e8=e("path",{d:"M149.66,149.66,131.31,168l18.35,18.34a8,8,0,0,1-11.32,11.32L132,191.31l-23.31,23.32a32.06,32.06,0,0,1-45.26,0l-5.37-5.38-28.4,28.41a8,8,0,0,1-11.32-11.32l28.41-28.4-5.38-5.37a32,32,0,0,1,0-45.26L64.69,124l-6.35-6.34a8,8,0,0,1,11.32-11.32L88,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32L99.31,136,120,156.69l18.34-18.35a8,8,0,0,1,11.32,11.32Zm88-131.32a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Z"},null,-1),a8=[e8],t8={key:3},l8=e("path",{d:"M148.24,139.76a6,6,0,0,0-8.48,0L120,159.51,96.49,136l19.75-19.76a6,6,0,0,0-8.48-8.48L88,127.51,68.24,107.76a6,6,0,0,0-8.48,8.48L67.51,124,42.79,148.73a30,30,0,0,0,0,42.42l6.78,6.79L19.76,227.76a6,6,0,1,0,8.48,8.48l29.82-29.81,6.79,6.78a30,30,0,0,0,42.42,0L132,188.49l7.76,7.75a6,6,0,0,0,8.48-8.48L128.49,168l19.75-19.76A6,6,0,0,0,148.24,139.76Zm-49.45,65a18,18,0,0,1-25.46,0L51.27,182.67a18,18,0,0,1,0-25.46L76,132.49,123.51,180Zm137.45-185a6,6,0,0,0-8.48,0L197.94,49.57l-6.79-6.78a30,30,0,0,0-42.42,0L124,67.51l-7.76-7.75a6,6,0,0,0-8.48,8.48l80,80a6,6,0,0,0,8.48-8.48L188.49,132l24.72-24.73a30,30,0,0,0,0-42.42l-6.78-6.79,29.81-29.82A6,6,0,0,0,236.24,19.76Zm-31.51,79L180,123.51,132.49,76l24.72-24.73a18,18,0,0,1,25.46,0l22.06,22.06a18,18,0,0,1,0,25.46Z"},null,-1),o8=[l8],s8={key:4},n8=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),r8=[n8],i8={key:5},c8=e("path",{d:"M146.83,141.17a4,4,0,0,0-5.66,0L120,162.34,93.66,136l21.17-21.17a4,4,0,0,0-5.66-5.66L88,130.34,66.83,109.17a4,4,0,0,0-5.66,5.66L70.34,124,44.2,150.14a28,28,0,0,0,0,39.6l8.2,8.2L21.17,229.17a4,4,0,0,0,5.66,5.66L58.06,203.6l8.2,8.2a28,28,0,0,0,39.6,0L132,185.66l9.17,9.17a4,4,0,0,0,5.66-5.66L125.66,168l21.17-21.17A4,4,0,0,0,146.83,141.17Zm-46.63,65a20,20,0,0,1-28.28,0L49.86,184.08a20,20,0,0,1,0-28.28L76,129.66,126.34,180Zm134.63-185a4,4,0,0,0-5.66,0L197.94,52.4l-8.2-8.2a28,28,0,0,0-39.6,0L124,70.34l-9.17-9.17a4,4,0,0,0-5.66,5.66l80,80a4,4,0,0,0,5.66-5.66L185.66,132l26.14-26.14a28,28,0,0,0,0-39.6l-8.2-8.2,31.23-31.23A4,4,0,0,0,234.83,21.17ZM212,86.06a19.86,19.86,0,0,1-5.86,14.14L180,126.34,129.66,76,155.8,49.86a20,20,0,0,1,28.28,0l22.06,22.06A19.85,19.85,0,0,1,212,86.06Z"},null,-1),h8=[c8],d8={name:"PhPlugs"},W=w({...d8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",X4,Q4)):a.value==="duotone"?(t(),l("g",J4,O4)):a.value==="fill"?(t(),l("g",K4,a8)):a.value==="light"?(t(),l("g",t8,o8)):a.value==="regular"?(t(),l("g",s8,r8)):a.value==="thin"?(t(),l("g",i8,h8)):_("",!0)],16,E4))}}),u8=["width","height","fill","transform"],p8={key:0},g8=e("path",{d:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},null,-1),m8=[g8],v8={key:1},$8=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),A8=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),y8=[$8,A8],f8={key:2},w8=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"},null,-1),_8=[w8],Z8={key:3},H8=e("path",{d:"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z"},null,-1),L8=[H8],V8={key:4},M8=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),k8=[M8],b8={key:5},x8=e("path",{d:"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z"},null,-1),C8=[x8],S8={name:"PhPlus"},B8=w({...S8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",p8,m8)):a.value==="duotone"?(t(),l("g",v8,y8)):a.value==="fill"?(t(),l("g",f8,_8)):a.value==="light"?(t(),l("g",Z8,L8)):a.value==="regular"?(t(),l("g",V8,k8)):a.value==="thin"?(t(),l("g",b8,C8)):_("",!0)],16,u8))}}),z8=["width","height","fill","transform"],P8={key:0},D8=e("path",{d:"M20,128A76.08,76.08,0,0,1,96,52h99l-3.52-3.51a12,12,0,1,1,17-17l24,24a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L195,76H96a52.06,52.06,0,0,0-52,52,12,12,0,0,1-24,0Zm204-12a12,12,0,0,0-12,12,52.06,52.06,0,0,1-52,52H61l3.52-3.51a12,12,0,1,0-17-17l-24,24a12,12,0,0,0,0,17l24,24a12,12,0,1,0,17-17L61,204h99a76.08,76.08,0,0,0,76-76A12,12,0,0,0,224,116Z"},null,-1),R8=[D8],N8={key:1},W8=e("path",{d:"M224,64v64a64,64,0,0,1-64,64H32V128A64,64,0,0,1,96,64Z",opacity:"0.2"},null,-1),F8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),q8=[W8,F8],j8={key:2},T8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56h96V40a8,8,0,0,1,13.66-5.66l24,24a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,192,88V72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H64V168a8,8,0,0,0-13.66-5.66l-24,24a8,8,0,0,0,0,11.32l24,24A8,8,0,0,0,64,216V200h96a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),U8=[T8],E8={key:3},X8=e("path",{d:"M26,128A70.08,70.08,0,0,1,96,58H209.51L195.76,44.24a6,6,0,0,1,8.48-8.48l24,24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L209.51,70H96a58.07,58.07,0,0,0-58,58,6,6,0,0,1-12,0Zm198-6a6,6,0,0,0-6,6,58.07,58.07,0,0,1-58,58H46.49l13.75-13.76a6,6,0,0,0-8.48-8.48l-24,24a6,6,0,0,0,0,8.48l24,24a6,6,0,0,0,8.48-8.48L46.49,198H160a70.08,70.08,0,0,0,70-70A6,6,0,0,0,224,122Z"},null,-1),G8=[X8],Q8={key:4},J8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),Y8=[J8],I8={key:5},O8=e("path",{d:"M28,128A68.07,68.07,0,0,1,96,60H214.34L197.17,42.83a4,4,0,0,1,5.66-5.66l24,24a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L214.34,68H96a60.07,60.07,0,0,0-60,60,4,4,0,0,1-8,0Zm196-4a4,4,0,0,0-4,4,60.07,60.07,0,0,1-60,60H41.66l17.17-17.17a4,4,0,0,0-5.66-5.66l-24,24a4,4,0,0,0,0,5.66l24,24a4,4,0,1,0,5.66-5.66L41.66,196H160a68.07,68.07,0,0,0,68-68A4,4,0,0,0,224,124Z"},null,-1),K8=[O8],ee={name:"PhRepeat"},F=w({...ee,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",P8,R8)):a.value==="duotone"?(t(),l("g",N8,q8)):a.value==="fill"?(t(),l("g",j8,U8)):a.value==="light"?(t(),l("g",E8,G8)):a.value==="regular"?(t(),l("g",Q8,Y8)):a.value==="thin"?(t(),l("g",I8,K8)):_("",!0)],16,z8))}}),ae=["width","height","fill","transform"],te={key:0},le=e("path",{d:"M125.18,156.94a64,64,0,1,0-82.36,0,100.23,100.23,0,0,0-39.49,32,12,12,0,0,0,19.35,14.2,76,76,0,0,1,122.64,0,12,12,0,0,0,19.36-14.2A100.33,100.33,0,0,0,125.18,156.94ZM44,108a40,40,0,1,1,40,40A40,40,0,0,1,44,108Zm206.1,97.67a12,12,0,0,1-16.78-2.57A76.31,76.31,0,0,0,172,172a12,12,0,0,1,0-24,40,40,0,1,0-10.3-78.67,12,12,0,1,1-6.16-23.19,64,64,0,0,1,57.64,110.8,100.23,100.23,0,0,1,39.49,32A12,12,0,0,1,250.1,205.67Z"},null,-1),oe=[le],se={key:1},ne=e("path",{d:"M136,108A52,52,0,1,1,84,56,52,52,0,0,1,136,108Z",opacity:"0.2"},null,-1),re=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),ie=[ne,re],ce={key:2},he=e("path",{d:"M164.47,195.63a8,8,0,0,1-6.7,12.37H10.23a8,8,0,0,1-6.7-12.37,95.83,95.83,0,0,1,47.22-37.71,60,60,0,1,1,66.5,0A95.83,95.83,0,0,1,164.47,195.63Zm87.91-.15a95.87,95.87,0,0,0-47.13-37.56A60,60,0,0,0,144.7,54.59a4,4,0,0,0-1.33,6A75.83,75.83,0,0,1,147,150.53a4,4,0,0,0,1.07,5.53,112.32,112.32,0,0,1,29.85,30.83,23.92,23.92,0,0,1,3.65,16.47,4,4,0,0,0,3.95,4.64h60.3a8,8,0,0,0,7.73-5.93A8.22,8.22,0,0,0,252.38,195.48Z"},null,-1),de=[he],ue={key:3},pe=e("path",{d:"M112.6,158.43a58,58,0,1,0-57.2,0A93.83,93.83,0,0,0,5.21,196.72a6,6,0,0,0,10.05,6.56,82,82,0,0,1,137.48,0,6,6,0,0,0,10-6.56A93.83,93.83,0,0,0,112.6,158.43ZM38,108a46,46,0,1,1,46,46A46.06,46.06,0,0,1,38,108Zm211,97a6,6,0,0,1-8.3-1.74A81.8,81.8,0,0,0,172,166a6,6,0,0,1,0-12,46,46,0,1,0-17.08-88.73,6,6,0,1,1-4.46-11.14,58,58,0,0,1,50.14,104.3,93.83,93.83,0,0,1,50.19,38.29A6,6,0,0,1,249,205Z"},null,-1),ge=[pe],me={key:4},ve=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),$e=[ve],Ae={key:5},ye=e("path",{d:"M107.19,159a56,56,0,1,0-46.38,0A91.83,91.83,0,0,0,6.88,197.81a4,4,0,1,0,6.7,4.37,84,84,0,0,1,140.84,0,4,4,0,1,0,6.7-4.37A91.83,91.83,0,0,0,107.19,159ZM36,108a48,48,0,1,1,48,48A48.05,48.05,0,0,1,36,108Zm212,95.35a4,4,0,0,1-5.53-1.17A83.81,83.81,0,0,0,172,164a4,4,0,0,1,0-8,48,48,0,1,0-17.82-92.58,4,4,0,1,1-3-7.43,56,56,0,0,1,44,103,91.83,91.83,0,0,1,53.93,38.86A4,4,0,0,1,248,203.35Z"},null,-1),fe=[ye],we={name:"PhUsers"},q=w({...we,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(n){const o=n,s=i("weight","regular"),d=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),a=c(()=>o.weight??s),r=c(()=>o.size??d),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(h,y)=>(t(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},h.$attrs),[f(h.$slots,"default"),a.value==="bold"?(t(),l("g",te,oe)):a.value==="duotone"?(t(),l("g",se,ie)):a.value==="fill"?(t(),l("g",ce,de)):a.value==="light"?(t(),l("g",ue,ge)):a.value==="regular"?(t(),l("g",me,$e)):a.value==="thin"?(t(),l("g",Ae,fe)):_("",!0)],16,ae))}}),_e=L({components:{PhRocketLaunch:x}},"$zFVJLCtHYa"),V="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8zQyM/GmJhYTFpWBkNamJjMWIoLMYog83Mm19qfrzeG0m2ylZRYuPXgr+ArbJWikjJljWxYXrOmzc1k8y53XM/93vPOd17LtjDGSWr1/kgmytooWDAvRBZdDtfcdKGjTq8UUVXZ+YmwtS0rweJFLvzmrVqx/1rTfGEroCtQXhUUbWC8KTw9FpBNXlXuENJR+PC58J9mlxQ+N7UYxa/mZyy+MdkLRwaA3ursDtVxbEqVtJaVlhejiebWVXK9zFf0pzIzc/J2i2zC50QQQK4mWKcMfwMMCLej5dB+mVHjXxfKX+WvOQq4lXW0VghRZoCfaKuSvWErEnREzIyrJv9/9tXPTk0aFVvDkD9i2F89IBzB4rbhvF9bBjFE3A8w1Wukp8/guFP0bcrmucQXJtwcV3RYntwuQWdT2pUi5Ykh0x7MgnvZ9ASgfZbaFyyelY+5/QRwhvyVTewfwC9Eu9a/gU46mfRWXQCPQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcxJREFUSIm91sGLjlEUx/HPDAt11WWlbEYUNsqCsrChhCQSWSg2alIsrJQ/wsLKxsLORs1sJDY0TdEYTUqzmYWIMlm4i2M2M43F+yrG+77PfXjNb3nOved7z3nOPc+lpSLKlYjyPqKsRJSpiLKvzf6RlrCTeLzG/AV7UsqlJsZoGyCu9rBtw9naAG0zXMaGHq7XKeWDQwVGlFGs9POnlKtitSnpjoYDjQ0beKLBX/Udq8oQUTJeYu+AZXM4kFLuW3YqMowouzHRAIP9uNEU748MI8pG7MRhHMf5moN19R2XUsoTA4ER5TTGcaoycJPu4xFmUspffwNGlMt4MCRQPz3EvZTyi5GIsoBd/xkIq7gwElGWsGkdgDA/iul1gsHYKK7j0zoBX/3s0s06HXoEF7HlP8AWcbTnpIkoW3ETt/X+O9ToXXfvNKYwmVL+NnC0RZRDOvdpeyVkFXdwN6X8odeCxlkaUY7haQVsEedSygObsHFkpZSf4UkFcLwJVgXs6nmD/82g+fk3wNkG/9qH1T8DezbAL6oeHrXAjwa8Z/B2qMCU8hIm+7hnU8qfhwrs6haW1tiWca1FjHpgSnlB5yE1p3PB53EmpTzTBvgD8suAQT4OgVAAAAAASUVORK5CYII=",Ze=""+new URL("planet-blue.Dl2xr_Rd.png",import.meta.url).href,He=""+new URL("planet-ring.Cu48O4jc.png",import.meta.url).href,Le=""+new URL("planet-red.BluWtDiz.png",import.meta.url).href,Ve={class:"page-wrapper hero-wrapper"},Me={class:"hero"},ke=e("h1",null,[$("Blast your Startup to the "),e("span",{class:"emph"},"Cosmos")],-1),be=e("h2",null,"QAComet: Subscription-Based Quality Assurance for your SaaS",-1),xe={class:"cta-outer"},Ce={class:"hero-cta",href:"#plan"},Se=e("span",{class:"hero-cta-text"},"Get Started",-1),Be={class:"hero-cta-icon"},ze=e("img",{class:"star star-1",src:V},null,-1),Pe=e("img",{class:"star star-2",src:V},null,-1),De=e("img",{class:"star star-3",src:V},null,-1),Re=e("img",{class:"star star-4",src:V},null,-1),Ne=e("div",{class:"hero-images"},[e("img",{class:"star planet-1",src:Ze}),e("img",{class:"star planet-2",src:He}),e("img",{class:"star planet-3",src:Le})],-1);function We(n,o,s,d,u,p){const a=x;return t(),l("div",Ve,[e("div",Me,[ke,be,e("div",xe,[e("a",Ce,[Se,e("div",Be,[v(a)])]),ze,Pe,De,Re])]),Ne])}const Fe=H(_e,[["render",We]]),qe=L({components:{}},"$0jV3At8Fqp"),je="data:image/png;base64,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",Te=""+new URL("medusa-logo.B_CCAbp4.svg",import.meta.url).href,Ue=""+new URL("thinkk-logo.B37igL3_.png",import.meta.url).href,Ee=""+new URL("linkwarden-logo.Cnb5oU7W.png",import.meta.url).href,Xe={class:"brand-logos-wrapper"},Ge=Q('
',1),Qe=[Ge];function Je(n,o,s,d,u,p){return t(),l("div",Xe,Qe)}const Ye=H(qe,[["render",Je]]),Ie=L({name:"HowItWorks",components:{PhFileArrowDown:D,PhKanban:R,PhRepeat:F}},"$Y4gCXyqNGe"),Oe={class:"how-it-works-outer"},Ke=e("div",{class:"bg-img"},null,-1),ea={class:"how-it-works-inner",id:"how-it-works"},aa={class:"page-wrapper"},ta=e("div",{class:"section-header"},[e("h1",null,"We've Revamped QA"),e("h2",null,[$("Now it's an Asnyc Workflow"),e("br"),$("Orbiting around your Product")])],-1),la={class:"steps-wrapper pt-8"},oa={class:"step"},sa={class:"step-icon shadow-main"},na=e("div",{class:"step-copy"},[e("h3",null,"Schedule"),e("span",null,"Subscribe to our service and submit as many tickets as you want on our Github Project board.")],-1),ra={class:"step"},ia={class:"step-icon shadow-main"},ca=e("div",{class:"step-copy"},[e("h3",null,"Receive"),e("span",null,"You'll see a response with a full QA report, test code, etc. within 2-3 business days")],-1),ha={class:"step"},da={class:"step-icon shadow-main"},ua=e("div",{class:"step-copy"},[e("h3",null,"Update"),e("span",null,"We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.")],-1);function pa(n,o,s,d,u,p){const a=R,r=D,g=F;return t(),l("div",Oe,[Ke,e("div",ea,[e("div",aa,[ta,e("div",la,[e("div",oa,[e("div",sa,[v(a,{weight:"duotone"})]),na]),e("div",ra,[e("div",ia,[v(r,{weight:"duotone"})]),ca]),e("div",ha,[e("div",da,[v(g)]),ua])])])])])}const ga=H(Ie,[["render",pa]]),ma=""+new URL("ali-photo.C0U5PBBD.jpg",import.meta.url).href,va=L({components:{PhArrowRight:a1,PhCaretLeft:D0,PhCaretRight:o2,PhQuotes:t1},data(){return{image:ma,slides:[{}]}},methods:{slideLeft(){},slideRight(){}}},"$WfSQQL4a1P"),$a={class:"recent-work-outer",id:"recent-work"},Aa={class:"page-wrapper"},ya=e("div",{class:"section-header"},[e("h1",null,"Recent QA Work")],-1),fa={class:"slider-outer"};function wa(n,o,s,d,u,p){const a=l1;return t(),l("div",$a,[e("div",Aa,[ya,e("div",fa,[v(a,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali B.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",caseStudy:"/case-studies/automatisch",testimonial:"Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier."})])])])}const _a=H(va,[["render",wa]]),Za=L({name:"HowItWorks",components:{PhBackspace:C,PhBrowsers:S,PhCloudCheck:z,PhCreditCard:P,PhPlugs:W,PhUsers:q}},"$qIsZyFbGE8"),Ha="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20413%20213'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-229.252,-1518.25)'%3e%3cg%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,142.617,1012.17)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,2.5,0)'%3e%3cpath%20d='M245.577,1528.18L406.577,1577.68C407.368,1577.93%20408.208,1577.48%20408.451,1576.69C408.695,1575.9%20408.25,1575.06%20407.458,1574.82L246.458,1525.32C245.667,1525.07%20244.827,1525.52%20244.584,1526.31C244.34,1527.1%20244.785,1527.94%20245.577,1528.18Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",La="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20255%20257'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-918.017,-1484.25)'%3e%3cg%20transform='matrix(1,0,0,1,499,10)'%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,534.882,968.167)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,576.882,1136.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M251.03,1514.78L258.03,1568.94C258.136,1569.76%20258.889,1570.34%20259.71,1570.24C260.531,1570.13%20261.111,1569.38%20261.005,1568.56L254.005,1514.39C253.899,1513.57%20253.146,1512.99%20252.325,1513.1C251.504,1513.2%20250.924,1513.95%20251.03,1514.78Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M265.344,1593.85L287.344,1660.22C287.604,1661.01%20288.454,1661.43%20289.239,1661.17C290.025,1660.91%20290.452,1660.06%20290.191,1659.28L268.191,1592.9C267.931,1592.12%20267.081,1591.69%20266.296,1591.95C265.51,1592.21%20265.083,1593.06%20265.344,1593.85Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Va={class:"services-outer",id:"tasks"},Ma=e("img",{class:"constellation-1",width:"320",src:Ha},null,-1),ka=e("img",{class:"constellation-2",width:"240",src:La},null,-1),ba={class:"services-inner"},xa={class:"page-wrapper"},Ca=e("div",{class:"section-header"},[e("h1",null,"Subscription Benefits"),e("h2",null,"A Constellation of QA and Testing Services for Robust Launches of New Products and Features")],-1),Sa={class:"steps-wrapper first-steps-wrapper"},Ba={class:"step"},za={class:"step-icon shadow-main"},Pa=e("div",{class:"step-copy"},[e("h3",null,"Reduce Churn"),e("span",null,"Find bugs before potential customers leave from frustration")],-1),Da={class:"step"},Ra={class:"step-icon shadow-main"},Na=e("div",{class:"step-copy"},[e("h3",null,"Usability Testing"),e("span",null,"Extensive usability tests for those hard to find edge cases and bugs")],-1),Wa={class:"step"},Fa={class:"step-icon shadow-main"},qa=e("div",{class:"step-copy"},[e("h3",null,"E2E Testing"),e("span",null,"We'll automate the testing of core user workflows guaranteeing they're functional before deployment")],-1),ja={class:"steps-wrapper"},Ta={class:"step"},Ua={class:"step-icon shadow-main"},Ea=e("div",{class:"step-copy"},[e("h3",null,"Multi-Browser Support"),e("span",null,"We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac")],-1),Xa={class:"step"},Ga={class:"step-icon shadow-main"},Qa=e("div",{class:"step-copy"},[e("h3",null,"Regression Testing"),e("span",null,"Make sure bug fixes don't revert, especially for core functionality")],-1),Ja={class:"step"},Ya={class:"step-icon shadow-main"},Ia=e("div",{class:"step-copy"},[e("h3",null,"Integration Testing"),e("span",null,"Ensure your systems are coordinating together correctly before reaching production.")],-1);function Oa(n,o,s,d,u,p){const a=P,r=q,g=z,m=S,h=C,y=W;return t(),l("div",Va,[Ma,ka,e("div",ba,[e("div",xa,[Ca,e("div",Sa,[e("div",Ba,[e("div",za,[v(a)]),Pa]),e("div",Da,[e("div",Ra,[v(r)]),Na]),e("div",Wa,[e("div",Fa,[v(g)]),qa])]),e("div",ja,[e("div",Ta,[e("div",Ua,[v(m)]),Ea]),e("div",Xa,[e("div",Ga,[v(h)]),Qa]),e("div",Ja,[e("div",Ya,[v(y)]),Ia])])])])])}const Ka=H(Za,[["render",Oa]]),et=L({props:{setOption:{type:Function,default:n=>{}}},watch:{option(){this.setBgStyle()}},data(){return{option:"monthly",bgStyle:{width:"0px",height:"0px"}}},computed:{ariaLabel(){return this.option==="monthly"?"Toggle yearly plan":"Toggle monthly plan"}},mounted(){this.setBgStyle(),document.fonts.ready.finally(()=>{this.setBgStyle()})},methods:{setBgStyle(){const n=this.$refs.wrapper;if(!n)return;const o=n.getBoundingClientRect();if(this.option==="monthly"){const s=this.$refs.monthly;if(s){const d=s.getBoundingClientRect(),u=d.x-o.x-2;this.bgStyle={width:d.width+"px",height:d.height-4+"px",borderRadius:Math.ceil((s.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}else{const s=this.$refs.yearly;if(s){const d=s.getBoundingClientRect(),u=d.x-o.x;this.bgStyle={width:d.width+"px",height:d.height-4+"px",borderRadius:Math.ceil((s.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}},toggle(){this.option=this.option==="monthly"?"yearly":"monthly",this.setOption(this.option)}}},"$m7wA03iy9u"),at=["aria-label"],tt={class:"text",ref:"monthly"},lt={class:"text",ref:"yearly"};function ot(n,o,s,d,u,p){return t(),l("button",{class:"toggle-wrapper",ref:"wrapper",onClick:o[0]||(o[0]=(...a)=>n.toggle&&n.toggle(...a)),"aria-label":n.ariaLabel},[e("div",{class:"toggle-bg",style:J(n.bgStyle)},null,4),e("span",tt,"Monthly",512),e("span",lt,"Yearly",512)],8,at)}const st=H(et,[["render",ot]]),nt=L({name:"Plan",components:{PhCheck:B,PhPhone:N},data(){return{option:"monthly"}},computed:{signupLink(){return"mailto:hello@qacomet.com?subject=Get Started "+(this.option==="monthly"?"Monthly":"Yearly")+"&body=Hey,%0D%0A%0D%0AI'm interested in using your service, could you send me an invoice and we can get started?"},price(){return this.option==="monthly"?"4,999":"4,249"}},methods:{setOption(n){this.option=n}}},"$DqbyBHNawb"),rt={class:"plan-outer",id:"plan"},it={class:"page-wrapper"},ct=e("div",{class:"section-header plan-header",style:{"padding-bottom":"2rem"}},[e("img",{class:"star star-1",src:V}),e("img",{class:"star star-2",src:V}),e("img",{class:"star star-3",src:V}),e("h1",null,"Clear Pricing"),e("h2",null,[$("Building great products is hard,"),e("br"),$("pricing shouldn't be")])],-1),ht={class:"plan-toggle-wrapper"},dt={class:"plan"},ut={class:"plan-body"},pt={class:"plan-info"},gt=e("span",{class:"slash"},null,-1),mt=e("span",{class:"slash"},"/",-1),vt=e("span",{class:"mo"},"mo",-1),$t=e("br",null,null,-1),At=e("h3",null,"Pause or cancel anytime",-1),yt=["href"],ft={class:"plan-features"},wt={class:"plan-feature-row"},_t={class:"check"},Zt=e("div",{class:"plan-feature"},"1 request at a time",-1),Ht={class:"plan-feature-row"},Lt={class:"check"},Vt=e("div",{class:"plan-feature"},"2 week $50 trial",-1),Mt={class:"plan-feature-row"},kt={class:"check"},bt=e("div",{class:"plan-feature"},"2-3 business day delivery",-1),xt={class:"plan-feature-row"},Ct={class:"check"},St=e("div",{class:"plan-feature"},"Unlimited users",-1),Bt={class:"plan-feature-row"},zt={class:"check"},Pt=e("div",{class:"plan-feature"},"No contracts, pause or cancel anytime",-1),Dt=e("div",{class:"booking-wrapper"},[e("div",{class:"booking-text"},"Curious how QAComet will work for you?"),e("a",{href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call",class:"booking-cta"},[e("span",null,"Book a call")])],-1);function Rt(n,o,s,d,u,p){const a=st,r=B;return t(),l("div",rt,[e("div",it,[ct,e("div",ht,[v(a,{setOption:n.setOption},null,8,["setOption"])]),e("div",dt,[e("div",ut,[e("div",pt,[e("h1",null,[gt,$("$"+k(n.price),1),mt,vt]),e("h2",null,[$("Billed "+k(n.option),1),$t,$("no contracts, no commitments")]),At,e("a",{class:"payment",href:n.signupLink},"Signup",8,yt)]),e("div",ft,[e("div",wt,[e("div",_t,[v(r,{weight:"bold"})]),Zt]),e("div",Ht,[e("div",Lt,[v(r,{weight:"bold"})]),Vt]),e("div",Mt,[e("div",kt,[v(r,{weight:"bold"})]),bt]),e("div",xt,[e("div",Ct,[v(r,{weight:"bold"})]),St]),e("div",Bt,[e("div",zt,[v(r,{weight:"bold"})]),Pt])])])]),Dt])])}const Nt=H(nt,[["render",Rt]]),Wt=L({name:"Accordion",components:{},data(){return{expanded:!1}},methods:{handleExpanded(){this.expanded=!this.expanded}}},"$Y0yju32yn3"),Ft={class:"accordion-wrapper"},qt={class:"accordion-header-text"},jt={class:"accordion-header-icon","aria-label":"Expand accordion"},Tt={key:0,class:"icon"},Ut={key:1,class:"icon"},Et={class:"accordion-text"};function Xt(n,o,s,d,u,p){const a=Z4,r=B8;return t(),l("div",Ft,[e("div",{class:"accordion-header",onClick:o[0]||(o[0]=(...g)=>n.handleExpanded&&n.handleExpanded(...g))},[e("div",qt,[e("span",null,[f(n.$slots,"header")])]),e("button",jt,[n.expanded?(t(),l("div",Tt,[v(a,{weight:"bold"})])):(t(),l("div",Ut,[v(r,{weight:"bold"})]))])]),e("div",{class:Y(["accordion-text-wrapper",{"accordion-text-hidden":!n.expanded,"accordion-text-expanded":n.expanded}])},[e("div",Et,[f(n.$slots,"text")])],2)])}const Gt=H(Wt,[["render",Xt]]),Qt=L({},"$Wb7gDotc3K"),Jt={class:"faqs-outer",id:"faqs"},Yt={class:"page-wrapper"},It=e("div",{class:"section-header"},[e("h1",null,"FAQ's")],-1),Ot={class:"faqs-body"},Kt=e("a",{href:"https://playwright.dev/"},"Playwright",-1);function e3(n,o,s,d,u,p){const a=Gt;return t(),l("div",Jt,[e("div",Yt,[It,e("div",Ot,[v(a,null,{header:A(()=>[$("Why wouldn't I just hire a full-time QA engineer?")]),text:A(()=>[$("Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.")]),_:1}),v(a,null,{header:A(()=>[$("Which frameworks do you use for testing?")]),text:A(()=>[$("We mainly write tests in javascript using "),Kt,$(". We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.")]),_:1}),v(a,null,{header:A(()=>[$("What kind of platforms do you offer testing on?")]),text:A(()=>[$("We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.")]),_:1}),v(a,null,{header:A(()=>[$("How can I run these tests?")]),text:A(()=>[$("Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.")]),_:1}),v(a,null,{header:A(()=>[$("How quickly will tests be ready?")]),text:A(()=>[$("We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.")]),_:1}),v(a,null,{header:A(()=>[$("Can we use another project management tool?")]),text:A(()=>[$("We can, but that's an add on cost since it slows down our workflow.")]),_:1}),v(a,null,{header:A(()=>[$("How are projects split up?")]),text:A(()=>[$("You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.")]),_:1}),v(a,null,{header:A(()=>[$("How can I get started?")]),text:A(()=>[$('You can click on the "Start Today" button in the navbar and it will take you to the registration section.')]),_:1}),v(a,null,{header:A(()=>[$("Do you offer yearly pricing?")]),text:A(()=>[$("Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!")]),_:1}),v(a,null,{header:A(()=>[$("Can I get a refund if I'm not satisfied?")]),text:A(()=>[$("We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.")]),_:1})])])])}const a3=H(Qt,[["render",e3]]),t3={},l3={class:"end-outer"},o3={class:"page-wrapper end-wrapper"},s3=e("h2",null,"Book a call and see if QAComet works for you",-1),n3=e("h3",null,"Receive a guided tour through our QA process and find out how your company can benefit from QAComet.",-1),r3={href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call",class:"end-cta"},i3=e("span",null,"Book a call",-1);function c3(n,o){const s=N;return t(),l("div",l3,[e("div",o3,[s3,n3,e("a",r3,[i3,v(s)])])])}const h3=H(t3,[["render",c3]]),$3=w({__name:"index",setup(n){const o=O(),s=new URL(o.public.baseUrl);return s.pathname=o1,s.searchParams.set("utm_source","ab5"),s.toString(),(d,u)=>{const p=Fe,a=Ye,r=ga,g=_a,m=Ka,h=Nt,y=a3,j=h3;return t(),l(I,null,[v(p),v(a),v(r),v(g),v(m),v(h),v(y),v(j)],64)}}});export{$3 as default}; diff --git a/_nuxt/C_1yPr0e.js b/_nuxt/BTfD_XlD.js similarity index 71% rename from _nuxt/C_1yPr0e.js rename to _nuxt/BTfD_XlD.js index d9de803..25d5621 100644 --- a/_nuxt/C_1yPr0e.js +++ b/_nuxt/BTfD_XlD.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH4",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./DiyP6pou.js";const l=["id"],p=["href"],k=d({__name:"ProseH4",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/CFwVd7gV.js b/_nuxt/BWKb2ttN.js similarity index 97% rename from _nuxt/CFwVd7gV.js rename to _nuxt/BWKb2ttN.js index dea8d5d..448296b 100644 --- a/_nuxt/CFwVd7gV.js +++ b/_nuxt/BWKb2ttN.js @@ -1 +1 @@ -import{a0 as _,P as T,u as M,N as W,y as B}from"./BlS8upJP.js";import{g as b,a as P,b as E,o as J,c as k,d as $,f as j,h as D,i as H}from"./DF1VbFfH.js";import{p as G}from"./BsYmvPZw.js";import{u as U}from"./BECgZIvk.js";const Z="memory",q=()=>{const t=new Map;return{name:Z,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function F(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return F(t(...r))}catch(n){return Promise.reject(n)}}function V(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function Q(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(V(t))return String(t);if(Q(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const R="base64:";function X(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return R+r}function ee(t){return typeof t!="string"||!t.startsWith(R)?t:(z(),Buffer.from(t.slice(R.length),"base64"))}const te=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function re(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of te)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ne(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ie="memory",ae=()=>{const t=new Map;return{name:ie,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function se(t={}){const r={mounts:{"":t.driver||ae()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ne(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>ee(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,X(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function oe(t={}){const r=ue(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(b(a,c),o)})}return n}function ue(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(P(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(P(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(P(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function ce(t){const r=oe(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>k(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(j(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===T(u,"_dir"));f&&(o.dirConfig={_path:f._path,...j(["_"])(f)})}}return o},(c,o)=>({...c,result:$(j(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...J(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=ce(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var le=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",le,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(G).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>W(t,M().public.content.api.baseURL),we=re(se({driver:q()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>H(N(r),{initialParams:n,legacy:!0})}}let C=null,S=null;async function Ie(){return S?await S:C||(S=Ae(),C=await S),C}async function Ae(){const t=B(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Se(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Se as generateNavigation,Ie as useContentDatabase}; +import{a0 as _,O as T,u as M,M as W,y as B}from"./DiyP6pou.js";import{g as b,a as j,b as E,o as J,c as k,d as $,f as P,h as D,i as H}from"./DEZhdWR8.js";import{p as G}from"./C-v3KzvZ.js";import{u as U}from"./BpUWW4O-.js";const Z="memory",q=()=>{const t=new Map;return{name:Z,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function F(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return F(t(...r))}catch(n){return Promise.reject(n)}}function V(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function Q(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(V(t))return String(t);if(Q(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const R="base64:";function X(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return R+r}function ee(t){return typeof t!="string"||!t.startsWith(R)?t:(z(),Buffer.from(t.slice(R.length),"base64"))}const te=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function re(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of te)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ne(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ie="memory",ae=()=>{const t=new Map;return{name:ie,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function se(t={}){const r={mounts:{"":t.driver||ae()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ne(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>ee(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,X(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function oe(t={}){const r=ue(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(b(a,c),o)})}return n}function ue(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(j(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(j(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(j(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function ce(t){const r=oe(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>k(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(P(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===T(u,"_dir"));f&&(o.dirConfig={_path:f._path,...P(["_"])(f)})}}return o},(c,o)=>({...c,result:$(P(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...J(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=ce(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var le=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",le,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(G).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>W(t,M().public.content.api.baseURL),we=re(se({driver:q()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>H(N(r),{initialParams:n,legacy:!0})}}let C=null,S=null;async function Ie(){return S?await S:C||(S=Ae(),C=await S),C}async function Ae(){const t=B(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Se(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Se as generateNavigation,Ie as useContentDatabase}; diff --git a/_nuxt/BXBBK3p1.js b/_nuxt/BXBBK3p1.js new file mode 100644 index 0000000..3a2d3a2 --- /dev/null +++ b/_nuxt/BXBBK3p1.js @@ -0,0 +1 @@ +import{_ as p}from"./Djecwb_v.js";import{u as h}from"./BqUvtMHT.js";import{q as u}from"./DEZhdWR8.js";import{f as m,h as w,c as o,a as t,F as f,r as y,i as v,o as r,t as s,b as d,w as _,d as n}from"./DiyP6pou.js";import"./BpUWW4O-.js";const x={class:"blog-outer"},b={class:"blog-wrapper"},g=t("div",{class:"blog-header"},[t("h1",null,"QAComet White Papers"),t("h2",{class:"subheader"},"Stay up to date with QA's impact on the startup world with our latest research.")],-1),k={class:"content-wrapper"},C={class:"blog-post-wrapper"},A={class:"date-wrapper"},D={class:"month"},N={class:"day"},B={class:"year"},V={class:"description-wrapper"},T=m({__name:"index",async setup(q){let a,i;const{data:l}=([a,i]=w(()=>h("white-papers",()=>u("/white-papers").only(["title","link","created","shortDescription"]).sort({"created.number":-1,$numeric:!0}).find())),a=await a,i(),a);return(F,L)=>{const c=p;return r(),o("div",x,[t("div",b,[g,t("div",k,[(r(!0),o(f,null,y(v(l),e=>(r(),o("div",C,[t("div",A,[t("div",D,s(e.created.month),1),t("div",N,s(e.created.day),1),t("div",B,s(e.created.year),1)]),t("div",V,[t("h3",null,[d(c,{to:e.link},{default:_(()=>[n(s(e.title),1)]),_:2},1032,["to"])]),t("p",null,[n(s(e.shortDescription)+" ",1),d(c,{class:"read",to:e.link},{default:_(()=>[n("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{T as default}; diff --git a/_nuxt/ti0Z0EYt.js b/_nuxt/BaQW3ob4.js similarity index 64% rename from _nuxt/ti0Z0EYt.js rename to _nuxt/BaQW3ob4.js index e045151..1821d4c 100644 --- a/_nuxt/ti0Z0EYt.js +++ b/_nuxt/BaQW3ob4.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function n(e,l){return r(),s("li",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./DiyP6pou.js";const c={};function n(e,l){return r(),s("li",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BamxlSPu.js b/_nuxt/BamxlSPu.js new file mode 100644 index 0000000..5210602 --- /dev/null +++ b/_nuxt/BamxlSPu.js @@ -0,0 +1 @@ +import{f as H,j as n,k as s,o as t,c as o,l as A,m as y,n as V,a as e,B as w,i as S,t as g,b as _,d as f,w as M,p as $,e as k,_ as x}from"./DiyP6pou.js";import{_ as L}from"./Djecwb_v.js";const B=["width","height","fill","transform"],b={key:0},z=e("path",{d:"M100,52H40A20,20,0,0,0,20,72v64a20,20,0,0,0,20,20H96v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,100,52Zm-4,80H44V76H96ZM216,52H156a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20h56v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,216,52Zm-4,80H160V76h52Z"},null,-1),N=[z],C={key:1},P=e("path",{d:"M108,72v72H40a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8h60A8,8,0,0,1,108,72Zm108-8H156a8,8,0,0,0-8,8v64a8,8,0,0,0,8,8h68V72A8,8,0,0,0,216,64Z",opacity:"0.2"},null,-1),j=e("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),F=[P,j],I={key:2},R=e("path",{d:"M116,72v88a48.05,48.05,0,0,1-48,48,8,8,0,0,1,0-16,32,32,0,0,0,32-32v-8H40a16,16,0,0,1-16-16V72A16,16,0,0,1,40,56h60A16,16,0,0,1,116,72ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Z"},null,-1),U=[R],q={key:3},E=e("path",{d:"M100,58H40A14,14,0,0,0,26,72v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,100,58Zm2,80H40a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2ZM216,58H156a14,14,0,0,0-14,14v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,216,58Zm2,80H156a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2Z"},null,-1),D=[E],Q={key:4},T=e("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),W=[T],G={key:5},O=e("path",{d:"M100,60H40A12,12,0,0,0,28,72v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,100,60Zm4,80H40a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM216,60H156a12,12,0,0,0-12,12v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,216,60Zm4,80H156a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4Z"},null,-1),J=[O],K={name:"PhQuotes"},X=H({...K,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(a){const r=a,h=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),c=n("mirrored",!1),l=s(()=>r.weight??h),i=s(()=>r.size??u),m=s(()=>r.color??v),p=s(()=>r.mirrored!==void 0?r.mirrored?"scale(-1, 1)":void 0:c?"scale(-1, 1)":void 0);return(d,Z)=>(t(),o("svg",V({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:i.value,height:i.value,fill:m.value,transform:p.value},d.$attrs),[A(d.$slots,"default"),l.value==="bold"?(t(),o("g",b,N)):l.value==="duotone"?(t(),o("g",C,F)):l.value==="fill"?(t(),o("g",I,U)):l.value==="light"?(t(),o("g",q,D)):l.value==="regular"?(t(),o("g",Q,W)):l.value==="thin"?(t(),o("g",G,J)):y("",!0)],16,B))}}),Y=["width","height","fill","transform"],e0={key:0},a0=e("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},null,-1),t0=[a0],o0={key:1},l0=e("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"},null,-1),r0=e("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"},null,-1),s0=[l0,r0],n0={key:2},i0=e("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),h0=[i0],c0={key:3},d0=e("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"},null,-1),u0=[d0],v0={key:4},m0=e("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),p0=[m0],g0={key:5},_0=e("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"},null,-1),H0=[_0],y0={name:"PhArrowRight"},A0=H({...y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(a){const r=a,h=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),c=n("mirrored",!1),l=s(()=>r.weight??h),i=s(()=>r.size??u),m=s(()=>r.color??v),p=s(()=>r.mirrored!==void 0?r.mirrored?"scale(-1, 1)":void 0:c?"scale(-1, 1)":void 0);return(d,Z)=>(t(),o("svg",V({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:i.value,height:i.value,fill:m.value,transform:p.value},d.$attrs),[A(d.$slots,"default"),l.value==="bold"?(t(),o("g",e0,t0)):l.value==="duotone"?(t(),o("g",o0,s0)):l.value==="fill"?(t(),o("g",n0,h0)):l.value==="light"?(t(),o("g",c0,u0)):l.value==="regular"?(t(),o("g",v0,p0)):l.value==="thin"?(t(),o("g",g0,H0)):y("",!0)],16,Y))}}),V0=a=>($("data-v-88349176"),a=a(),k(),a),Z0={class:"testimonial-wrapper"},w0={class:"left"},S0={class:"image-wrapper"},f0=["href"],M0={class:"right"},$0={class:"text-wrapper"},k0={class:"text"},x0={class:"name"},L0=["href"],B0={key:0,class:"see-more-outer"},b0=V0(()=>e("span",{class:"see-more-text"},"Read Our Case Study",-1)),z0=H({__name:"Testimonial",props:{image:String,imageAlt:String,company:String,companyUrl:String,person:String,personUrl:String,testimonial:String,caseStudy:String},setup(a){const r=a,h=s(()=>({"background-image":'url("'+r.image+'")'}));return(u,v)=>{const c=X,l=A0,i=L;return t(),o("div",Z0,[e("div",w0,[e("div",S0,[e("div",{class:"image-container",style:w(S(h))},null,4)]),e("a",{class:"brand-wrapper",href:a.companyUrl},g(a.company),9,f0)]),e("div",M0,[e("div",$0,[_(c,{color:"#F5F6F1"}),e("div",k0,[e("span",null,g(a.testimonial),1),e("span",x0,[f(" — "),e("a",{href:a.personUrl},g(a.person),9,L0)])])]),a.caseStudy?(t(),o("div",B0,[_(i,{to:a.caseStudy,class:"see-more-wrapper"},{default:M(()=>[b0,e("span",null,[_(l)])]),_:1},8,["to"])])):y("",!0)])])}}}),P0=x(z0,[["__scopeId","data-v-88349176"]]);export{A0 as F,X as G,P0 as _}; diff --git a/_nuxt/DxghXiKV.js b/_nuxt/BasclreZ.js similarity index 64% rename from _nuxt/DxghXiKV.js rename to _nuxt/BasclreZ.js index 2fc4b74..ef9a2fa 100644 --- a/_nuxt/DxghXiKV.js +++ b/_nuxt/BasclreZ.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./DiyP6pou.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/Bh_R0szF.js b/_nuxt/Bh_R0szF.js new file mode 100644 index 0000000..2476b38 --- /dev/null +++ b/_nuxt/Bh_R0szF.js @@ -0,0 +1 @@ +import{o as a,c as t,a as s,f as i,m as c,g as o,i as l,t as d,l as h}from"./DiyP6pou.js";const r={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},u=s("path",{fill:"#f5de19",d:"M18.774 19.7a3.73 3.73 0 0 0 3.376 2.078c1.418 0 2.324-.709 2.324-1.688c0-1.173-.931-1.589-2.491-2.272l-.856-.367c-2.469-1.052-4.11-2.37-4.11-5.156c0-2.567 1.956-4.52 5.012-4.52A5.06 5.06 0 0 1 26.9 10.52l-2.665 1.711a2.33 2.33 0 0 0-2.2-1.467a1.49 1.49 0 0 0-1.638 1.467c0 1.027.636 1.442 2.1 2.078l.856.366c2.908 1.247 4.549 2.518 4.549 5.376c0 3.081-2.42 4.769-5.671 4.769a6.58 6.58 0 0 1-6.236-3.5ZM6.686 20c.538.954 1.027 1.76 2.2 1.76c1.124 0 1.834-.44 1.834-2.15V7.975h3.422v11.683c0 3.543-2.078 5.156-5.11 5.156A5.31 5.31 0 0 1 3.9 21.688Z"},null,-1),_=[u];function m(e,n){return a(),t("svg",r,[..._])}const g={name:"vscode-icons-file-type-js",render:m},f={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},p=s("path",{fill:"#f5de19",d:"M4.014 14.976a2.5 2.5 0 0 0 1.567-.518a2.38 2.38 0 0 0 .805-1.358a15.3 15.3 0 0 0 .214-2.944q.012-2.085.075-2.747a5.2 5.2 0 0 1 .418-1.686a3 3 0 0 1 .755-1.018A3.05 3.05 0 0 1 9 4.125A6.8 6.8 0 0 1 10.544 4h.7v1.96h-.387a2.34 2.34 0 0 0-1.723.468a3.4 3.4 0 0 0-.425 2.092a36 36 0 0 1-.137 4.133a4.7 4.7 0 0 1-.768 2.06A4.6 4.6 0 0 1 6.1 16a3.8 3.8 0 0 1 1.992 1.754a8.9 8.9 0 0 1 .618 3.865q0 2.435.05 2.9a1.76 1.76 0 0 0 .504 1.181a2.64 2.64 0 0 0 1.592.337h.387V28h-.7a5.7 5.7 0 0 1-1.773-.2a2.97 2.97 0 0 1-1.324-.93a3.35 3.35 0 0 1-.681-1.63a24 24 0 0 1-.165-3.234a16.5 16.5 0 0 0-.214-3.106a2.4 2.4 0 0 0-.805-1.361a2.5 2.5 0 0 0-1.567-.524Zm23.972 2.035a2.5 2.5 0 0 0-1.567.524a2.4 2.4 0 0 0-.805 1.361a16.5 16.5 0 0 0-.212 3.109a24 24 0 0 1-.169 3.234a3.35 3.35 0 0 1-.681 1.63a2.97 2.97 0 0 1-1.324.93a5.7 5.7 0 0 1-1.773.2h-.7V26.04h.387a2.64 2.64 0 0 0 1.592-.337a1.76 1.76 0 0 0 .506-1.186q.05-.462.05-2.9a8.9 8.9 0 0 1 .618-3.865A3.8 3.8 0 0 1 25.9 16a4.6 4.6 0 0 1-1.7-1.286a4.7 4.7 0 0 1-.768-2.06a36 36 0 0 1-.137-4.133a3.4 3.4 0 0 0-.425-2.092a2.34 2.34 0 0 0-1.723-.468h-.387V4h.7a6.8 6.8 0 0 1 1.54.125a3.05 3.05 0 0 1 1.149.581a3 3 0 0 1 .755 1.018a5.2 5.2 0 0 1 .418 1.686q.062.662.075 2.747a15.3 15.3 0 0 0 .212 2.947a2.38 2.38 0 0 0 .805 1.355a2.5 2.5 0 0 0 1.567.518Z"},null,-1),v=[p];function y(e,n){return a(),t("svg",f,[...v])}const w={name:"vscode-icons-file-type-json",render:y},$={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},V=s("path",{fill:"#007acc",d:"M23.827 8.243a4.4 4.4 0 0 1 2.223 1.281a6 6 0 0 1 .852 1.143c.011.045-1.534 1.083-2.471 1.662c-.034.023-.169-.124-.322-.35a2.01 2.01 0 0 0-1.67-1c-1.077-.074-1.771.49-1.766 1.433a1.3 1.3 0 0 0 .153.666c.237.49.677.784 2.059 1.383c2.544 1.095 3.636 1.817 4.31 2.843a5.16 5.16 0 0 1 .416 4.333a4.76 4.76 0 0 1-3.932 2.815a11 11 0 0 1-2.708-.028a6.53 6.53 0 0 1-3.616-1.884a6.3 6.3 0 0 1-.926-1.371a3 3 0 0 1 .327-.208c.158-.09.756-.434 1.32-.761l1.024-.6l.214.312a4.8 4.8 0 0 0 1.35 1.292a3.3 3.3 0 0 0 3.458-.175a1.545 1.545 0 0 0 .2-1.974c-.276-.395-.84-.727-2.443-1.422a8.8 8.8 0 0 1-3.349-2.055a4.7 4.7 0 0 1-.976-1.777a7.1 7.1 0 0 1-.062-2.268a4.33 4.33 0 0 1 3.644-3.374a9 9 0 0 1 2.691.084m-8.343 1.483l.011 1.454h-4.63v13.148H7.6V11.183H2.97V9.755a14 14 0 0 1 .04-1.466c.017-.023 2.832-.034 6.245-.028l6.211.017Z"},null,-1),x=[V];function B(e,n){return a(),t("svg",$,[...x])}const k={name:"vscode-icons-file-type-typescript",render:B},A={class:"code-outer"},Z={key:0,class:"code-title"},S={class:"icon-wrapper"},M={key:0,xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 32 32"},j=s("path",{fill:"#79B8FF",d:"M27.5 5.5h-9.3l-2.1 4.2H4.4v16.8h25.2v-21Zm0 4.2h-8.2l1.1-2.1h7.1Z"},null,-1),q=[j],F={class:"file-name"},I=i({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(e){return(n,C)=>(a(),t("div",A,[e.filename?(a(),t("div",Z,[s("div",S,[e.language==="console"?(a(),t("svg",M,q)):c("",!0),e.language==="json"?(a(),o(l(w),{key:1})):c("",!0),e.language==="js"?(a(),o(l(g),{key:2})):c("",!0),e.language==="ts"?(a(),o(l(k),{key:3})):c("",!0)]),s("span",F,d(e.filename),1)])):c("",!0),h(n.$slots,"default")]))}});export{I as _}; diff --git a/_nuxt/BlS8upJP.js b/_nuxt/BlS8upJP.js deleted file mode 100644 index 2f58f9a..0000000 --- a/_nuxt/BlS8upJP.js +++ /dev/null @@ -1,29 +0,0 @@ -function __vite__mapDeps(indexes) { - if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CCgfT4mO.js","./CZcQ1mDI.js","./CFzORWKb.js","./Testimonial.BamnguDL.css","./BneHlRLI.js","./BxiCSTFT.js","./DQv0CMQg.js","./BsYmvPZw.js","./BECgZIvk.js","./CRh1_mKz.js","./DF1VbFfH.js","./maW11VfC.js","./BMo7zexA.js","./DS-4onvx.js","./Czu_W2CL.js","./index.yI_g7lt1.css","./ZkJgmw7I.js","./BqBwjWqG.js","./Cn1tIV_T.js","./BK5dMROA.js","./Cz78Sion.js","./Bse8ef0b.js","./BzoHbl1P.js","./CSXQV5-h.js","./BnwjeOpX.js","./BnI7OW5X.js","./ProseCode.DPIjDHas.css","./BRsYUypn.js","./X2wNORNR.js","./9UJQMWko.js","./dGARKcZ6.js","./C17h_atD.js","./J2jEMbcE.js","./ProsePre.CchFRBtv.css","./DkuQMAl2.js","./Dhont5qJ.js","./default.C6rz2lqQ.css","./R-gFWJPL.js","./error-404.CyhgO96i.css","./B0VAc3Z5.js","./error-500.Cph627d6.css"] - } - return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) -} -/** -* @vue/shared v3.4.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function $o(e,t){const n=new Set(e.split(","));return t?r=>n.has(r.toLowerCase()):r=>n.has(r)}const pe={},Wt=[],De=()=>{},Ja=()=>!1,Ln=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),jo=e=>e.startsWith("onUpdate:"),_e=Object.assign,Do=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Qa=Object.prototype.hasOwnProperty,ne=(e,t)=>Qa.call(e,t),z=Array.isArray,Kt=e=>On(e)==="[object Map]",qi=e=>On(e)==="[object Set]",Xa=e=>On(e)==="[object RegExp]",X=e=>typeof e=="function",me=e=>typeof e=="string",rn=e=>typeof e=="symbol",ce=e=>e!==null&&typeof e=="object",Fo=e=>(ce(e)||X(e))&&X(e.then)&&X(e.catch),zi=Object.prototype.toString,On=e=>zi.call(e),Ya=e=>On(e).slice(8,-1),Gi=e=>On(e)==="[object Object]",Bo=e=>me(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qt=$o(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),gr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Za=/-(\w)/g,Ze=gr(e=>e.replace(Za,(t,n)=>n?n.toUpperCase():"")),ec=/\B([A-Z])/g,on=gr(e=>e.replace(ec,"-$1").toLowerCase()),mr=gr(e=>e.charAt(0).toUpperCase()+e.slice(1)),Lr=gr(e=>e?`on${mr(e)}`:""),Et=(e,t)=>!Object.is(e,t),hn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},tc=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ji=e=>{const t=me(e)?Number(e):NaN;return isNaN(t)?e:t};let Ts;const Qi=()=>Ts||(Ts=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function yr(e){if(z(e)){const t={};for(let n=0;n{if(n){const r=n.split(rc);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function _r(e){let t="";if(me(e))t=e;else if(z(e))for(let n=0;nme(e)?e:e==null?"":z(e)||ce(e)&&(e.toString===zi||!X(e.toString))?JSON.stringify(e,Yi,2):String(e),Yi=(e,t)=>t&&t.__v_isRef?Yi(e,t.value):Kt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[Or(r,s)+" =>"]=o,n),{})}:qi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Or(n))}:rn(t)?Or(t):ce(t)&&!z(t)&&!Gi(t)?String(t):t,Or=(e,t="")=>{var n;return rn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.4.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Ne;class Zi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ne,!t&&Ne&&(this.index=(Ne.scopes||(Ne.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ne;try{return Ne=this,t()}finally{Ne=n}}}on(){Ne=this}off(){Ne=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Nt()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=vt,n=xt;try{return vt=!0,xt=this,this._runnings++,Cs(this),this.fn()}finally{As(this),this._runnings--,xt=n,vt=t}}stop(){var t;this.active&&(Cs(this),As(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function dc(e){return e.value}function Cs(e){e._trackId++,e._depsLength=0}function As(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},nr=new WeakMap,kt=Symbol(""),io=Symbol("");function Ie(e,t,n){if(vt&&xt){let r=nr.get(e);r||nr.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=sl(()=>r.delete(n))),rl(xt,o)}}function nt(e,t,n,r,o,s){const i=nr.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&z(e)){const a=Number(r);i.forEach((u,c)=>{(c==="length"||!rn(c)&&c>=a)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":z(e)?Bo(n)&&l.push(i.get("length")):(l.push(i.get(kt)),Kt(e)&&l.push(i.get(io)));break;case"delete":z(e)||(l.push(i.get(kt)),Kt(e)&&l.push(i.get(io)));break;case"set":Kt(e)&&l.push(i.get(kt));break}Uo();for(const a of l)a&&ol(a,4);Wo()}function hc(e,t){var n;return(n=nr.get(e))==null?void 0:n.get(t)}const pc=$o("__proto__,__v_isRef,__isVue"),il=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(rn)),Ss=gc();function gc(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=re(this);for(let s=0,i=this.length;s{e[t]=function(...n){Mt(),Uo();const r=re(this)[t].apply(this,n);return Wo(),Nt(),r}}),e}function mc(e){const t=re(this);return Ie(t,"has",e),t.hasOwnProperty(e)}class ll{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?xc:fl:s?ul:cl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=z(t);if(!o){if(i&&ne(Ss,n))return Reflect.get(Ss,n,r);if(n==="hasOwnProperty")return mc}const l=Reflect.get(t,n,r);return(rn(n)?il.has(n):pc(n))||(o||Ie(t,"get",n),s)?l:Pe(l)?i&&Bo(n)?l:l.value:ce(l)?o?dl(l):wt(l):l}}class al extends ll{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const a=It(s);if(!rr(r)&&!It(r)&&(s=re(s),r=re(r)),!z(t)&&Pe(s)&&!Pe(r))return a?!1:(s.value=r,!0)}const i=z(t)&&Bo(n)?Number(n)e,vr=e=>Reflect.getPrototypeOf(e);function Dn(e,t,n=!1,r=!1){e=e.__v_raw;const o=re(e),s=re(t);n||(Et(t,s)&&Ie(o,"get",t),Ie(o,"get",s));const{has:i}=vr(o),l=r?Ko:n?Go:wn;if(i.call(o,t))return l(e.get(t));if(i.call(o,s))return l(e.get(s));e!==o&&e.get(t)}function Fn(e,t=!1){const n=this.__v_raw,r=re(n),o=re(e);return t||(Et(e,o)&&Ie(r,"has",e),Ie(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Bn(e,t=!1){return e=e.__v_raw,!t&&Ie(re(e),"iterate",kt),Reflect.get(e,"size",e)}function xs(e){e=re(e);const t=re(this);return vr(t).has.call(t,e)||(t.add(e),nt(t,"add",e,e)),this}function ks(e,t){t=re(t);const n=re(this),{has:r,get:o}=vr(n);let s=r.call(n,e);s||(e=re(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?Et(t,i)&&nt(n,"set",e,t):nt(n,"add",e,t),this}function Ls(e){const t=re(this),{has:n,get:r}=vr(t);let o=n.call(t,e);o||(e=re(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&nt(t,"delete",e,void 0),s}function Os(){const e=re(this),t=e.size!==0,n=e.clear();return t&&nt(e,"clear",void 0,void 0),n}function Vn(e,t){return function(r,o){const s=this,i=s.__v_raw,l=re(i),a=t?Ko:e?Go:wn;return!e&&Ie(l,"iterate",kt),i.forEach((u,c)=>r.call(o,a(u),a(c),s))}}function Un(e,t,n){return function(...r){const o=this.__v_raw,s=re(o),i=Kt(s),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,u=o[e](...r),c=n?Ko:t?Go:wn;return!t&&Ie(s,"iterate",a?io:kt),{next(){const{value:f,done:d}=u.next();return d?{value:f,done:d}:{value:l?[c(f[0]),c(f[1])]:c(f),done:d}},[Symbol.iterator](){return this}}}}function lt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Ec(){const e={get(s){return Dn(this,s)},get size(){return Bn(this)},has:Fn,add:xs,set:ks,delete:Ls,clear:Os,forEach:Vn(!1,!1)},t={get(s){return Dn(this,s,!1,!0)},get size(){return Bn(this)},has:Fn,add:xs,set:ks,delete:Ls,clear:Os,forEach:Vn(!1,!0)},n={get(s){return Dn(this,s,!0)},get size(){return Bn(this,!0)},has(s){return Fn.call(this,s,!0)},add:lt("add"),set:lt("set"),delete:lt("delete"),clear:lt("clear"),forEach:Vn(!0,!1)},r={get(s){return Dn(this,s,!0,!0)},get size(){return Bn(this,!0)},has(s){return Fn.call(this,s,!0)},add:lt("add"),set:lt("set"),delete:lt("delete"),clear:lt("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Un(s,!1,!1),n[s]=Un(s,!0,!1),t[s]=Un(s,!1,!0),r[s]=Un(s,!0,!0)}),[e,n,t,r]}const[wc,Rc,Pc,Tc]=Ec();function qo(e,t){const n=t?e?Tc:Pc:e?Rc:wc;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ne(n,o)&&o in r?n:r,o,s)}const Cc={get:qo(!1,!1)},Ac={get:qo(!1,!0)},Sc={get:qo(!0,!1)},cl=new WeakMap,ul=new WeakMap,fl=new WeakMap,xc=new WeakMap;function kc(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Lc(e){return e.__v_skip||!Object.isExtensible(e)?0:kc(Ya(e))}function wt(e){return It(e)?e:zo(e,!1,_c,Cc,cl)}function In(e){return zo(e,!1,bc,Ac,ul)}function dl(e){return zo(e,!0,vc,Sc,fl)}function zo(e,t,n,r,o){if(!ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=Lc(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return o.set(e,l),l}function zt(e){return It(e)?zt(e.__v_raw):!!(e&&e.__v_isReactive)}function It(e){return!!(e&&e.__v_isReadonly)}function rr(e){return!!(e&&e.__v_isShallow)}function hl(e){return zt(e)||It(e)}function re(e){const t=e&&e.__v_raw;return t?re(t):e}function pl(e){return Object.isExtensible(e)&&tr(e,"__v_skip",!0),e}const wn=e=>ce(e)?wt(e):e,Go=e=>ce(e)?dl(e):e;class gl{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Vo(()=>t(this._value),()=>pn(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=re(this);return(!t._cacheable||t.effect.dirty)&&Et(t._value,t._value=t.effect.run())&&pn(t,4),Jo(t),t.effect._dirtyLevel>=2&&pn(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function Oc(e,t,n=!1){let r,o;const s=X(e);return s?(r=e,o=De):(r=e.get,o=e.set),new gl(r,o,s||!o,n)}function Jo(e){var t;vt&&xt&&(e=re(e),rl(xt,(t=e.dep)!=null?t:e.dep=sl(()=>e.dep=void 0,e instanceof gl?e:void 0)))}function pn(e,t=4,n){e=re(e);const r=e.dep;r&&ol(r,t)}function Pe(e){return!!(e&&e.__v_isRef===!0)}function qe(e){return ml(e,!1)}function Rn(e){return ml(e,!0)}function ml(e,t){return Pe(e)?e:new Ic(e,t)}class Ic{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:re(t),this._value=n?t:wn(t)}get value(){return Jo(this),this._value}set value(t){const n=this.__v_isShallow||rr(t)||It(t);t=n?t:re(t),Et(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:wn(t),pn(this,4))}}function ue(e){return Pe(e)?e.value:e}const Hc={get:(e,t,n)=>ue(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Pe(o)&&!Pe(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function yl(e){return zt(e)?e:new Proxy(e,Hc)}class Mc{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Jo(this),()=>pn(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function _m(e){return new Mc(e)}function vm(e){const t=z(e)?new Array(e.length):{};for(const n in e)t[n]=_l(e,n);return t}class Nc{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return hc(re(this._object),this._key)}}class $c{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function jc(e,t,n){return Pe(e)?e:X(e)?new $c(e):ce(e)&&arguments.length>1?_l(e,t,n):qe(e)}function _l(e,t,n){const r=e[t];return Pe(r)?r:new Nc(e,t,n)}/** -* @vue/runtime-core v3.4.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function bt(e,t,n,r){try{return r?e(...r):e()}catch(o){sn(o,t,n)}}function Be(e,t,n,r){if(X(e)){const s=bt(e,t,n,r);return s&&Fo(s)&&s.catch(i=>{sn(i,t,n)}),s}const o=[];for(let s=0;s>>1,o=Re[r],s=Tn(o);sXe&&Re.splice(t,1)}function ao(e){z(e)?Gt.push(...e):(!dt||!dt.includes(e,e.allowRecurse?St+1:St))&&Gt.push(e),bl()}function Is(e,t,n=Pn?Xe+1:0){for(;nTn(n)-Tn(r));if(Gt.length=0,dt){dt.push(...t);return}for(dt=t,St=0;Ste.id==null?1/0:e.id,Vc=(e,t)=>{const n=Tn(e)-Tn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function El(e){lo=!1,Pn=!0,Re.sort(Vc);try{for(Xe=0;Xeme(g)?g.trim():g)),f&&(o=n.map(tc))}let l,a=r[l=Lr(t)]||r[l=Lr(Ze(t))];!a&&s&&(a=r[l=Lr(on(t))]),a&&Be(a,e,6,o);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Be(u,e,6,o)}}function wl(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},l=!1;if(!X(e)){const a=u=>{const c=wl(u,t,!0);c&&(l=!0,_e(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(ce(e)&&r.set(e,null),null):(z(s)?s.forEach(a=>i[a]=null):_e(i,s),ce(e)&&r.set(e,i),i)}function Er(e,t){return!e||!Ln(t)?!1:(t=t.slice(2).replace(/Once$/,""),ne(e,t[0].toLowerCase()+t.slice(1))||ne(e,on(t))||ne(e,t))}let Ee=null,wr=null;function sr(e){const t=Ee;return Ee=e,wr=e&&e.type.__scopeId||null,t}function bm(e){wr=e}function Em(){wr=null}function Xo(e,t=Ee,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&qs(-1);const s=sr(t);let i;try{i=e(...o)}finally{sr(s),r._d&&qs(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Ir(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:l,attrs:a,emit:u,render:c,renderCache:f,data:d,setupState:g,ctx:v,inheritAttrs:P}=e;let k,A;const y=sr(e);try{if(n.shapeFlag&4){const _=o||r,w=_;k=je(c.call(w,_,f,s,g,d,v)),A=a}else{const _=t;k=je(_.length>1?_(s,{attrs:a,slots:l,emit:u}):_(s,null)),A=t.props?a:Kc(a)}}catch(_){yn.length=0,sn(_,e,1),k=fe(Se)}let m=k;if(A&&P!==!1){const _=Object.keys(A),{shapeFlag:w}=m;_.length&&w&7&&(i&&_.some(jo)&&(A=qc(A,i)),m=rt(m,A))}return n.dirs&&(m=rt(m),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),k=m,sr(y),k}function Wc(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Ln(n))&&((t||(t={}))[n]=e[n]);return t},qc=(e,t)=>{const n={};for(const r in e)(!jo(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function zc(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:l,patchFlag:a}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?Hs(r,i,u):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fe.__isSuspense;let co=0;const Jc={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,l,a,u){if(e==null)Qc(t,n,r,o,s,i,l,a,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}Xc(e,t,n,r,o,i,l,a,u)}},hydrate:Yc,create:ts,normalize:Zc},es=Jc;function Cn(e,t){const n=e.props&&e.props[t];X(n)&&n()}function Qc(e,t,n,r,o,s,i,l,a){const{p:u,o:{createElement:c}}=a,f=c("div"),d=e.suspense=ts(e,o,r,t,f,n,s,i,l,a);u(null,d.pendingBranch=e.ssContent,f,null,r,d,s,i),d.deps>0?(Cn(e,"onPending"),Cn(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),Jt(d,e.ssFallback)):d.resolve(!1,!0)}function Xc(e,t,n,r,o,s,i,l,{p:a,um:u,o:{createElement:c}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,g=t.ssFallback,{activeBranch:v,pendingBranch:P,isInFallback:k,isHydrating:A}=f;if(P)f.pendingBranch=d,Ke(d,P)?(a(P,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0?f.resolve():k&&(A||(a(v,g,n,r,o,null,s,i,l),Jt(f,g)))):(f.pendingId=co++,A?(f.isHydrating=!1,f.activeBranch=P):u(P,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),k?(a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0?f.resolve():(a(v,g,n,r,o,null,s,i,l),Jt(f,g))):v&&Ke(d,v)?(a(v,d,n,r,o,f,s,i,l),f.resolve(!0)):(a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0&&f.resolve()));else if(v&&Ke(d,v))a(v,d,n,r,o,f,s,i,l),Jt(f,d);else if(Cn(t,"onPending"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=co++,a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0)f.resolve();else{const{timeout:y,pendingId:m}=f;y>0?setTimeout(()=>{f.pendingId===m&&f.fallback(g)},y):y===0&&f.fallback(g)}}function ts(e,t,n,r,o,s,i,l,a,u,c=!1){const{p:f,m:d,um:g,n:v,o:{parentNode:P,remove:k}}=u;let A;const y=eu(e);y&&t!=null&&t.pendingBranch&&(A=t.pendingId,t.deps++);const m=e.props?Ji(e.props.timeout):void 0,_=s,w={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:co++,timeout:typeof m=="number"?m:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(E=!1,L=!1){const{vnode:S,activeBranch:$,pendingBranch:N,pendingId:Q,effects:H,parentComponent:G,container:le}=w;let ae=!1;w.isHydrating?w.isHydrating=!1:E||(ae=$&&N.transition&&N.transition.mode==="out-in",ae&&($.transition.afterLeave=()=>{Q===w.pendingId&&(d(N,le,s===_?v($):s,0),ao(H))}),$&&(P($.el)!==w.hiddenContainer&&(s=v($)),g($,G,w,!0)),ae||d(N,le,s,0)),Jt(w,N),w.pendingBranch=null,w.isInFallback=!1;let V=w.parent,Z=!1;for(;V;){if(V.pendingBranch){V.effects.push(...H),Z=!0;break}V=V.parent}!Z&&!ae&&ao(H),w.effects=[],y&&t&&t.pendingBranch&&A===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),Cn(S,"onResolve")},fallback(E){if(!w.pendingBranch)return;const{vnode:L,activeBranch:S,parentComponent:$,container:N,namespace:Q}=w;Cn(L,"onFallback");const H=v(S),G=()=>{w.isInFallback&&(f(null,E,N,H,$,null,Q,l,a),Jt(w,E))},le=E.transition&&E.transition.mode==="out-in";le&&(S.transition.afterLeave=G),w.isInFallback=!0,g(S,$,null,!0),le||G()},move(E,L,S){w.activeBranch&&d(w.activeBranch,E,L,S),w.container=E},next(){return w.activeBranch&&v(w.activeBranch)},registerDep(E,L){const S=!!w.pendingBranch;S&&w.deps++;const $=E.vnode.el;E.asyncDep.catch(N=>{sn(N,E,0)}).then(N=>{if(E.isUnmounted||w.isUnmounted||w.pendingId!==E.suspenseId)return;E.asyncResolved=!0;const{vnode:Q}=E;_o(E,N,!1),$&&(Q.el=$);const H=!$&&E.subTree.el;L(E,Q,P($||E.subTree.el),$?null:v(E.subTree),w,i,a),H&&k(H),Yo(E,Q.el),S&&--w.deps===0&&w.resolve()})},unmount(E,L){w.isUnmounted=!0,w.activeBranch&&g(w.activeBranch,n,E,L),w.pendingBranch&&g(w.pendingBranch,n,E,L)}};return w}function Yc(e,t,n,r,o,s,i,l,a){const u=t.suspense=ts(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,l,!0),c=a(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),c}function Zc(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Ns(r?n.default:n),e.ssFallback=r?Ns(n.fallback):fe(Se)}function Ns(e){let t;if(X(e)){const n=Zt&&e._c;n&&(e._d=!1,Ye()),e=e(),n&&(e._d=!0,t=Fe,Gl())}return z(e)&&(e=Wc(e)),e=je(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Cl(e,t){t&&t.pendingBranch?z(e)?t.effects.push(...e):t.effects.push(e):ao(e)}function Jt(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Yo(r,o))}function eu(e){var t;return((t=e.props)==null?void 0:t.suspensible)!=null&&e.props.suspensible!==!1}const tu=Symbol.for("v-scx"),nu=()=>Ae(tu);function Rm(e,t){return ns(e,null,t)}const Wn={};function Qt(e,t,n){return ns(e,t,n)}function ns(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:l}=pe){if(t&&s){const E=t;t=(...L)=>{E(...L),w()}}const a=ye,u=E=>r===!0?E:Vt(E,r===!1?1:void 0);let c,f=!1,d=!1;if(Pe(e)?(c=()=>e.value,f=rr(e)):zt(e)?(c=()=>u(e),f=!0):z(e)?(d=!0,f=e.some(E=>zt(E)||rr(E)),c=()=>e.map(E=>{if(Pe(E))return E.value;if(zt(E))return u(E);if(X(E))return bt(E,a,2)})):X(e)?t?c=()=>bt(e,a,2):c=()=>(g&&g(),Be(e,a,3,[v])):c=De,t&&r){const E=c;c=()=>Vt(E())}let g,v=E=>{g=m.onStop=()=>{bt(E,a,4),g=m.onStop=void 0}},P;if(Nn)if(v=De,t?n&&Be(t,a,3,[c(),d?[]:void 0,v]):c(),o==="sync"){const E=nu();P=E.__watcherHandles||(E.__watcherHandles=[])}else return De;let k=d?new Array(e.length).fill(Wn):Wn;const A=()=>{if(!(!m.active||!m.dirty))if(t){const E=m.run();(r||f||(d?E.some((L,S)=>Et(L,k[S])):Et(E,k)))&&(g&&g(),Be(t,a,3,[E,k===Wn?void 0:d&&k[0]===Wn?[]:k,v]),k=E)}else m.run()};A.allowRecurse=!!t;let y;o==="sync"?y=A:o==="post"?y=()=>be(A,a&&a.suspense):(A.pre=!0,a&&(A.id=a.uid),y=()=>br(A));const m=new Vo(c,De,y),_=el(),w=()=>{m.stop(),_&&Do(_.effects,m)};return t?n?A():k=m.run():o==="post"?be(m.run.bind(m),a&&a.suspense):m.run(),P&&P.push(w),w}function ru(e,t,n){const r=this.proxy,o=me(e)?e.includes(".")?Al(r,e):()=>r[e]:e.bind(r,r);let s;X(t)?s=t:(s=t.handler,n=t);const i=Ht(this),l=ns(o,s.bind(r),n);return i(),l}function Al(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o0){if(n>=t)return e;n++}if(r=r||new Set,r.has(e))return e;if(r.add(e),Pe(e))Vt(e.value,t,n,r);else if(z(e))for(let o=0;o{Vt(o,t,n,r)});else if(Gi(e))for(const o in e)Vt(e[o],t,n,r);return e}function Qe(e,t,n,r){const o=e.dirs,s=t&&t.dirs;for(let i=0;i{e.isMounted=!0}),os(()=>{e.isUnmounting=!0}),e}const $e=[Function,Array],Sl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$e,onEnter:$e,onAfterEnter:$e,onEnterCancelled:$e,onBeforeLeave:$e,onLeave:$e,onAfterLeave:$e,onLeaveCancelled:$e,onBeforeAppear:$e,onAppear:$e,onAfterAppear:$e,onAppearCancelled:$e},su={name:"BaseTransition",props:Sl,setup(e,{slots:t}){const n=Mn(),r=ou();return()=>{const o=t.default&&kl(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const d of o)if(d.type!==Se){s=d;break}}const i=re(e),{mode:l}=i;if(r.isLeaving)return Hr(s);const a=$s(s);if(!a)return Hr(s);const u=uo(a,i,r,n);ir(a,u);const c=n.subTree,f=c&&$s(c);if(f&&f.type!==Se&&!Ke(a,f)){const d=uo(f,i,r,n);if(ir(f,d),l==="out-in")return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Hr(s);l==="in-out"&&a.type!==Se&&(d.delayLeave=(g,v,P)=>{const k=xl(r,f);k[String(f.key)]=f,g[ht]=()=>{v(),g[ht]=void 0,delete u.delayedLeave},u.delayedLeave=P})}return s}}},iu=su;function xl(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function uo(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:f,onLeave:d,onAfterLeave:g,onLeaveCancelled:v,onBeforeAppear:P,onAppear:k,onAfterAppear:A,onAppearCancelled:y}=t,m=String(e.key),_=xl(n,e),w=(S,$)=>{S&&Be(S,r,9,$)},E=(S,$)=>{const N=$[1];w(S,$),z(S)?S.every(Q=>Q.length<=1)&&N():S.length<=1&&N()},L={mode:s,persisted:i,beforeEnter(S){let $=l;if(!n.isMounted)if(o)$=P||l;else return;S[ht]&&S[ht](!0);const N=_[m];N&&Ke(e,N)&&N.el[ht]&&N.el[ht](),w($,[S])},enter(S){let $=a,N=u,Q=c;if(!n.isMounted)if(o)$=k||a,N=A||u,Q=y||c;else return;let H=!1;const G=S[Kn]=le=>{H||(H=!0,le?w(Q,[S]):w(N,[S]),L.delayedLeave&&L.delayedLeave(),S[Kn]=void 0)};$?E($,[S,G]):G()},leave(S,$){const N=String(e.key);if(S[Kn]&&S[Kn](!0),n.isUnmounting)return $();w(f,[S]);let Q=!1;const H=S[ht]=G=>{Q||(Q=!0,$(),G?w(v,[S]):w(g,[S]),S[ht]=void 0,_[N]===e&&delete _[N])};_[N]=e,d?E(d,[S,H]):H()},clone(S){return uo(S,t,n,r)}};return L}function Hr(e){if(Hn(e))return e=rt(e),e.children=null,e}function $s(e){return Hn(e)?e.children?e.children[0]:void 0:e}function ir(e,t){e.shapeFlag&6&&e.component?ir(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function kl(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function ee(e){X(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:l}=e;let a=null,u,c=0;const f=()=>(c++,a=null,d()),d=()=>{let g;return a||(g=a=t().catch(v=>{if(v=v instanceof Error?v:new Error(String(v)),l)return new Promise((P,k)=>{l(v,()=>P(f()),()=>k(v),c+1)});throw v}).then(v=>g!==a&&a?a:(v&&(v.__esModule||v[Symbol.toStringTag]==="Module")&&(v=v.default),u=v,v)))};return ot({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return u},setup(){const g=ye;if(u)return()=>Mr(u,g);const v=y=>{a=null,sn(y,g,13,!r)};if(i&&g.suspense||Nn)return d().then(y=>()=>Mr(y,g)).catch(y=>(v(y),()=>r?fe(r,{error:y}):null));const P=qe(!1),k=qe(),A=qe(!!o);return o&&setTimeout(()=>{A.value=!1},o),s!=null&&setTimeout(()=>{if(!P.value&&!k.value){const y=new Error(`Async component timed out after ${s}ms.`);v(y),k.value=y}},s),d().then(()=>{P.value=!0,g.parent&&Hn(g.parent.vnode)&&(g.parent.effect.dirty=!0,br(g.parent.update))}).catch(y=>{v(y),k.value=y}),()=>{if(P.value&&u)return Mr(u,g);if(k.value&&r)return fe(r,{error:k.value});if(n&&!A.value)return fe(n)}}})}function Mr(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=fe(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Hn=e=>e.type.__isKeepAlive,lu={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Mn(),r=n.ctx;if(!r.renderer)return()=>{const y=t.default&&t.default();return y&&y.length===1?y[0]:y};const o=new Map,s=new Set;let i=null;const l=n.suspense,{renderer:{p:a,m:u,um:c,o:{createElement:f}}}=r,d=f("div");r.activate=(y,m,_,w,E)=>{const L=y.component;u(y,m,_,0,l),a(L.vnode,y,m,_,L,l,w,y.slotScopeIds,E),be(()=>{L.isDeactivated=!1,L.a&&hn(L.a);const S=y.props&&y.props.onVnodeMounted;S&&ke(S,L.parent,y)},l)},r.deactivate=y=>{const m=y.component;u(y,d,null,1,l),be(()=>{m.da&&hn(m.da);const _=y.props&&y.props.onVnodeUnmounted;_&&ke(_,m.parent,y),m.isDeactivated=!0},l)};function g(y){Nr(y),c(y,n,l,!0)}function v(y){o.forEach((m,_)=>{const w=vo(m.type);w&&(!y||!y(w))&&P(_)})}function P(y){const m=o.get(y);!i||!Ke(m,i)?g(m):i&&Nr(i),o.delete(y),s.delete(y)}Qt(()=>[e.include,e.exclude],([y,m])=>{y&&v(_=>fn(y,_)),m&&v(_=>!fn(m,_))},{flush:"post",deep:!0});let k=null;const A=()=>{k!=null&&o.set(k,$r(n.subTree))};return rs(A),Ol(A),os(()=>{o.forEach(y=>{const{subTree:m,suspense:_}=n,w=$r(m);if(y.type===w.type&&y.key===w.key){Nr(w);const E=w.component.da;E&&be(E,_);return}g(y)})}),()=>{if(k=null,!t.default)return null;const y=t.default(),m=y[0];if(y.length>1)return i=null,y;if(!en(m)||!(m.shapeFlag&4)&&!(m.shapeFlag&128))return i=null,m;let _=$r(m);const w=_.type,E=vo(Lt(_)?_.type.__asyncResolved||{}:w),{include:L,exclude:S,max:$}=e;if(L&&(!E||!fn(L,E))||S&&E&&fn(S,E))return i=_,m;const N=_.key==null?w:_.key,Q=o.get(N);return _.el&&(_=rt(_),m.shapeFlag&128&&(m.ssContent=_)),k=N,Q?(_.el=Q.el,_.component=Q.component,_.transition&&ir(_,_.transition),_.shapeFlag|=512,s.delete(N),s.add(N)):(s.add(N),$&&s.size>parseInt($,10)&&P(s.values().next().value)),_.shapeFlag|=256,i=_,Tl(m.type)?m:_}}},au=lu;function fn(e,t){return z(e)?e.some(n=>fn(n,t)):me(e)?e.split(",").includes(t):Xa(e)?e.test(t):!1}function cu(e,t){Ll(e,"a",t)}function uu(e,t){Ll(e,"da",t)}function Ll(e,t,n=ye){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Rr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Hn(o.parent.vnode)&&fu(r,t,n,o),o=o.parent}}function fu(e,t,n,r){const o=Rr(t,e,r,!0);Il(()=>{Do(r[t],o)},n)}function Nr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function $r(e){return e.shapeFlag&128?e.ssContent:e}function Rr(e,t,n=ye,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;Mt();const l=Ht(n),a=Be(t,n,e,i);return l(),Nt(),a});return r?o.unshift(s):o.push(s),s}}const st=e=>(t,n=ye)=>(!Nn||e==="sp")&&Rr(e,(...r)=>t(...r),n),du=st("bm"),rs=st("m"),hu=st("bu"),Ol=st("u"),os=st("bum"),Il=st("um"),pu=st("sp"),gu=st("rtg"),mu=st("rtc");function Hl(e,t=ye){Rr("ec",e,t)}function Pm(e,t,n,r){let o;const s=n&&n[r];if(z(e)||me(e)){o=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,s&&s[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;len(t)?!(t.type===Se||t.type===Ce&&!Ml(t.children)):!0)?e:null}const fo=e=>e?ta(e)?as(e)||e.proxy:fo(e.parent):null,gn=_e(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>fo(e.parent),$root:e=>fo(e.root),$emit:e=>e.emit,$options:e=>ss(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,br(e.update)}),$nextTick:e=>e.n||(e.n=ln.bind(e.proxy)),$watch:e=>ru.bind(e)}),jr=(e,t)=>e!==pe&&!e.__isScriptSetup&&ne(e,t),yu={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:l,appContext:a}=e;let u;if(t[0]!=="$"){const g=i[t];if(g!==void 0)switch(g){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(jr(r,t))return i[t]=1,r[t];if(o!==pe&&ne(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&ne(u,t))return i[t]=3,s[t];if(n!==pe&&ne(n,t))return i[t]=4,n[t];ho&&(i[t]=0)}}const c=gn[t];let f,d;if(c)return t==="$attrs"&&Ie(e,"get",t),c(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==pe&&ne(n,t))return i[t]=4,n[t];if(d=a.config.globalProperties,ne(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return jr(o,t)?(o[t]=n,!0):r!==pe&&ne(r,t)?(r[t]=n,!0):ne(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let l;return!!n[i]||e!==pe&&ne(e,i)||jr(t,i)||(l=s[0])&&ne(l,i)||ne(r,i)||ne(gn,i)||ne(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ne(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Cm(){return _u().slots}function _u(){const e=Mn();return e.setupContext||(e.setupContext=ra(e))}function js(e){return z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Am(e){const t=Mn();let n=e();return yo(),Fo(n)&&(n=n.catch(r=>{throw Ht(t),r})),[n,()=>Ht(t)]}let ho=!0;function vu(e){const t=ss(e),n=e.proxy,r=e.ctx;ho=!1,t.beforeCreate&&Ds(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:u,created:c,beforeMount:f,mounted:d,beforeUpdate:g,updated:v,activated:P,deactivated:k,beforeDestroy:A,beforeUnmount:y,destroyed:m,unmounted:_,render:w,renderTracked:E,renderTriggered:L,errorCaptured:S,serverPrefetch:$,expose:N,inheritAttrs:Q,components:H,directives:G,filters:le}=t;if(u&&bu(u,r,null),i)for(const Z in i){const W=i[Z];X(W)&&(r[Z]=W.bind(n))}if(o){const Z=o.call(n,n);ce(Z)&&(e.data=wt(Z))}if(ho=!0,s)for(const Z in s){const W=s[Z],Ve=X(W)?W.bind(n,n):X(W.get)?W.get.bind(n,n):De,it=!X(W)&&X(W.set)?W.set.bind(n):De,Ge=Le({get:Ve,set:it});Object.defineProperty(r,Z,{enumerable:!0,configurable:!0,get:()=>Ge.value,set:xe=>Ge.value=xe})}if(l)for(const Z in l)Nl(l[Z],r,n,Z);if(a){const Z=X(a)?a.call(n):a;Reflect.ownKeys(Z).forEach(W=>{Ot(W,Z[W])})}c&&Ds(c,e,"c");function V(Z,W){z(W)?W.forEach(Ve=>Z(Ve.bind(n))):W&&Z(W.bind(n))}if(V(du,f),V(rs,d),V(hu,g),V(Ol,v),V(cu,P),V(uu,k),V(Hl,S),V(mu,E),V(gu,L),V(os,y),V(Il,_),V(pu,$),z(N))if(N.length){const Z=e.exposed||(e.exposed={});N.forEach(W=>{Object.defineProperty(Z,W,{get:()=>n[W],set:Ve=>n[W]=Ve})})}else e.exposed||(e.exposed={});w&&e.render===De&&(e.render=w),Q!=null&&(e.inheritAttrs=Q),H&&(e.components=H),G&&(e.directives=G)}function bu(e,t,n=De){z(e)&&(e=po(e));for(const r in e){const o=e[r];let s;ce(o)?"default"in o?s=Ae(o.from||r,o.default,!0):s=Ae(o.from||r):s=Ae(o),Pe(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Ds(e,t,n){Be(z(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Nl(e,t,n,r){const o=r.includes(".")?Al(n,r):()=>n[r];if(me(e)){const s=t[e];X(s)&&Qt(o,s)}else if(X(e))Qt(o,e.bind(n));else if(ce(e))if(z(e))e.forEach(s=>Nl(s,t,n,r));else{const s=X(e.handler)?e.handler.bind(n):t[e.handler];X(s)&&Qt(o,s,e)}}function ss(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,l=s.get(t);let a;return l?a=l:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(u=>lr(a,u,i,!0)),lr(a,t,i)),ce(t)&&s.set(t,a),a}function lr(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&lr(e,s,n,!0),o&&o.forEach(i=>lr(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Eu[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Eu={data:Fs,props:Bs,emits:Bs,methods:dn,computed:dn,beforeCreate:Te,created:Te,beforeMount:Te,mounted:Te,beforeUpdate:Te,updated:Te,beforeDestroy:Te,beforeUnmount:Te,destroyed:Te,unmounted:Te,activated:Te,deactivated:Te,errorCaptured:Te,serverPrefetch:Te,components:dn,directives:dn,watch:Ru,provide:Fs,inject:wu};function Fs(e,t){return t?e?function(){return _e(X(e)?e.call(this,this):e,X(t)?t.call(this,this):t)}:t:e}function wu(e,t){return dn(po(e),po(t))}function po(e){if(z(e)){const t={};for(let n=0;n1)return n&&X(t)?t.call(r&&r.proxy):t}}function jl(){return!!(ye||Ee||Xt)}function Cu(e,t,n,r=!1){const o={},s={};tr(s,Pr,1),e.propsDefaults=Object.create(null),Dl(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:In(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Au(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,l=re(o),[a]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[d,g]=Fl(f,t,!0);_e(i,d),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!a)return ce(e)&&r.set(e,Wt),Wt;if(z(s))for(let c=0;c-1,g[1]=P<0||v-1||ne(g,"default"))&&l.push(f)}}}const u=[i,l];return ce(e)&&r.set(e,u),u}function Vs(e){return e[0]!=="$"&&!qt(e)}function Us(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Ws(e,t){return Us(e)===Us(t)}function Ks(e,t){return z(t)?t.findIndex(n=>Ws(n,e)):X(t)&&Ws(t,e)?0:-1}const Bl=e=>e[0]==="_"||e==="$stable",is=e=>z(e)?e.map(je):[je(e)],Su=(e,t,n)=>{if(t._n)return t;const r=Xo((...o)=>is(t(...o)),n);return r._c=!1,r},Vl=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Bl(o))continue;const s=e[o];if(X(s))t[o]=Su(o,s,r);else if(s!=null){const i=is(s);t[o]=()=>i}}},Ul=(e,t)=>{const n=is(t);e.slots.default=()=>n},xu=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=re(t),tr(t,"_",n)):Vl(t,e.slots={})}else e.slots={},t&&Ul(e,t);tr(e.slots,Pr,1)},ku=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=pe;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(_e(o,t),!n&&l===1&&delete o._):(s=!t.$stable,Vl(t,o)),i=t}else t&&(Ul(e,t),i={default:1});if(s)for(const l in o)!Bl(l)&&i[l]==null&&delete o[l]};function ar(e,t,n,r,o=!1){if(z(e)){e.forEach((d,g)=>ar(d,t&&(z(t)?t[g]:t),n,r,o));return}if(Lt(r)&&!o)return;const s=r.shapeFlag&4?as(r.component)||r.component.proxy:r.el,i=o?null:s,{i:l,r:a}=e,u=t&&t.r,c=l.refs===pe?l.refs={}:l.refs,f=l.setupState;if(u!=null&&u!==a&&(me(u)?(c[u]=null,ne(f,u)&&(f[u]=null)):Pe(u)&&(u.value=null)),X(a))bt(a,l,12,[i,c]);else{const d=me(a),g=Pe(a);if(d||g){const v=()=>{if(e.f){const P=d?ne(f,a)?f[a]:c[a]:a.value;o?z(P)&&Do(P,s):z(P)?P.includes(s)||P.push(s):d?(c[a]=[s],ne(f,a)&&(f[a]=c[a])):(a.value=[s],e.k&&(c[e.k]=a.value))}else d?(c[a]=i,ne(f,a)&&(f[a]=i)):g&&(a.value=i,e.k&&(c[e.k]=i))};i?(v.id=-1,be(v,n)):v()}}}let at=!1;const Lu=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Ou=e=>e.namespaceURI.includes("MathML"),qn=e=>{if(Lu(e))return"svg";if(Ou(e))return"mathml"},zn=e=>e.nodeType===8;function Iu(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:l,insert:a,createComment:u}}=e,c=(m,_)=>{if(!_.hasChildNodes()){n(null,m,_),or(),_._vnode=m;return}at=!1,f(_.firstChild,m,null,null,null),or(),_._vnode=m,at&&console.error("Hydration completed but contains mismatches.")},f=(m,_,w,E,L,S=!1)=>{const $=zn(m)&&m.data==="[",N=()=>P(m,_,w,E,L,$),{type:Q,ref:H,shapeFlag:G,patchFlag:le}=_;let ae=m.nodeType;_.el=m,le===-2&&(S=!1,_.dynamicChildren=null);let V=null;switch(Q){case Yt:ae!==3?_.children===""?(a(_.el=o(""),i(m),m),V=m):V=N():(m.data!==_.children&&(at=!0,m.data=_.children),V=s(m));break;case Se:y(m)?(V=s(m),A(_.el=m.content.firstChild,m,w)):ae!==8||$?V=N():V=s(m);break;case mn:if($&&(m=s(m),ae=m.nodeType),ae===1||ae===3){V=m;const Z=!_.children.length;for(let W=0;W<_.staticCount;W++)Z&&(_.children+=V.nodeType===1?V.outerHTML:V.data),W===_.staticCount-1&&(_.anchor=V),V=s(V);return $?s(V):V}else N();break;case Ce:$?V=v(m,_,w,E,L,S):V=N();break;default:if(G&1)(ae!==1||_.type.toLowerCase()!==m.tagName.toLowerCase())&&!y(m)?V=N():V=d(m,_,w,E,L,S);else if(G&6){_.slotScopeIds=L;const Z=i(m);if($?V=k(m):zn(m)&&m.data==="teleport start"?V=k(m,m.data,"teleport end"):V=s(m),t(_,Z,null,w,E,qn(Z),S),Lt(_)){let W;$?(W=fe(Ce),W.anchor=V?V.previousSibling:Z.lastChild):W=m.nodeType===3?Zl(""):fe("div"),W.el=m,_.component.subTree=W}}else G&64?ae!==8?V=N():V=_.type.hydrate(m,_,w,E,L,S,e,g):G&128&&(V=_.type.hydrate(m,_,w,E,qn(i(m)),L,S,e,f))}return H!=null&&ar(H,null,E,_),V},d=(m,_,w,E,L,S)=>{S=S||!!_.dynamicChildren;const{type:$,props:N,patchFlag:Q,shapeFlag:H,dirs:G,transition:le}=_,ae=$==="input"||$==="option";if(ae||Q!==-1){G&&Qe(_,null,w,"created");let V=!1;if(y(m)){V=Kl(E,le)&&w&&w.vnode.props&&w.vnode.props.appear;const W=m.content.firstChild;V&&le.beforeEnter(W),A(W,m,w),_.el=m=W}if(H&16&&!(N&&(N.innerHTML||N.textContent))){let W=g(m.firstChild,_,m,w,E,L,S);for(;W;){at=!0;const Ve=W;W=W.nextSibling,l(Ve)}}else H&8&&m.textContent!==_.children&&(at=!0,m.textContent=_.children);if(N)if(ae||!S||Q&48)for(const W in N)(ae&&(W.endsWith("value")||W==="indeterminate")||Ln(W)&&!qt(W)||W[0]===".")&&r(m,W,null,N[W],void 0,void 0,w);else N.onClick&&r(m,"onClick",null,N.onClick,void 0,void 0,w);let Z;(Z=N&&N.onVnodeBeforeMount)&&ke(Z,w,_),G&&Qe(_,null,w,"beforeMount"),((Z=N&&N.onVnodeMounted)||G||V)&&Cl(()=>{Z&&ke(Z,w,_),V&&le.enter(m),G&&Qe(_,null,w,"mounted")},E)}return m.nextSibling},g=(m,_,w,E,L,S,$)=>{$=$||!!_.dynamicChildren;const N=_.children,Q=N.length;for(let H=0;H{const{slotScopeIds:$}=_;$&&(L=L?L.concat($):$);const N=i(m),Q=g(s(m),_,N,w,E,L,S);return Q&&zn(Q)&&Q.data==="]"?s(_.anchor=Q):(at=!0,a(_.anchor=u("]"),N,Q),Q)},P=(m,_,w,E,L,S)=>{if(at=!0,_.el=null,S){const Q=k(m);for(;;){const H=s(m);if(H&&H!==Q)l(H);else break}}const $=s(m),N=i(m);return l(m),n(null,_,N,$,w,E,qn(N),L),$},k=(m,_="[",w="]")=>{let E=0;for(;m;)if(m=s(m),m&&zn(m)&&(m.data===_&&E++,m.data===w)){if(E===0)return s(m);E--}return m},A=(m,_,w)=>{const E=_.parentNode;E&&E.replaceChild(m,_);let L=w;for(;L;)L.vnode.el===_&&(L.vnode.el=L.subTree.el=m),L=L.parent},y=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[c,f]}const be=Cl;function Hu(e){return Wl(e)}function Mu(e){return Wl(e,Iu)}function Wl(e,t){const n=Qi();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:l,createComment:a,setText:u,setElementText:c,parentNode:f,nextSibling:d,setScopeId:g=De,insertStaticContent:v}=e,P=(h,p,b,C=null,R=null,I=null,D=void 0,O=null,M=!!p.dynamicChildren)=>{if(h===p)return;h&&!Ke(h,p)&&(C=T(h),xe(h,R,I,!0),h=null),p.patchFlag===-2&&(M=!1,p.dynamicChildren=null);const{type:x,ref:B,shapeFlag:q}=p;switch(x){case Yt:k(h,p,b,C);break;case Se:A(h,p,b,C);break;case mn:h==null&&y(p,b,C,D);break;case Ce:H(h,p,b,C,R,I,D,O,M);break;default:q&1?w(h,p,b,C,R,I,D,O,M):q&6?G(h,p,b,C,R,I,D,O,M):(q&64||q&128)&&x.process(h,p,b,C,R,I,D,O,M,U)}B!=null&&R&&ar(B,h&&h.ref,I,p||h,!p)},k=(h,p,b,C)=>{if(h==null)r(p.el=l(p.children),b,C);else{const R=p.el=h.el;p.children!==h.children&&u(R,p.children)}},A=(h,p,b,C)=>{h==null?r(p.el=a(p.children||""),b,C):p.el=h.el},y=(h,p,b,C)=>{[h.el,h.anchor]=v(h.children,p,b,C,h.el,h.anchor)},m=({el:h,anchor:p},b,C)=>{let R;for(;h&&h!==p;)R=d(h),r(h,b,C),h=R;r(p,b,C)},_=({el:h,anchor:p})=>{let b;for(;h&&h!==p;)b=d(h),o(h),h=b;o(p)},w=(h,p,b,C,R,I,D,O,M)=>{p.type==="svg"?D="svg":p.type==="math"&&(D="mathml"),h==null?E(p,b,C,R,I,D,O,M):$(h,p,R,I,D,O,M)},E=(h,p,b,C,R,I,D,O)=>{let M,x;const{props:B,shapeFlag:q,transition:K,dirs:Y}=h;if(M=h.el=i(h.type,I,B&&B.is,B),q&8?c(M,h.children):q&16&&S(h.children,M,null,C,R,Dr(h,I),D,O),Y&&Qe(h,null,C,"created"),L(M,h,h.scopeId,D,C),B){for(const ie in B)ie!=="value"&&!qt(ie)&&s(M,ie,null,B[ie],I,h.children,C,R,we);"value"in B&&s(M,"value",null,B.value,I),(x=B.onVnodeBeforeMount)&&ke(x,C,h)}Y&&Qe(h,null,C,"beforeMount");const te=Kl(R,K);te&&K.beforeEnter(M),r(M,p,b),((x=B&&B.onVnodeMounted)||te||Y)&&be(()=>{x&&ke(x,C,h),te&&K.enter(M),Y&&Qe(h,null,C,"mounted")},R)},L=(h,p,b,C,R)=>{if(b&&g(h,b),C)for(let I=0;I{for(let x=M;x{const O=p.el=h.el;let{patchFlag:M,dynamicChildren:x,dirs:B}=p;M|=h.patchFlag&16;const q=h.props||pe,K=p.props||pe;let Y;if(b&&Pt(b,!1),(Y=K.onVnodeBeforeUpdate)&&ke(Y,b,p,h),B&&Qe(p,h,b,"beforeUpdate"),b&&Pt(b,!0),x?N(h.dynamicChildren,x,O,b,C,Dr(p,R),I):D||W(h,p,O,null,b,C,Dr(p,R),I,!1),M>0){if(M&16)Q(O,p,q,K,b,C,R);else if(M&2&&q.class!==K.class&&s(O,"class",null,K.class,R),M&4&&s(O,"style",q.style,K.style,R),M&8){const te=p.dynamicProps;for(let ie=0;ie{Y&&ke(Y,b,p,h),B&&Qe(p,h,b,"updated")},C)},N=(h,p,b,C,R,I,D)=>{for(let O=0;O{if(b!==C){if(b!==pe)for(const O in b)!qt(O)&&!(O in C)&&s(h,O,b[O],null,D,p.children,R,I,we);for(const O in C){if(qt(O))continue;const M=C[O],x=b[O];M!==x&&O!=="value"&&s(h,O,x,M,D,p.children,R,I,we)}"value"in C&&s(h,"value",b.value,C.value,D)}},H=(h,p,b,C,R,I,D,O,M)=>{const x=p.el=h?h.el:l(""),B=p.anchor=h?h.anchor:l("");let{patchFlag:q,dynamicChildren:K,slotScopeIds:Y}=p;Y&&(O=O?O.concat(Y):Y),h==null?(r(x,b,C),r(B,b,C),S(p.children||[],b,B,R,I,D,O,M)):q>0&&q&64&&K&&h.dynamicChildren?(N(h.dynamicChildren,K,b,R,I,D,O),(p.key!=null||R&&p===R.subTree)&&ql(h,p,!0)):W(h,p,b,B,R,I,D,O,M)},G=(h,p,b,C,R,I,D,O,M)=>{p.slotScopeIds=O,h==null?p.shapeFlag&512?R.ctx.activate(p,b,C,D,M):le(p,b,C,R,I,D,M):ae(h,p,M)},le=(h,p,b,C,R,I,D)=>{const O=h.component=Vu(h,C,R);if(Hn(h)&&(O.ctx.renderer=U),Uu(O),O.asyncDep){if(R&&R.registerDep(O,V),!h.el){const M=O.subTree=fe(Se);A(null,M,p,b)}}else V(O,h,p,b,R,I,D)},ae=(h,p,b)=>{const C=p.component=h.component;if(zc(h,p,b))if(C.asyncDep&&!C.asyncResolved){Z(C,p,b);return}else C.next=p,Bc(C.update),C.effect.dirty=!0,C.update();else p.el=h.el,C.vnode=p},V=(h,p,b,C,R,I,D)=>{const O=()=>{if(h.isMounted){let{next:B,bu:q,u:K,parent:Y,vnode:te}=h;{const Ft=zl(h);if(Ft){B&&(B.el=te.el,Z(h,B,D)),Ft.asyncDep.then(()=>{h.isUnmounted||O()});return}}let ie=B,he;Pt(h,!1),B?(B.el=te.el,Z(h,B,D)):B=te,q&&hn(q),(he=B.props&&B.props.onVnodeBeforeUpdate)&&ke(he,Y,B,te),Pt(h,!0);const ve=Ir(h),Ue=h.subTree;h.subTree=ve,P(Ue,ve,f(Ue.el),T(Ue),h,R,I),B.el=ve.el,ie===null&&Yo(h,ve.el),K&&be(K,R),(he=B.props&&B.props.onVnodeUpdated)&&be(()=>ke(he,Y,B,te),R)}else{let B;const{el:q,props:K}=p,{bm:Y,m:te,parent:ie}=h,he=Lt(p);if(Pt(h,!1),Y&&hn(Y),!he&&(B=K&&K.onVnodeBeforeMount)&&ke(B,ie,p),Pt(h,!0),q&&de){const ve=()=>{h.subTree=Ir(h),de(q,h.subTree,h,R,null)};he?p.type.__asyncLoader().then(()=>!h.isUnmounted&&ve()):ve()}else{const ve=h.subTree=Ir(h);P(null,ve,b,C,h,R,I),p.el=ve.el}if(te&&be(te,R),!he&&(B=K&&K.onVnodeMounted)){const ve=p;be(()=>ke(B,ie,ve),R)}(p.shapeFlag&256||ie&&Lt(ie.vnode)&&ie.vnode.shapeFlag&256)&&h.a&&be(h.a,R),h.isMounted=!0,p=b=C=null}},M=h.effect=new Vo(O,De,()=>br(x),h.scope),x=h.update=()=>{M.dirty&&M.run()};x.id=h.uid,Pt(h,!0),x()},Z=(h,p,b)=>{p.component=h;const C=h.vnode.props;h.vnode=p,h.next=null,Au(h,p.props,C,b),ku(h,p.children,b),Mt(),Is(h),Nt()},W=(h,p,b,C,R,I,D,O,M=!1)=>{const x=h&&h.children,B=h?h.shapeFlag:0,q=p.children,{patchFlag:K,shapeFlag:Y}=p;if(K>0){if(K&128){it(x,q,b,C,R,I,D,O,M);return}else if(K&256){Ve(x,q,b,C,R,I,D,O,M);return}}Y&8?(B&16&&we(x,R,I),q!==x&&c(b,q)):B&16?Y&16?it(x,q,b,C,R,I,D,O,M):we(x,R,I,!0):(B&8&&c(b,""),Y&16&&S(q,b,C,R,I,D,O,M))},Ve=(h,p,b,C,R,I,D,O,M)=>{h=h||Wt,p=p||Wt;const x=h.length,B=p.length,q=Math.min(x,B);let K;for(K=0;KB?we(h,R,I,!0,!1,q):S(p,b,C,R,I,D,O,M,q)},it=(h,p,b,C,R,I,D,O,M)=>{let x=0;const B=p.length;let q=h.length-1,K=B-1;for(;x<=q&&x<=K;){const Y=h[x],te=p[x]=M?pt(p[x]):je(p[x]);if(Ke(Y,te))P(Y,te,b,null,R,I,D,O,M);else break;x++}for(;x<=q&&x<=K;){const Y=h[q],te=p[K]=M?pt(p[K]):je(p[K]);if(Ke(Y,te))P(Y,te,b,null,R,I,D,O,M);else break;q--,K--}if(x>q){if(x<=K){const Y=K+1,te=YK)for(;x<=q;)xe(h[x],R,I,!0),x++;else{const Y=x,te=x,ie=new Map;for(x=te;x<=K;x++){const He=p[x]=M?pt(p[x]):je(p[x]);He.key!=null&&ie.set(He.key,x)}let he,ve=0;const Ue=K-te+1;let Ft=!1,ws=0;const an=new Array(Ue);for(x=0;x=Ue){xe(He,R,I,!0);continue}let Je;if(He.key!=null)Je=ie.get(He.key);else for(he=te;he<=K;he++)if(an[he-te]===0&&Ke(He,p[he])){Je=he;break}Je===void 0?xe(He,R,I,!0):(an[Je-te]=x+1,Je>=ws?ws=Je:Ft=!0,P(He,p[Je],b,null,R,I,D,O,M),ve++)}const Rs=Ft?Nu(an):Wt;for(he=Rs.length-1,x=Ue-1;x>=0;x--){const He=te+x,Je=p[He],Ps=He+1{const{el:I,type:D,transition:O,children:M,shapeFlag:x}=h;if(x&6){Ge(h.component.subTree,p,b,C);return}if(x&128){h.suspense.move(p,b,C);return}if(x&64){D.move(h,p,b,U);return}if(D===Ce){r(I,p,b);for(let q=0;qO.enter(I),R);else{const{leave:q,delayLeave:K,afterLeave:Y}=O,te=()=>r(I,p,b),ie=()=>{q(I,()=>{te(),Y&&Y()})};K?K(I,te,ie):ie()}else r(I,p,b)},xe=(h,p,b,C=!1,R=!1)=>{const{type:I,props:D,ref:O,children:M,dynamicChildren:x,shapeFlag:B,patchFlag:q,dirs:K}=h;if(O!=null&&ar(O,null,b,h,!0),B&256){p.ctx.deactivate(h);return}const Y=B&1&&K,te=!Lt(h);let ie;if(te&&(ie=D&&D.onVnodeBeforeUnmount)&&ke(ie,p,h),B&6)jn(h.component,b,C);else{if(B&128){h.suspense.unmount(b,C);return}Y&&Qe(h,null,p,"beforeUnmount"),B&64?h.type.remove(h,p,b,R,U,C):x&&(I!==Ce||q>0&&q&64)?we(x,p,b,!1,!0):(I===Ce&&q&384||!R&&B&16)&&we(M,p,b),C&&jt(h)}(te&&(ie=D&&D.onVnodeUnmounted)||Y)&&be(()=>{ie&&ke(ie,p,h),Y&&Qe(h,null,p,"unmounted")},b)},jt=h=>{const{type:p,el:b,anchor:C,transition:R}=h;if(p===Ce){Dt(b,C);return}if(p===mn){_(h);return}const I=()=>{o(b),R&&!R.persisted&&R.afterLeave&&R.afterLeave()};if(h.shapeFlag&1&&R&&!R.persisted){const{leave:D,delayLeave:O}=R,M=()=>D(b,I);O?O(h.el,I,M):M()}else I()},Dt=(h,p)=>{let b;for(;h!==p;)b=d(h),o(h),h=b;o(p)},jn=(h,p,b)=>{const{bum:C,scope:R,update:I,subTree:D,um:O}=h;C&&hn(C),R.stop(),I&&(I.active=!1,xe(D,h,p,b)),O&&be(O,p),be(()=>{h.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},we=(h,p,b,C=!1,R=!1,I=0)=>{for(let D=I;Dh.shapeFlag&6?T(h.component.subTree):h.shapeFlag&128?h.suspense.next():d(h.anchor||h.el);let F=!1;const j=(h,p,b)=>{h==null?p._vnode&&xe(p._vnode,null,null,!0):P(p._vnode||null,h,p,null,null,null,b),F||(F=!0,Is(),or(),F=!1),p._vnode=h},U={p:P,um:xe,m:Ge,r:jt,mt:le,mc:S,pc:W,pbc:N,n:T,o:e};let oe,de;return t&&([oe,de]=t(U)),{render:j,hydrate:oe,createApp:Tu(j,oe)}}function Dr({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Pt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Kl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ql(e,t,n=!1){const r=e.children,o=t.children;if(z(r)&&z(o))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}function zl(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:zl(t)}const $u=e=>e.__isTeleport,Ce=Symbol.for("v-fgt"),Yt=Symbol.for("v-txt"),Se=Symbol.for("v-cmt"),mn=Symbol.for("v-stc"),yn=[];let Fe=null;function Ye(e=!1){yn.push(Fe=e?null:[])}function Gl(){yn.pop(),Fe=yn[yn.length-1]||null}let Zt=1;function qs(e){Zt+=e}function Jl(e){return e.dynamicChildren=Zt>0?Fe||Wt:null,Gl(),Zt>0&&Fe&&Fe.push(e),e}function ju(e,t,n,r,o,s){return Jl(Xl(e,t,n,r,o,s,!0))}function yt(e,t,n,r,o){return Jl(fe(e,t,n,r,o,!0))}function en(e){return e?e.__v_isVNode===!0:!1}function Ke(e,t){return e.type===t.type&&e.key===t.key}const Pr="__vInternal",Ql=({key:e})=>e??null,Qn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?me(e)||Pe(e)||X(e)?{i:Ee,r:e,k:t,f:!!n}:e:null);function Xl(e,t=null,n=null,r=0,o=null,s=e===Ce?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ql(t),ref:t&&Qn(t),scopeId:wr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ee};return l?(ls(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=me(n)?8:16),Zt>0&&!i&&Fe&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&Fe.push(a),a}const fe=Du;function Du(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Rl)&&(e=Se),en(e)){const l=rt(e,t,!0);return n&&ls(l,n),Zt>0&&!s&&Fe&&(l.shapeFlag&6?Fe[Fe.indexOf(e)]=l:Fe.push(l)),l.patchFlag|=-2,l}if(qu(e)&&(e=e.__vccOpts),t){t=Yl(t);let{class:l,style:a}=t;l&&!me(l)&&(t.class=_r(l)),ce(a)&&(hl(a)&&!z(a)&&(a=_e({},a)),t.style=yr(a))}const i=me(e)?1:Tl(e)?128:$u(e)?64:ce(e)?4:X(e)?2:0;return Xl(e,t,n,r,o,i,s,!0)}function Yl(e){return e?hl(e)||Pr in e?_e({},e):e:null}function rt(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,l=t?ea(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ql(l),ref:t&&t.ref?n&&o?z(o)?o.concat(Qn(t)):[o,Qn(t)]:Qn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ce?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&rt(e.ssContent),ssFallback:e.ssFallback&&rt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Zl(e=" ",t=0){return fe(Yt,null,e,t)}function Sm(e,t){const n=fe(mn,null,e);return n.staticCount=t,n}function xm(e="",t=!1){return t?(Ye(),yt(Se,null,e)):fe(Se,null,e)}function je(e){return e==null||typeof e=="boolean"?fe(Se):z(e)?fe(Ce,null,e.slice()):typeof e=="object"?pt(e):fe(Yt,null,String(e))}function pt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:rt(e)}function ls(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(z(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),ls(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Pr in t)?t._ctx=Ee:o===3&&Ee&&(Ee.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else X(t)?(t={default:t,_ctx:Ee},n=32):(t=String(t),r&64?(n=16,t=[Zl(t)]):n=8);e.children=t,e.shapeFlag|=n}function ea(...e){const t={};for(let n=0;nye||Ee;let cr,mo;{const e=Qi(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};cr=t("__VUE_INSTANCE_SETTERS__",n=>ye=n),mo=t("__VUE_SSR_SETTERS__",n=>Nn=n)}const Ht=e=>{const t=ye;return cr(e),e.scope.on(),()=>{e.scope.off(),cr(t)}},yo=()=>{ye&&ye.scope.off(),cr(null)};function ta(e){return e.vnode.shapeFlag&4}let Nn=!1;function Uu(e,t=!1){t&&mo(t);const{props:n,children:r}=e.vnode,o=ta(e);Cu(e,n,o,t),xu(e,r);const s=o?Wu(e,t):void 0;return t&&mo(!1),s}function Wu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=pl(new Proxy(e.ctx,yu));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?ra(e):null,s=Ht(e);Mt();const i=bt(r,e,0,[e.props,o]);if(Nt(),s(),Fo(i)){if(i.then(yo,yo),t)return i.then(l=>{_o(e,l,t)}).catch(l=>{sn(l,e,0)});e.asyncDep=i}else _o(e,i,t)}else na(e,t)}function _o(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ce(t)&&(e.setupState=yl(t)),na(e,n)}let zs;function na(e,t,n){const r=e.type;if(!e.render){if(!t&&zs&&!r.render){const o=r.template||ss(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,u=_e(_e({isCustomElement:s,delimiters:l},i),a);r.render=zs(o,u)}}e.render=r.render||De}{const o=Ht(e);Mt();try{vu(e)}finally{Nt(),o()}}}function Ku(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Ie(e,"get","$attrs"),t[n]}}))}function ra(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Ku(e)},slots:e.slots,emit:e.emit,expose:t}}function as(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(yl(pl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in gn)return gn[n](e)},has(t,n){return n in t||n in gn}}))}function vo(e,t=!0){return X(e)?e.displayName||e.name:e.name||t&&e.__name}function qu(e){return X(e)&&"__vccOpts"in e}const Le=(e,t)=>Oc(e,t,Nn);function Oe(e,t,n){const r=arguments.length;return r===2?ce(t)&&!z(t)?en(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&en(n)&&(n=[n]),fe(e,t,n))}const oa="3.4.21";/** -* @vue/runtime-dom v3.4.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const zu="http://www.w3.org/2000/svg",Gu="http://www.w3.org/1998/Math/MathML",gt=typeof document<"u"?document:null,Gs=gt&>.createElement("template"),Ju={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?gt.createElementNS(zu,e):t==="mathml"?gt.createElementNS(Gu,e):gt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>gt.createTextNode(e),createComment:e=>gt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>gt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Gs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Gs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ct="transition",cn="animation",An=Symbol("_vtc"),Tr=(e,{slots:t})=>Oe(iu,Qu(e),t);Tr.displayName="Transition";const sa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Tr.props=_e({},Sl,sa);const Tt=(e,t=[])=>{z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Js=e=>e?z(e)?e.some(t=>t.length>1):e.length>1:!1;function Qu(e){const t={};for(const H in e)H in sa||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=Xu(o),P=v&&v[0],k=v&&v[1],{onBeforeEnter:A,onEnter:y,onEnterCancelled:m,onLeave:_,onLeaveCancelled:w,onBeforeAppear:E=A,onAppear:L=y,onAppearCancelled:S=m}=t,$=(H,G,le)=>{Ct(H,G?c:l),Ct(H,G?u:i),le&&le()},N=(H,G)=>{H._isLeaving=!1,Ct(H,f),Ct(H,g),Ct(H,d),G&&G()},Q=H=>(G,le)=>{const ae=H?L:y,V=()=>$(G,H,le);Tt(ae,[G,V]),Qs(()=>{Ct(G,H?a:s),ut(G,H?c:l),Js(ae)||Xs(G,r,P,V)})};return _e(t,{onBeforeEnter(H){Tt(A,[H]),ut(H,s),ut(H,i)},onBeforeAppear(H){Tt(E,[H]),ut(H,a),ut(H,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(H,G){H._isLeaving=!0;const le=()=>N(H,G);ut(H,f),ef(),ut(H,d),Qs(()=>{H._isLeaving&&(Ct(H,f),ut(H,g),Js(_)||Xs(H,r,k,le))}),Tt(_,[H,le])},onEnterCancelled(H){$(H,!1),Tt(m,[H])},onAppearCancelled(H){$(H,!0),Tt(S,[H])},onLeaveCancelled(H){N(H),Tt(w,[H])}})}function Xu(e){if(e==null)return null;if(ce(e))return[Fr(e.enter),Fr(e.leave)];{const t=Fr(e);return[t,t]}}function Fr(e){return Ji(e)}function ut(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[An]||(e[An]=new Set)).add(t)}function Ct(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[An];n&&(n.delete(t),n.size||(e[An]=void 0))}function Qs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Yu=0;function Xs(e,t,n,r){const o=e._endId=++Yu,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Zu(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,d),s()},d=g=>{g.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[v]||"").split(", "),o=r(`${ct}Delay`),s=r(`${ct}Duration`),i=Ys(o,s),l=r(`${cn}Delay`),a=r(`${cn}Duration`),u=Ys(l,a);let c=null,f=0,d=0;t===ct?i>0&&(c=ct,f=i,d=s.length):t===cn?u>0&&(c=cn,f=u,d=a.length):(f=Math.max(i,u),c=f>0?i>u?ct:cn:null,d=c?c===ct?s.length:a.length:0);const g=c===ct&&/\b(transform|all)(,|$)/.test(r(`${ct}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:g}}function Ys(e,t){for(;e.lengthZs(n)+Zs(e[r])))}function Zs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ef(){return document.body.offsetHeight}function tf(e,t,n){const r=e[An];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ei=Symbol("_vod"),nf=Symbol("_vsh"),rf=Symbol(""),of=/(^|;)\s*display\s*:/;function sf(e,t,n){const r=e.style,o=me(n);let s=!1;if(n&&!o){if(t)if(me(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Xn(r,l,"")}else for(const i in t)n[i]==null&&Xn(r,i,"");for(const i in n)i==="display"&&(s=!0),Xn(r,i,n[i])}else if(o){if(t!==n){const i=r[rf];i&&(n+=";"+i),r.cssText=n,s=of.test(n)}}else t&&e.removeAttribute("style");ei in e&&(e[ei]=s?r.display:"",e[nf]&&(r.display="none"))}const ti=/\s*!important$/;function Xn(e,t,n){if(z(n))n.forEach(r=>Xn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=lf(e,t);ti.test(n)?e.setProperty(on(r),n.replace(ti,""),"important"):e[r]=n}}const ni=["Webkit","Moz","ms"],Br={};function lf(e,t){const n=Br[t];if(n)return n;let r=Ze(t);if(r!=="filter"&&r in e)return Br[t]=r;r=mr(r);for(let o=0;oVr||(pf.then(()=>Vr=0),Vr=Date.now());function mf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Be(yf(r,n.value),t,5,[r])};return n.value=e,n.attached=gf(),n}function yf(e,t){if(z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const ii=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,_f=(e,t,n,r,o,s,i,l,a)=>{const u=o==="svg";t==="class"?tf(e,r,u):t==="style"?sf(e,n,r):Ln(t)?jo(t)||df(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):vf(e,t,r,u))?cf(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),af(e,t,r,u))};function vf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ii(t)&&X(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return ii(t)&&me(n)?!1:t in e}const ia=_e({patchProp:_f},Ju);let _n,li=!1;function bf(){return _n||(_n=Hu(ia))}function Ef(){return _n=li?_n:Mu(ia),li=!0,_n}const wf=(...e)=>{const t=bf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(!o)return;const s=t._component;!X(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,la(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},Rf=(...e)=>{const t=Ef().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=aa(r);if(o)return n(o,!0,la(o))},t};function la(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function aa(e){return me(e)?document.querySelector(e):e}const Pf=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Tf=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Cf=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Af(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){Sf(e);return}return t}function Sf(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function ur(e,t={}){if(typeof e!="string")return e;const n=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!Cf.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(Pf.test(e)||Tf.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Af)}return JSON.parse(e)}catch(r){if(t.strict)throw r;return e}}const xf=/#/g,kf=/&/g,Lf=/\//g,Of=/=/g,cs=/\+/g,If=/%5e/gi,Hf=/%60/gi,Mf=/%7c/gi,Nf=/%20/gi;function $f(e){return encodeURI(""+e).replace(Mf,"|")}function bo(e){return $f(typeof e=="string"?e:JSON.stringify(e)).replace(cs,"%2B").replace(Nf,"+").replace(xf,"%23").replace(kf,"%26").replace(Hf,"`").replace(If,"^").replace(Lf,"%2F")}function Ur(e){return bo(e).replace(Of,"%3D")}function fr(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function jf(e){return fr(e.replace(cs," "))}function Df(e){return fr(e.replace(cs," "))}function Ff(e=""){const t={};e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const r=n.match(/([^=]+)=?(.*)/)||[];if(r.length<2)continue;const o=jf(r[1]);if(o==="__proto__"||o==="constructor")continue;const s=Df(r[2]||"");t[o]===void 0?t[o]=s:Array.isArray(t[o])?t[o].push(s):t[o]=[t[o],s]}return t}function Bf(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${Ur(e)}=${bo(n)}`).join("&"):`${Ur(e)}=${bo(t)}`:Ur(e)}function Vf(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>Bf(t,e[t])).filter(Boolean).join("&")}const Uf=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,Wf=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,Kf=/^([/\\]\s*){2,}[^/\\]/,qf=/^[\s\0]*(blob|data|javascript|vbscript):$/i,zf=/\/$|\/\?|\/#/,Gf=/^\.?\//;function $t(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?Uf.test(e):Wf.test(e)||(t.acceptRelative?Kf.test(e):!1)}function Jf(e){return!!e&&qf.test(e)}function Eo(e="",t){return t?zf.test(e):e.endsWith("/")}function us(e="",t){if(!t)return(Eo(e)?e.slice(0,-1):e)||"/";if(!Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");o>=0&&(n=e.slice(0,o),r=e.slice(o));const[s,...i]=n.split("?");return((s.endsWith("/")?s.slice(0,-1):s)||"/")+(i.length>0?`?${i.join("?")}`:"")+r}function wo(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");if(o>=0&&(n=e.slice(0,o),r=e.slice(o),!n))return r;const[s,...i]=n.split("?");return s+"/"+(i.length>0?`?${i.join("?")}`:"")+r}function Qf(e=""){return e.startsWith("/")}function ai(e=""){return Qf(e)?e:"/"+e}function Xf(e,t){if(ua(t)||$t(e))return e;const n=us(t);return e.startsWith(n)?e:fs(n,e)}function ci(e,t){if(ua(t))return e;const n=us(t);if(!e.startsWith(n))return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function ca(e,t){const n=Cr(e),r={...Ff(n.search),...t};return n.search=Vf(r),ed(n)}function ua(e){return!e||e==="/"}function Yf(e){return e&&e!=="/"}function fs(e,...t){let n=e||"";for(const r of t.filter(o=>Yf(o)))if(n){const o=r.replace(Gf,"");n=wo(n)+o}else n=r;return n}function fa(...e){var i,l,a,u;const t=/\/(?!\/)/,n=e.filter(Boolean),r=[];let o=0;for(const c of n)if(!(!c||c==="/")){for(const[f,d]of c.split(t).entries())if(!(!d||d===".")){if(d===".."){if(r.length===1&&$t(r[0]))continue;r.pop(),o--;continue}if(f===1&&((i=r[r.length-1])!=null&&i.endsWith(":/"))){r[r.length-1]+="/"+d;continue}r.push(d),o++}}let s=r.join("/");return o>=0?(l=n[0])!=null&&l.startsWith("/")&&!s.startsWith("/")?s="/"+s:(a=n[0])!=null&&a.startsWith("./")&&!s.startsWith("./")&&(s="./"+s):s="../".repeat(-1*o)+s,(u=n[n.length-1])!=null&&u.endsWith("/")&&!s.endsWith("/")&&(s+="/"),s}function Zf(e,t,n={}){return n.trailingSlash||(e=wo(e),t=wo(t)),n.leadingSlash||(e=ai(e),t=ai(t)),n.encoding||(e=fr(e),t=fr(t)),e===t}const da=Symbol.for("ufo:protocolRelative");function Cr(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,f,d=""]=n;return{protocol:f.toLowerCase(),pathname:d,href:f+d,auth:"",host:"",search:"",hash:""}}if(!$t(e,{acceptRelative:!0}))return t?Cr(t+e):ui(e);const[,r="",o,s=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",l=""]=s.match(/([^#/?]*)(.*)?/)||[],{pathname:a,search:u,hash:c}=ui(l.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:r.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:a,search:u,hash:c,[da]:!r}}function ui(e=""){const[t="",n="",r=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function ed(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",r=e.hash||"",o=e.auth?e.auth+"@":"",s=e.host||"";return(e.protocol||e[da]?(e.protocol||"")+"//":"")+o+s+t+n+r}class td extends Error{constructor(t,n){super(t,n),this.name="FetchError",n!=null&&n.cause&&!this.cause&&(this.cause=n.cause)}}function nd(e){var a,u,c,f,d;const t=((a=e.error)==null?void 0:a.message)||((u=e.error)==null?void 0:u.toString())||"",n=((c=e.request)==null?void 0:c.method)||((f=e.options)==null?void 0:f.method)||"GET",r=((d=e.request)==null?void 0:d.url)||String(e.request)||"/",o=`[${n}] ${JSON.stringify(r)}`,s=e.response?`${e.response.status} ${e.response.statusText}`:"",i=`${o}: ${s}${t?` ${t}`:""}`,l=new td(i,e.error?{cause:e.error}:void 0);for(const g of["request","options","response"])Object.defineProperty(l,g,{get(){return e[g]}});for(const[g,v]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(l,g,{get(){return e.response&&e.response[v]}});return l}const rd=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function fi(e="GET"){return rd.has(e.toUpperCase())}function od(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const sd=new Set(["image/svg","application/xml","application/xhtml","application/html"]),id=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function ld(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return id.test(t)?"json":sd.has(t)||t.startsWith("text/")?"text":"blob"}function ad(e,t,n=globalThis.Headers){const r={...t,...e};if(t!=null&&t.params&&(e!=null&&e.params)&&(r.params={...t==null?void 0:t.params,...e==null?void 0:e.params}),t!=null&&t.query&&(e!=null&&e.query)&&(r.query={...t==null?void 0:t.query,...e==null?void 0:e.query}),t!=null&&t.headers&&(e!=null&&e.headers)){r.headers=new n((t==null?void 0:t.headers)||{});for(const[o,s]of new n((e==null?void 0:e.headers)||{}))r.headers.set(o,s)}return r}const cd=new Set([408,409,425,429,500,502,503,504]),ud=new Set([101,204,205,304]);function ha(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function o(l){const a=l.error&&l.error.name==="AbortError"&&!l.options.timeout||!1;if(l.options.retry!==!1&&!a){let c;typeof l.options.retry=="number"?c=l.options.retry:c=fi(l.options.method)?0:1;const f=l.response&&l.response.status||500;if(c>0&&(Array.isArray(l.options.retryStatusCodes)?l.options.retryStatusCodes.includes(f):cd.has(f))){const d=l.options.retryDelay||0;return d>0&&await new Promise(g=>setTimeout(g,d)),s(l.request,{...l.options,retry:c-1})}}const u=nd(l);throw Error.captureStackTrace&&Error.captureStackTrace(u,s),u}const s=async function(a,u={}){var g;const c={request:a,options:ad(u,e.defaults,n),response:void 0,error:void 0};c.options.method=(g=c.options.method)==null?void 0:g.toUpperCase(),c.options.onRequest&&await c.options.onRequest(c),typeof c.request=="string"&&(c.options.baseURL&&(c.request=Xf(c.request,c.options.baseURL)),(c.options.query||c.options.params)&&(c.request=ca(c.request,{...c.options.params,...c.options.query}))),c.options.body&&fi(c.options.method)&&(od(c.options.body)?(c.options.body=typeof c.options.body=="string"?c.options.body:JSON.stringify(c.options.body),c.options.headers=new n(c.options.headers||{}),c.options.headers.has("content-type")||c.options.headers.set("content-type","application/json"),c.options.headers.has("accept")||c.options.headers.set("accept","application/json")):("pipeTo"in c.options.body&&typeof c.options.body.pipeTo=="function"||typeof c.options.body.pipe=="function")&&("duplex"in c.options||(c.options.duplex="half")));let f;if(!c.options.signal&&c.options.timeout){const v=new r;f=setTimeout(()=>v.abort(),c.options.timeout),c.options.signal=v.signal}try{c.response=await t(c.request,c.options)}catch(v){return c.error=v,c.options.onRequestError&&await c.options.onRequestError(c),await o(c)}finally{f&&clearTimeout(f)}if(c.response.body&&!ud.has(c.response.status)&&c.options.method!=="HEAD"){const v=(c.options.parseResponse?"json":c.options.responseType)||ld(c.response.headers.get("content-type")||"");switch(v){case"json":{const P=await c.response.text(),k=c.options.parseResponse||ur;c.response._data=k(P);break}case"stream":{c.response._data=c.response.body;break}default:c.response._data=await c.response[v]()}}return c.options.onResponse&&await c.options.onResponse(c),!c.options.ignoreResponseError&&c.response.status>=400&&c.response.status<600?(c.options.onResponseError&&await c.options.onResponseError(c),await o(c)):c.response},i=async function(a,u){return(await s(a,u))._data};return i.raw=s,i.native=(...l)=>t(...l),i.create=(l={})=>ha({...e,defaults:{...e.defaults,...l}}),i}const ds=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),fd=ds.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),dd=ds.Headers,hd=ds.AbortController,pd=ha({fetch:fd,Headers:dd,AbortController:hd}),gd=pd,md=()=>{var e;return((e=window==null?void 0:window.__NUXT__)==null?void 0:e.config)||{}},dr=md().app,yd=()=>dr.baseURL,_d=()=>dr.buildAssetsDir,hs=(...e)=>fa(pa(),_d(),...e),pa=(...e)=>{const t=dr.cdnURL||dr.baseURL;return e.length?fa(t,...e):t};globalThis.__buildAssetsURL=hs,globalThis.__publicAssetsURL=pa;globalThis.$fetch||(globalThis.$fetch=gd.create({baseURL:yd()}));function Ro(e,t={},n){for(const r in e){const o=e[r],s=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Ro(o,t,s):typeof o=="function"&&(t[s]=o)}return t}const vd={run:e=>e()},bd=()=>vd,ga=typeof console.createTask<"u"?console.createTask:bd;function Ed(e,t){const n=t.shift(),r=ga(n);return e.reduce((o,s)=>o.then(()=>r.run(()=>s(...t))),Promise.resolve())}function wd(e,t){const n=t.shift(),r=ga(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function Wr(e,t){for(const n of[...e])n(t)}class Rd{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let s;for(;this._deprecatedHooks[t];)s=this._deprecatedHooks[t],t=s.to;if(s&&!r.allowDeprecated){let i=s.message;i||(i=`${o} hook has been deprecated`+(s.to?`, please use ${s.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(i)||(console.warn(i),this._deprecatedMessages.add(i))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...s)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...s));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Ro(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Ro(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith(Ed,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(wd,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&Wr(this._before,o);const s=t(n in this._hooks?[...this._hooks[n]]:[],r);return s instanceof Promise?s.finally(()=>{this._after&&o&&Wr(this._after,o)}):(this._after&&o&&Wr(this._after,o),s)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function ma(){return new Rd}function Pd(e={}){let t,n=!1;const r=i=>{if(t&&t!==i)throw new Error("Context conflict")};let o;if(e.asyncContext){const i=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;i?o=new i:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const s=()=>{if(o&&t===void 0){const i=o.getStore();if(i!==void 0)return i}return t};return{use:()=>{const i=s();if(i===void 0)throw new Error("Context is not available");return i},tryUse:()=>s(),set:(i,l)=>{l||r(i),t=i,n=!0},unset:()=>{t=void 0,n=!1},call:(i,l)=>{r(i),t=i;try{return o?o.run(i,l):l()}finally{n||(t=void 0)}},async callAsync(i,l){t=i;const a=()=>{t=i},u=()=>t===i?a:void 0;Po.add(u);try{const c=o?o.run(i,l):l();return n||(t=void 0),await c}finally{Po.delete(u)}}}}function Td(e={}){const t={};return{get(n,r={}){return t[n]||(t[n]=Pd({...e,...r})),t[n],t[n]}}}const hr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},di="__unctx__",Cd=hr[di]||(hr[di]=Td()),Ad=(e,t={})=>Cd.get(e,t),hi="__unctx_async_handlers__",Po=hr[hi]||(hr[hi]=new Set);function Sn(e){const t=[];for(const o of Po){const s=o();s&&t.push(s)}const n=()=>{for(const o of t)o()};let r=e();return r&&typeof r=="object"&&"catch"in r&&(r=r.catch(o=>{throw n(),o})),[r,n]}const ya=Ad("nuxt-app",{asyncContext:!1}),Sd="__nuxt_plugin";function xd(e){let t=0;const n={_scope:cc(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return n.vueApp.version}},payload:wt({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:o=>n._scope.run(()=>Od(n,o)),isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let o=!1;return()=>{if(!o&&(o=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...e};n.hooks=ma(),n.hook=n.hooks.hook,n.callHook=n.hooks.callHook,n.provide=(o,s)=>{const i="$"+o;Gn(n,i,s),Gn(n.vueApp.config.globalProperties,i,s)},Gn(n.vueApp,"$nuxt",n),Gn(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener("nuxt.preloadError",s=>{n.callHook("app:chunkError",{error:s.payload})}),window.useNuxtApp=window.useNuxtApp||ge;const o=n.hook("app:error",(...s)=>{console.error("[nuxt] error caught during app initialization",...s)});n.hook("app:mounted",o)}const r=n.payload.config;return n.provide("config",r),n}async function kd(e,t){if(t.hooks&&e.hooks.addHooks(t.hooks),typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const r in n)e.provide(r,n[r])}}async function Ld(e,t){const n=[],r=[],o=[],s=[];let i=0;async function l(a){var c;const u=((c=a.dependsOn)==null?void 0:c.filter(f=>t.some(d=>d._name===f)&&!n.includes(f)))??[];if(u.length>0)r.push([new Set(u),a]);else{const f=kd(e,a).then(async()=>{a._name&&(n.push(a._name),await Promise.all(r.map(async([d,g])=>{d.has(a._name)&&(d.delete(a._name),d.size===0&&(i++,await l(g)))})))});a.parallel?o.push(f.catch(d=>s.push(d))):await f}}for(const a of t)await l(a);if(await Promise.all(o),i)for(let a=0;a{}),e,{[Sd]:!0,_name:t})}function Od(e,t,n){const r=()=>n?t(...n):t();return ya.set(e),e.vueApp.runWithContext(r)}function Id(){var t;let e;return jl()&&(e=(t=Mn())==null?void 0:t.appContext.app.$nuxt),e=e||ya.tryUse(),e||null}function ge(){const e=Id();if(!e)throw new Error("[nuxt] instance unavailable");return e}function ps(e){return ge().$config}function Gn(e,t,n){Object.defineProperty(e,t,{get:()=>n})}function Hd(e,t){return{ctx:{table:e},matchAll:n=>va(n,e,t)}}function _a(e){const t={};for(const n in e)t[n]=n==="dynamic"?new Map(Object.entries(e[n]).map(([r,o])=>[r,_a(o)])):new Map(Object.entries(e[n]));return t}function Md(e){return Hd(_a(e))}function va(e,t,n){n!==!0&&e.endsWith("/")&&(e=e.slice(0,-1)||"/");const r=[];for(const[s,i]of pi(t.wildcard))(e===s||e.startsWith(s+"/"))&&r.push(i);for(const[s,i]of pi(t.dynamic))if(e.startsWith(s+"/")){const l="/"+e.slice(s.length).split("/").splice(2).join("/");r.push(...va(l,i))}const o=t.static.get(e);return o&&r.push(o),r.filter(Boolean)}function pi(e){return[...e.entries()].sort((t,n)=>t[0].length-n[0].length)}function Kr(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function To(e,t,n=".",r){if(!Kr(t))return To(e,{},n,r);const o=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const i=e[s];i!=null&&(r&&r(o,s,i,n)||(Array.isArray(i)&&Array.isArray(o[s])?o[s]=[...i,...o[s]]:Kr(i)&&Kr(o[s])?o[s]=To(i,o[s],(n?`${n}.`:"")+s.toString(),r):o[s]=i))}return o}function ba(e){return(...t)=>t.reduce((n,r)=>To(n,r,"",e),{})}const Ea=ba(),Nd=ba((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function $d(e,t){try{return t in e}catch{return!1}}var jd=Object.defineProperty,Dd=(e,t,n)=>t in e?jd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,At=(e,t,n)=>(Dd(e,typeof t!="symbol"?t+"":t,n),n);class Co extends Error{constructor(t,n={}){super(t,n),At(this,"statusCode",500),At(this,"fatal",!1),At(this,"unhandled",!1),At(this,"statusMessage"),At(this,"data"),At(this,"cause"),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:So(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=wa(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}At(Co,"__h3_error__",!0);function Ao(e){if(typeof e=="string")return new Co(e);if(Fd(e))return e;const t=new Co(e.message??e.statusMessage??"",{cause:e.cause||e});if($d(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=So(e.statusCode,t.statusCode):e.status&&(t.statusCode=So(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;wa(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function Fd(e){var t;return((t=e==null?void 0:e.constructor)==null?void 0:t.__h3_error__)===!0}const Bd=/[^\u0009\u0020-\u007E]/g;function wa(e=""){return e.replace(Bd,"")}function So(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Ra=Symbol("layout-meta"),$n=Symbol("route"),et=()=>{var e;return(e=ge())==null?void 0:e.$router},gs=()=>jl()?Ae($n,ge()._route):ge()._route;const Vd=()=>{try{if(ge()._processingMiddleware)return!0}catch{return!1}return!1},km=(e,t)=>{e||(e="/");const n=typeof e=="string"?e:ca(e.path||"/",e.query||{})+(e.hash||"");if(t!=null&&t.open){const{target:l="_blank",windowFeatures:a={}}=t.open,u=Object.entries(a).filter(([c,f])=>f!==void 0).map(([c,f])=>`${c.toLowerCase()}=${f}`).join(", ");return open(n,l,u),Promise.resolve()}const r=(t==null?void 0:t.external)||$t(n,{acceptRelative:!0});if(r){if(!(t!=null&&t.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const l=Cr(n).protocol;if(l&&Jf(l))throw new Error(`Cannot navigate to a URL with '${l}' protocol.`)}const o=Vd();if(!r&&o)return e;const s=et(),i=ge();return r?(i._scope.stop(),t!=null&&t.replace?location.replace(n):location.href=n,o?i.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):t!=null&&t.replace?s.replace(e):s.push(e)},Pa="__nuxt_error",Ar=()=>jc(ge().payload,"error"),Ut=e=>{const t=Sr(e);try{const n=ge(),r=Ar();n.hooks.callHook("app:error",t),r.value=r.value||t}catch{throw t}return t},Ud=async(e={})=>{const t=ge(),n=Ar();t.callHook("app:error:cleared",e),e.redirect&&await et().replace(e.redirect),n.value=null},Wd=e=>!!e&&typeof e=="object"&&Pa in e,Sr=e=>{const t=Ao(e);return Object.defineProperty(t,Pa,{value:!0,configurable:!1,writable:!1}),t},Kd="modulepreload",qd=function(e,t){return e[0]==="."?new URL(e,t).href:e},gi={},zd=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=qd(a,r),a in gi)return;gi[a]=!0;const u=a.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(!!r)for(let g=s.length-1;g>=0;g--){const v=s[g];if(v.href===a&&(!u||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${c}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":Kd,u||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((g,v)=>{d.addEventListener("load",g),d.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},J=(...e)=>zd(...e).catch(t=>{const n=new Event("nuxt.preloadError");throw n.payload=t,window.dispatchEvent(n),t}),Gd=-1,Jd=-2,Qd=-3,Xd=-4,Yd=-5,Zd=-6;function eh(e,t){return th(JSON.parse(e),t)}function th(e,t){if(typeof e=="number")return o(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function o(s,i=!1){if(s===Gd)return;if(s===Qd)return NaN;if(s===Xd)return 1/0;if(s===Yd)return-1/0;if(s===Zd)return-0;if(i)throw new Error("Invalid input");if(s in r)return r[s];const l=n[s];if(!l||typeof l!="object")r[s]=l;else if(Array.isArray(l))if(typeof l[0]=="string"){const a=l[0],u=t==null?void 0:t[a];if(u)return r[s]=u(o(l[1]));switch(a){case"Date":r[s]=new Date(l[1]);break;case"Set":const c=new Set;r[s]=c;for(let g=1;g>>9)+65536).toString(16).substring(1,8).toLowerCase()}function mi(e){return e._h||ms(e._d?e._d:`${e.tag}:${e.textContent||e.innerHTML||""}:${Object.entries(e.props).map(([t,n])=>`${t}:${String(n)}`).join(",")}`)}function Ca(e,t){const{props:n,tag:r}=e;if(sh.includes(r))return r;if(r==="link"&&n.rel==="canonical")return"canonical";if(n.charset)return"charset";const o=["id"];r==="meta"&&o.push("name","property","http-equiv");for(const s of o)if(typeof n[s]<"u"){const i=String(n[s]);return t&&!t(i)?!1:`${r}:${s}:${i}`}return!1}function yi(e,t){return e==null?t||null:typeof e=="function"?e(t):e}async function lh(e,t,n){const r={tag:e,props:await Aa(typeof t=="object"&&typeof t!="function"&&!(t instanceof Promise)?{...t}:{[["script","noscript","style"].includes(e)?"innerHTML":"textContent"]:t},["templateParams","titleTemplate"].includes(e))};return Ta.forEach(o=>{const s=typeof r.props[o]<"u"?r.props[o]:n[o];typeof s<"u"&&((!["innerHTML","textContent","children"].includes(o)||rh.includes(r.tag))&&(r[o==="children"?"innerHTML":o]=s),delete r.props[o])}),r.props.body&&(r.tagPosition="bodyClose",delete r.props.body),r.tag==="script"&&typeof r.innerHTML=="object"&&(r.innerHTML=JSON.stringify(r.innerHTML),r.props.type=r.props.type||"application/json"),Array.isArray(r.props.content)?r.props.content.map(o=>({...r,props:{...r.props,content:o}})):r}function ah(e,t){var r;const n=e==="class"?" ":";";return typeof t=="object"&&!Array.isArray(t)&&(t=Object.entries(t).filter(([,o])=>o).map(([o,s])=>e==="style"?`${o}:${s}`:o)),(r=Array.isArray(t)?t.join(n):t)==null?void 0:r.split(n).filter(o=>o.trim()).filter(Boolean).join(n)}async function Aa(e,t){for(const n of Object.keys(e)){if(["class","style"].includes(n)){e[n]=ah(n,e[n]);continue}if(e[n]instanceof Promise&&(e[n]=await e[n]),!t&&!Ta.includes(n)){const r=String(e[n]),o=n.startsWith("data-");r==="true"||r===""?e[n]=o?"true":!0:e[n]||(o&&r==="false"?e[n]="false":delete e[n])}}return e}const ch=10;async function uh(e){const t=[];return Object.entries(e.resolvedInput).filter(([n,r])=>typeof r<"u"&&oh.includes(n)).forEach(([n,r])=>{const o=nh(r);t.push(...o.map(s=>lh(n,s,e)).flat())}),(await Promise.all(t)).flat().filter(Boolean).map((n,r)=>(n._e=e._i,e.mode&&(n._m=e.mode),n._p=(e._i<a&&a[u]||void 0,t):l=t[i],typeof l<"u"?(l||"").replace(/"/g,'\\"'):!1}let o=e;try{o=decodeURI(e)}catch{}return(o.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(i=>{const l=r(i.slice(1));typeof l=="string"&&(e=e.replace(new RegExp(`\\${i}(\\W|$)`,"g"),(a,u)=>`${l}${u}`).trim())}),e.includes(ft)&&(e.endsWith(ft)&&(e=e.slice(0,-ft.length).trim()),e.startsWith(ft)&&(e=e.slice(ft.length).trim()),e=e.replace(new RegExp(`\\${ft}\\s*\\${ft}`,"g"),ft),e=Zn(e,{separator:n},n)),e}async function Sa(e,t={}){var c;const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const r={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",r),!r.shouldRender)return;const o=(await e.resolveTags()).map(f=>({tag:f,id:Yn.includes(f.tag)?mi(f):f.tag,shouldRender:!0}));let s=e._dom;if(!s){s={elMap:{htmlAttrs:n.documentElement,bodyAttrs:n.body}};for(const f of["body","head"]){const d=(c=n[f])==null?void 0:c.children,g=[];for(const v of[...d].filter(P=>Yn.includes(P.tagName.toLowerCase()))){const P={tag:v.tagName.toLowerCase(),props:await Aa(v.getAttributeNames().reduce((y,m)=>({...y,[m]:v.getAttribute(m)}),{})),innerHTML:v.innerHTML};let k=1,A=Ca(P);for(;A&&g.find(y=>y._d===A);)A=`${A}:${k++}`;P._d=A||void 0,g.push(P),s.elMap[v.getAttribute("data-hid")||mi(P)]=v}}}s.pendingSideEffects={...s.sideEffects||{}},s.sideEffects={};function i(f,d,g){const v=`${f}:${d}`;s.sideEffects[v]=g,delete s.pendingSideEffects[v]}function l({id:f,$el:d,tag:g}){const v=g.tag.endsWith("Attrs");s.elMap[f]=d,v||(["textContent","innerHTML"].forEach(P=>{g[P]&&g[P]!==d[P]&&(d[P]=g[P])}),i(f,"el",()=>{var P;(P=s.elMap[f])==null||P.remove(),delete s.elMap[f]}));for(const[P,k]of Object.entries(g._eventHandlers||{}))d.getAttribute(`data-${P}`)!==""&&((g.tag==="bodyAttrs"?n.defaultView:d).addEventListener(P.replace("on",""),k.bind(d)),d.setAttribute(`data-${P}`,""));Object.entries(g.props).forEach(([P,k])=>{const A=`attr:${P}`;if(P==="class")for(const y of(k||"").split(" ").filter(Boolean))v&&i(f,`${A}:${y}`,()=>d.classList.remove(y)),!d.classList.contains(y)&&d.classList.add(y);else if(P==="style")for(const y of(k||"").split(";").filter(Boolean)){const[m,..._]=y.split(":").map(w=>w.trim());i(f,`${A}:${y}:${m}`,()=>{d.style.removeProperty(m)}),d.style.setProperty(m,_.join(":"))}else d.getAttribute(P)!==k&&d.setAttribute(P,k===!0?"":String(k)),v&&i(f,A,()=>d.removeAttribute(P))})}const a=[],u={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const f of o){const{tag:d,shouldRender:g,id:v}=f;if(g){if(d.tag==="title"){n.title=d.textContent;continue}f.$el=f.$el||s.elMap[v],f.$el?l(f):Yn.includes(d.tag)&&a.push(f)}}for(const f of a){const d=f.tag.tagPosition||"head";f.$el=n.createElement(f.tag.tag),l(f),u[d]=u[d]||n.createDocumentFragment(),u[d].appendChild(f.$el)}for(const f of o)await e.hooks.callHook("dom:renderTag",f,n,i);u.head&&n.head.appendChild(u.head),u.bodyOpen&&n.body.insertBefore(u.bodyOpen,n.body.firstChild),u.bodyClose&&n.body.appendChild(u.bodyClose),Object.values(s.pendingSideEffects).forEach(f=>f()),e._dom=s,e.dirty=!1,await e.hooks.callHook("dom:rendered",{renders:o})}async function dh(e,t={}){const n=t.delayFn||(r=>setTimeout(r,10));return e._domUpdatePromise=e._domUpdatePromise||new Promise(r=>n(async()=>{await Sa(e,t),delete e._domUpdatePromise,r()}))}function hh(e){return t=>{var r,o;const n=((o=(r=t.resolvedOptions.document)==null?void 0:r.head.querySelector('script[id="unhead:payload"]'))==null?void 0:o.innerHTML)||!1;return n&&t.push(JSON.parse(n)),{mode:"client",hooks:{"entries:updated":function(s){dh(s,e)}}}}}const ph=["templateParams","htmlAttrs","bodyAttrs"],gh={hooks:{"tag:normalise":function({tag:e}){["hid","vmid","key"].forEach(r=>{e.props[r]&&(e.key=e.props[r],delete e.props[r])});const n=Ca(e)||(e.key?`${e.tag}:${e.key}`:!1);n&&(e._d=n)},"tags:resolve":function(e){const t={};e.tags.forEach(r=>{const o=(r.key?`${r.tag}:${r.key}`:r._d)||r._p,s=t[o];if(s){let l=r==null?void 0:r.tagDuplicateStrategy;if(!l&&ph.includes(r.tag)&&(l="merge"),l==="merge"){const a=s.props;["class","style"].forEach(u=>{a[u]&&(r.props[u]?(u==="style"&&!a[u].endsWith(";")&&(a[u]+=";"),r.props[u]=`${a[u]} ${r.props[u]}`):r.props[u]=a[u])}),t[o].props={...a,...r.props};return}else if(r._e===s._e){s._duped=s._duped||[],r._d=`${s._d}:${s._duped.length+1}`,s._duped.push(r);return}else if(pr(r)>pr(s))return}const i=Object.keys(r.props).length+(r.innerHTML?1:0)+(r.textContent?1:0);if(Yn.includes(r.tag)&&i===0){delete t[o];return}t[o]=r});const n=[];Object.values(t).forEach(r=>{const o=r._duped;delete r._duped,n.push(r),o&&n.push(...o)}),e.tags=n,e.tags=e.tags.filter(r=>!(r.tag==="meta"&&(r.props.name||r.props.property)&&!r.props.content))}}},mh={mode:"server",hooks:{"tags:resolve":function(e){const t={};e.tags.filter(n=>["titleTemplate","templateParams","title"].includes(n.tag)&&n._m==="server").forEach(n=>{t[n.tag]=n.tag.startsWith("title")?n.textContent:n.props}),Object.keys(t).length&&e.tags.push({tag:"script",innerHTML:JSON.stringify(t),props:{id:"unhead:payload",type:"application/json"}})}}},yh=["script","link","bodyAttrs"],_h=e=>({hooks:{"tags:resolve":function(t){for(const n of t.tags.filter(r=>yh.includes(r.tag)))Object.entries(n.props).forEach(([r,o])=>{r.startsWith("on")&&typeof o=="function"&&(e.ssr&&bi.includes(r)?n.props[r]=`this.dataset.${r}fired = true`:delete n.props[r],n._eventHandlers=n._eventHandlers||{},n._eventHandlers[r]=o)}),e.ssr&&n._eventHandlers&&(n.props.src||n.props.href)&&(n.key=n.key||ms(n.props.src||n.props.href))},"dom:renderTag":function({$el:t,tag:n}){var r,o;for(const s of Object.keys((t==null?void 0:t.dataset)||{}).filter(i=>bi.some(l=>`${l}fired`===i))){const i=s.replace("fired","");(o=(r=n._eventHandlers)==null?void 0:r[i])==null||o.call(t,new Event(i.replace("on","")))}}}}),vh=["link","style","script","noscript"],bh={hooks:{"tag:normalise":({tag:e})=>{e.key&&vh.includes(e.tag)&&(e.props["data-hid"]=e._h=ms(e.key))}}},Eh={hooks:{"tags:resolve":e=>{const t=n=>{var r;return(r=e.tags.find(o=>o._d===n))==null?void 0:r._p};for(const{prefix:n,offset:r}of fh)for(const o of e.tags.filter(s=>typeof s.tagPriority=="string"&&s.tagPriority.startsWith(n))){const s=t(o.tagPriority.replace(n,""));typeof s<"u"&&(o._p=s+r)}e.tags.sort((n,r)=>n._p-r._p).sort((n,r)=>pr(n)-pr(r))}}},wh={meta:"content",link:"href",htmlAttrs:"lang"},Rh=e=>({hooks:{"tags:resolve":t=>{var l;const{tags:n}=t,r=(l=n.find(a=>a.tag==="title"))==null?void 0:l.textContent,o=n.findIndex(a=>a.tag==="templateParams"),s=o!==-1?n[o].props:{},i=s.separator||"|";delete s.separator,s.pageTitle=Zn(s.pageTitle||r||"",s,i);for(const a of n.filter(u=>u.processTemplateParams!==!1)){const u=wh[a.tag];u&&typeof a.props[u]=="string"?a.props[u]=Zn(a.props[u],s,i):(a.processTemplateParams===!0||["titleTemplate","title"].includes(a.tag))&&["innerHTML","textContent"].forEach(c=>{typeof a[c]=="string"&&(a[c]=Zn(a[c],s,i))})}e._templateParams=s,e._separator=i,t.tags=n.filter(a=>a.tag!=="templateParams")}}}),Ph={hooks:{"tags:resolve":e=>{const{tags:t}=e;let n=t.findIndex(o=>o.tag==="titleTemplate");const r=t.findIndex(o=>o.tag==="title");if(r!==-1&&n!==-1){const o=yi(t[n].textContent,t[r].textContent);o!==null?t[r].textContent=o||t[r].textContent:delete t[r]}else if(n!==-1){const o=yi(t[n].textContent);o!==null&&(t[n].textContent=o,t[n].tag="title",n=-1)}n!==-1&&delete t[n],e.tags=t.filter(Boolean)}}},Th={hooks:{"tags:afterResolve":function(e){for(const t of e.tags)typeof t.innerHTML=="string"&&(t.innerHTML&&["application/ld+json","application/json"].includes(t.props.type)?t.innerHTML=t.innerHTML.replace(/{l.dirty=!0,t.callHook("entries:updated",l)};let o=0,s=[];const i=[],l={plugins:i,dirty:!1,resolvedOptions:e,hooks:t,headEntries(){return s},use(a){const u=typeof a=="function"?a(l):a;(!u.key||!i.some(c=>c.key===u.key))&&(i.push(u),Ei(u.mode,n)&&t.addHooks(u.hooks||{}))},push(a,u){u==null||delete u.head;const c={_i:o++,input:a,...u};return Ei(c.mode,n)&&(s.push(c),r()),{dispose(){s=s.filter(f=>f._i!==c._i),t.callHook("entries:updated",l),r()},patch(f){s=s.map(d=>(d._i===c._i&&(d.input=c.input=f),d)),r()}}},async resolveTags(){const a={tags:[],entries:[...s]};await t.callHook("entries:resolve",a);for(const u of a.entries){const c=u.resolvedInput||u.input;if(u.resolvedInput=await(u.transform?u.transform(c):c),u.resolvedInput)for(const f of await uh(u)){const d={tag:f,entry:u,resolvedOptions:l.resolvedOptions};await t.callHook("tag:normalise",d),a.tags.push(d.tag)}}return await t.callHook("tags:beforeResolve",a),await t.callHook("tags:resolve",a),await t.callHook("tags:afterResolve",a),a.tags},ssr:n};return[gh,mh,_h,bh,Eh,Rh,Ph,Th,...(e==null?void 0:e.plugins)||[]].forEach(a=>l.use(a)),l.hooks.callHook("init",l),l}function Sh(){return xa}const xh=oa.startsWith("3");function kh(e){return typeof e=="function"?e():ue(e)}function xo(e,t=""){if(e instanceof Promise)return e;const n=kh(e);return!e||!n?n:Array.isArray(n)?n.map(r=>xo(r,t)):typeof n=="object"?Object.fromEntries(Object.entries(n).map(([r,o])=>r==="titleTemplate"||r.startsWith("on")?[r,ue(o)]:[r,xo(o,r)])):n}const Lh={hooks:{"entries:resolve":function(e){for(const t of e.entries)t.resolvedInput=xo(t.input)}}},ka="usehead";function Oh(e){return{install(n){xh&&(n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(ka,e))}}.install}function Ih(e={}){e.domDelayFn=e.domDelayFn||(n=>ln(()=>setTimeout(()=>n(),0)));const t=Ch(e);return t.use(Lh),t.install=Oh(t),t}const ko=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Lo="__unhead_injection_handler__";function Hh(e){ko[Lo]=e}function Lm(){if(Lo in ko)return ko[Lo]();const e=Ae(ka);return e||Sh()}const Mh={nuxt:{buildId:"d8c635a6-4df4-43ae-ac4a-a06023848560"}},Nh=Nd(Mh);function La(){const e=ge();return e._appConfig||(e._appConfig=wt(Nh)),e._appConfig}const $h=!1,Oo=!1,jh=!1,Om={trailingSlash:"append",componentName:"NuxtLink"},Im={deep:!0},Dh="#__nuxt";let er,Oa;function Fh(){var t;const e=(t=La().nuxt)==null?void 0:t.buildId;return er=$fetch(hs(`builds/meta/${e}.json`)),er.then(n=>{Oa=Md(n.matcher)}),er}function xr(){return er||Fh()}async function ys(e){return await xr(),Ea({},...Oa.matchAll(e).reverse())}function wi(e,t={}){const n=Vh(e,t),r=ge(),o=r._payloadCache=r._payloadCache||{};return n in o||(o[n]=Uh(e).then(s=>s?Ia(n).then(i=>i||(delete o[n],null)):(o[n]=null,null))),o[n]}const Bh="_payload.json";function Vh(e,t={}){var o;const n=new URL(e,"http://localhost");if(n.host!=="localhost"||$t(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const r=t.hash||(t.fresh?Date.now():(o=La().nuxt)==null?void 0:o.buildId);return fs(ps().app.baseURL,n.pathname,Bh+(r?`?${r}`:""))}async function Ia(e){const t=fetch(e).then(n=>n.text().then(Ha));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}async function Uh(e=gs().path){if(e=us(e),(await xr()).prerendered.includes(e))return!0;const n=await ys(e);return!!n.prerender&&!n.redirect}let Jn=null;async function Wh(){if(Jn)return Jn;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await Ha(e.textContent||""),n=e.dataset.src?await Ia(e.dataset.src):void 0;return Jn={...t,...n,...window.__NUXT__},Jn}async function Ha(e){return await eh(e,ge()._payloadRevivers)}function Kh(e,t){ge()._payloadRevivers[e]=t}const Ri={NuxtError:e=>Sr(e),EmptyShallowRef:e=>Rn(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),EmptyRef:e=>qe(e==="_"?void 0:e==="0n"?BigInt(0):ur(e)),ShallowRef:e=>Rn(e),ShallowReactive:e=>In(e),Ref:e=>qe(e),Reactive:e=>wt(e)},qh=Rt({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const r in Ri)Kh(r,Ri[r]);Object.assign(e.payload,([t,n]=Sn(()=>e.runWithContext(Wh)),t=await t,n(),t)),window.__NUXT__=e.payload}}),zh=[],Gh=Rt({name:"nuxt:head",enforce:"pre",setup(e){const t=Ih({plugins:zh});Hh(()=>ge().vueApp._context.provides.usehead),e.vueApp.use(t);{let n=!0;const r=async()=>{n=!1,await Sa(t)};t.hooks.hook("dom:beforeRender",o=>{o.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||r()}),e.hooks.hook("app:error",r),e.hooks.hook("app:suspense:resolve",r)}}});/*! - * vue-router v4.3.0 - * (c) 2024 Eduardo San Martin Morote - * @license MIT - */const Bt=typeof document<"u";function Jh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const se=Object.assign;function qr(e,t){const n={};for(const r in t){const o=t[r];n[r]=ze(o)?o.map(e):e(o)}return n}const vn=()=>{},ze=Array.isArray,Ma=/#/g,Qh=/&/g,Xh=/\//g,Yh=/=/g,Zh=/\?/g,Na=/\+/g,ep=/%5B/g,tp=/%5D/g,$a=/%5E/g,np=/%60/g,ja=/%7B/g,rp=/%7C/g,Da=/%7D/g,op=/%20/g;function _s(e){return encodeURI(""+e).replace(rp,"|").replace(ep,"[").replace(tp,"]")}function sp(e){return _s(e).replace(ja,"{").replace(Da,"}").replace($a,"^")}function Io(e){return _s(e).replace(Na,"%2B").replace(op,"+").replace(Ma,"%23").replace(Qh,"%26").replace(np,"`").replace(ja,"{").replace(Da,"}").replace($a,"^")}function ip(e){return Io(e).replace(Yh,"%3D")}function lp(e){return _s(e).replace(Ma,"%23").replace(Zh,"%3F")}function ap(e){return e==null?"":lp(e).replace(Xh,"%2F")}function xn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const cp=/\/$/,up=e=>e.replace(cp,"");function zr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=pp(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:xn(i)}}function fp(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Pi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function dp(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&tn(t.matched[r],n.matched[o])&&Fa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Fa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!hp(e[n],t[n]))return!1;return!0}function hp(e,t){return ze(e)?Ti(e,t):ze(t)?Ti(t,e):e===t}function Ti(e,t){return ze(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function pp(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}var kn;(function(e){e.pop="pop",e.push="push"})(kn||(kn={}));var bn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(bn||(bn={}));function gp(e){if(!e)if(Bt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),up(e)}const mp=/^[^#]+#/;function yp(e,t){return e.replace(mp,"#")+t}function _p(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const kr=()=>({left:window.scrollX,top:window.scrollY});function vp(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=_p(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ci(e,t){return(history.state?history.state.position-t:-1)+e}const Ho=new Map;function bp(e,t){Ho.set(e,t)}function Ep(e){const t=Ho.get(e);return Ho.delete(e),t}let wp=()=>location.protocol+"//"+location.host;function Ba(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),Pi(a,"")}return Pi(n,e)+r+o}function Rp(e,t,n,r){let o=[],s=[],i=null;const l=({state:d})=>{const g=Ba(e,location),v=n.value,P=t.value;let k=0;if(d){if(n.value=g,t.value=d,i&&i===v){i=null;return}k=P?d.position-P.position:0}else r(g);o.forEach(A=>{A(n.value,v,{delta:k,type:kn.pop,direction:k?k>0?bn.forward:bn.back:bn.unknown})})};function a(){i=n.value}function u(d){o.push(d);const g=()=>{const v=o.indexOf(d);v>-1&&o.splice(v,1)};return s.push(g),g}function c(){const{history:d}=window;d.state&&d.replaceState(se({},d.state,{scroll:kr()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:a,listen:u,destroy:f}}function Ai(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?kr():null}}function Pp(e){const{history:t,location:n}=window,r={value:Ba(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,u,c){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:wp()+e+a;try{t[c?"replaceState":"pushState"](u,"",d),o.value=u}catch(g){console.error(g),n[c?"replace":"assign"](d)}}function i(a,u){const c=se({},t.state,Ai(o.value.back,a,o.value.forward,!0),u,{position:o.value.position});s(a,c,!0),r.value=a}function l(a,u){const c=se({},o.value,t.state,{forward:a,scroll:kr()});s(c.current,c,!0);const f=se({},Ai(r.value,a,null),{position:c.position+1},u);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Va(e){e=gp(e);const t=Pp(e),n=Rp(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=se({location:"",base:e,go:r,createHref:yp.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Tp(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Va(e)}function Cp(e){return typeof e=="string"||e&&typeof e=="object"}function Ua(e){return typeof e=="string"||typeof e=="symbol"}const We={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Wa=Symbol("");var Si;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Si||(Si={}));function nn(e,t){return se(new Error,{type:e,[Wa]:!0},t)}function tt(e,t){return e instanceof Error&&Wa in e&&(t==null||!!(e.type&t))}const xi="[^/]+?",Ap={sensitive:!1,strict:!1,start:!0,end:!0},Sp=/[.+*?^${}()[\]/\\]/g;function xp(e,t){const n=se({},Ap,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function Lp(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Op={type:0,value:""},Ip=/[a-zA-Z0-9_]/;function Hp(e){if(!e)return[[]];if(e==="/")return[[Op]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${u}": ${g}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function d(){u+=a}for(;l{i(y)}:vn}function i(c){if(Ua(c)){const f=r.get(c);f&&(r.delete(c),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(c);f>-1&&(n.splice(f,1),c.record.name&&r.delete(c.record.name),c.children.forEach(i),c.alias.forEach(i))}}function l(){return n}function a(c){let f=0;for(;f=0&&(c.record.path!==n[f].record.path||!Ka(c,n[f]));)f++;n.splice(f,0,c),c.record.name&&!Oi(c)&&r.set(c.record.name,c)}function u(c,f){let d,g={},v,P;if("name"in c&&c.name){if(d=r.get(c.name),!d)throw nn(1,{location:c});P=d.record.name,g=se(Li(f.params,d.keys.filter(y=>!y.optional).concat(d.parent?d.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),c.params&&Li(c.params,d.keys.map(y=>y.name))),v=d.stringify(g)}else if(c.path!=null)v=c.path,d=n.find(y=>y.re.test(v)),d&&(g=d.parse(v),P=d.record.name);else{if(d=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!d)throw nn(1,{location:c,currentLocation:f});P=d.record.name,g=se({},f.params,c.params),v=d.stringify(g)}const k=[];let A=d;for(;A;)k.unshift(A.record),A=A.parent;return{name:P,path:v,params:g,matched:k,meta:Dp(k)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function Li(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function $p(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:jp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function jp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Oi(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Dp(e){return e.reduce((t,n)=>se(t,n.meta),{})}function Ii(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ka(e,t){return t.children.some(n=>n===e||Ka(e,n))}function Fp(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Io(s)):[r&&Io(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Bp(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ze(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Vp=Symbol(""),Mi=Symbol(""),vs=Symbol(""),bs=Symbol(""),Mo=Symbol("");function un(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function mt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const u=d=>{d===!1?a(nn(4,{from:n,to:t})):d instanceof Error?a(d):Cp(d)?a(nn(2,{from:t,to:d})):(i&&r.enterCallbacks[o]===i&&typeof d=="function"&&i.push(d),l())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(d=>a(d))})}function Gr(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Up(a)){const c=(a.__vccOpts||a)[t];c&&s.push(mt(c,n,r,i,l,o))}else{let u=a();s.push(()=>u.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${l}" at "${i.path}"`));const f=Jh(c)?c.default:c;i.components[l]=f;const g=(f.__vccOpts||f)[t];return g&&mt(g,n,r,i,l,o)()}))}}return s}function Up(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Ni(e){const t=Ae(vs),n=Ae(bs),r=Le(()=>t.resolve(ue(e.to))),o=Le(()=>{const{matched:a}=r.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const d=f.findIndex(tn.bind(null,c));if(d>-1)return d;const g=$i(a[u-2]);return u>1&&$i(c)===g&&f[f.length-1].path!==g?f.findIndex(tn.bind(null,a[u-2])):d}),s=Le(()=>o.value>-1&&zp(n.params,r.value.params)),i=Le(()=>o.value>-1&&o.value===n.matched.length-1&&Fa(n.params,r.value.params));function l(a={}){return qp(a)?t[ue(e.replace)?"replace":"push"](ue(e.to)).catch(vn):Promise.resolve()}return{route:r,href:Le(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Wp=ot({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ni,setup(e,{slots:t}){const n=wt(Ni(e)),{options:r}=Ae(vs),o=Le(()=>({[ji(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[ji(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Oe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Kp=Wp;function qp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zp(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ze(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function $i(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const ji=(e,t,n)=>e??t??n,Gp=ot({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Ae(Mo),o=Le(()=>e.route||r.value),s=Ae(Mi,0),i=Le(()=>{let u=ue(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=Le(()=>o.value.matched[i.value]);Ot(Mi,Le(()=>i.value+1)),Ot(Vp,l),Ot(Mo,o);const a=qe();return Qt(()=>[a.value,l.value,e.name],([u,c,f],[d,g,v])=>{c&&(c.instances[f]=u,g&&g!==c&&u&&u===d&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),u&&c&&(!g||!tn(c,g)||!d)&&(c.enterCallbacks[f]||[]).forEach(P=>P(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=l.value,d=f&&f.components[c];if(!d)return Di(n.default,{Component:d,route:u});const g=f.props[c],v=g?g===!0?u.params:typeof g=="function"?g(u):g:null,k=Oe(d,se({},v,t,{onVnodeUnmounted:A=>{A.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return Di(n.default,{Component:k,route:u})||k}}});function Di(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const qa=Gp;function Jp(e){const t=Np(e.routes,e),n=e.parseQuery||Fp,r=e.stringifyQuery||Hi,o=e.history,s=un(),i=un(),l=un(),a=Rn(We);let u=We;Bt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=qr.bind(null,T=>""+T),f=qr.bind(null,ap),d=qr.bind(null,xn);function g(T,F){let j,U;return Ua(T)?(j=t.getRecordMatcher(T),U=F):U=T,t.addRoute(U,j)}function v(T){const F=t.getRecordMatcher(T);F&&t.removeRoute(F)}function P(){return t.getRoutes().map(T=>T.record)}function k(T){return!!t.getRecordMatcher(T)}function A(T,F){if(F=se({},F||a.value),typeof T=="string"){const p=zr(n,T,F.path),b=t.resolve({path:p.path},F),C=o.createHref(p.fullPath);return se(p,b,{params:d(b.params),hash:xn(p.hash),redirectedFrom:void 0,href:C})}let j;if(T.path!=null)j=se({},T,{path:zr(n,T.path,F.path).path});else{const p=se({},T.params);for(const b in p)p[b]==null&&delete p[b];j=se({},T,{params:f(p)}),F.params=f(F.params)}const U=t.resolve(j,F),oe=T.hash||"";U.params=c(d(U.params));const de=fp(r,se({},T,{hash:sp(oe),path:U.path})),h=o.createHref(de);return se({fullPath:de,hash:oe,query:r===Hi?Bp(T.query):T.query||{}},U,{redirectedFrom:void 0,href:h})}function y(T){return typeof T=="string"?zr(n,T,a.value.path):se({},T)}function m(T,F){if(u!==T)return nn(8,{from:F,to:T})}function _(T){return L(T)}function w(T){return _(se(y(T),{replace:!0}))}function E(T){const F=T.matched[T.matched.length-1];if(F&&F.redirect){const{redirect:j}=F;let U=typeof j=="function"?j(T):j;return typeof U=="string"&&(U=U.includes("?")||U.includes("#")?U=y(U):{path:U},U.params={}),se({query:T.query,hash:T.hash,params:U.path!=null?{}:T.params},U)}}function L(T,F){const j=u=A(T),U=a.value,oe=T.state,de=T.force,h=T.replace===!0,p=E(j);if(p)return L(se(y(p),{state:typeof p=="object"?se({},oe,p.state):oe,force:de,replace:h}),F||j);const b=j;b.redirectedFrom=F;let C;return!de&&dp(r,U,j)&&(C=nn(16,{to:b,from:U}),Ge(U,U,!0,!1)),(C?Promise.resolve(C):N(b,U)).catch(R=>tt(R)?tt(R,2)?R:it(R):W(R,b,U)).then(R=>{if(R){if(tt(R,2))return L(se({replace:h},y(R.to),{state:typeof R.to=="object"?se({},oe,R.to.state):oe,force:de}),F||b)}else R=H(b,U,!0,h,oe);return Q(b,U,R),R})}function S(T,F){const j=m(T,F);return j?Promise.reject(j):Promise.resolve()}function $(T){const F=Dt.values().next().value;return F&&typeof F.runWithContext=="function"?F.runWithContext(T):T()}function N(T,F){let j;const[U,oe,de]=Qp(T,F);j=Gr(U.reverse(),"beforeRouteLeave",T,F);for(const p of U)p.leaveGuards.forEach(b=>{j.push(mt(b,T,F))});const h=S.bind(null,T,F);return j.push(h),we(j).then(()=>{j=[];for(const p of s.list())j.push(mt(p,T,F));return j.push(h),we(j)}).then(()=>{j=Gr(oe,"beforeRouteUpdate",T,F);for(const p of oe)p.updateGuards.forEach(b=>{j.push(mt(b,T,F))});return j.push(h),we(j)}).then(()=>{j=[];for(const p of de)if(p.beforeEnter)if(ze(p.beforeEnter))for(const b of p.beforeEnter)j.push(mt(b,T,F));else j.push(mt(p.beforeEnter,T,F));return j.push(h),we(j)}).then(()=>(T.matched.forEach(p=>p.enterCallbacks={}),j=Gr(de,"beforeRouteEnter",T,F,$),j.push(h),we(j))).then(()=>{j=[];for(const p of i.list())j.push(mt(p,T,F));return j.push(h),we(j)}).catch(p=>tt(p,8)?p:Promise.reject(p))}function Q(T,F,j){l.list().forEach(U=>$(()=>U(T,F,j)))}function H(T,F,j,U,oe){const de=m(T,F);if(de)return de;const h=F===We,p=Bt?history.state:{};j&&(U||h?o.replace(T.fullPath,se({scroll:h&&p&&p.scroll},oe)):o.push(T.fullPath,oe)),a.value=T,Ge(T,F,j,h),it()}let G;function le(){G||(G=o.listen((T,F,j)=>{if(!jn.listening)return;const U=A(T),oe=E(U);if(oe){L(se(oe,{replace:!0}),U).catch(vn);return}u=U;const de=a.value;Bt&&bp(Ci(de.fullPath,j.delta),kr()),N(U,de).catch(h=>tt(h,12)?h:tt(h,2)?(L(h.to,U).then(p=>{tt(p,20)&&!j.delta&&j.type===kn.pop&&o.go(-1,!1)}).catch(vn),Promise.reject()):(j.delta&&o.go(-j.delta,!1),W(h,U,de))).then(h=>{h=h||H(U,de,!1),h&&(j.delta&&!tt(h,8)?o.go(-j.delta,!1):j.type===kn.pop&&tt(h,20)&&o.go(-1,!1)),Q(U,de,h)}).catch(vn)}))}let ae=un(),V=un(),Z;function W(T,F,j){it(T);const U=V.list();return U.length?U.forEach(oe=>oe(T,F,j)):console.error(T),Promise.reject(T)}function Ve(){return Z&&a.value!==We?Promise.resolve():new Promise((T,F)=>{ae.add([T,F])})}function it(T){return Z||(Z=!T,le(),ae.list().forEach(([F,j])=>T?j(T):F()),ae.reset()),T}function Ge(T,F,j,U){const{scrollBehavior:oe}=e;if(!Bt||!oe)return Promise.resolve();const de=!j&&Ep(Ci(T.fullPath,0))||(U||!j)&&history.state&&history.state.scroll||null;return ln().then(()=>oe(T,F,de)).then(h=>h&&vp(h)).catch(h=>W(h,T,F))}const xe=T=>o.go(T);let jt;const Dt=new Set,jn={currentRoute:a,listening:!0,addRoute:g,removeRoute:v,hasRoute:k,getRoutes:P,resolve:A,options:e,push:_,replace:w,go:xe,back:()=>xe(-1),forward:()=>xe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:V.add,isReady:Ve,install(T){const F=this;T.component("RouterLink",Kp),T.component("RouterView",qa),T.config.globalProperties.$router=F,Object.defineProperty(T.config.globalProperties,"$route",{enumerable:!0,get:()=>ue(a)}),Bt&&!jt&&a.value===We&&(jt=!0,_(o.location).catch(oe=>{}));const j={};for(const oe in We)Object.defineProperty(j,oe,{get:()=>a.value[oe],enumerable:!0});T.provide(vs,F),T.provide(bs,In(j)),T.provide(Mo,a);const U=T.unmount;Dt.add(T),T.unmount=function(){Dt.delete(T),Dt.size<1&&(u=We,G&&G(),G=null,a.value=We,jt=!1,Z=!1),U()}}};function we(T){return T.reduce((F,j)=>F.then(()=>$(j)),Promise.resolve())}return jn}function Qp(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;itn(u,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(u=>tn(u,a))||o.push(a))}return[n,r,o]}function Xp(){return Ae(bs)}const Yp=(e,t)=>t.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""}),No=(e,t)=>{const n=e.route.matched.find(o=>{var s;return((s=o.components)==null?void 0:s.default)===e.Component.type}),r=t??(n==null?void 0:n.meta.key)??(n&&Yp(e.route,n));return typeof r=="function"?r(e.route):r},Zp=(e,t)=>({default:()=>e?Oe(au,e===!0?{}:e,t):t});function Es(e){return Array.isArray(e)?e:[e]}const Jr=null,Qr=null,Xr=null,Yr=null,Zr=null,eo=null,to=null,no=null,ro=null,Fi=[{name:"case-studies-automatisch",path:"/case-studies/automatisch",meta:{},alias:[],redirect:Jr==null?void 0:Jr.redirect,component:()=>J(()=>import("./CCgfT4mO.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"case-studies",path:"/case-studies",meta:{},alias:[],redirect:Qr==null?void 0:Qr.redirect,component:()=>J(()=>import("./BMo7zexA.js"),__vite__mapDeps([12,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"index",path:"/",meta:{},alias:[],redirect:Xr==null?void 0:Xr.redirect,component:()=>J(()=>import("./DS-4onvx.js"),__vite__mapDeps([13,11,9,1,2,3,14,15]),import.meta.url).then(e=>e.default||e)},{name:"playwright-architecture",path:"/playwright/architecture",meta:{},alias:[],redirect:Yr==null?void 0:Yr.redirect,component:()=>J(()=>import("./ZkJgmw7I.js"),__vite__mapDeps([16,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright-how-playwright-initializes",path:"/playwright/how-playwright-initializes",meta:{},alias:[],redirect:Zr==null?void 0:Zr.redirect,component:()=>J(()=>import("./BqBwjWqG.js"),__vite__mapDeps([17,4,2,5,6,7,8,9,10,11]),import.meta.url).then(e=>e.default||e)},{name:"playwright",path:"/playwright",meta:{},alias:[],redirect:eo==null?void 0:eo.redirect,component:()=>J(()=>import("./Cn1tIV_T.js"),__vite__mapDeps([18,2,9,10,8,11]),import.meta.url).then(e=>e.default||e)},{name:"privacy-policy",path:"/privacy-policy",meta:{},alias:[],redirect:to==null?void 0:to.redirect,component:()=>J(()=>import("./BK5dMROA.js"),__vite__mapDeps([19,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-and-conditions",path:"/terms-and-conditions",meta:{},alias:[],redirect:no==null?void 0:no.redirect,component:()=>J(()=>import("./BzoHbl1P.js"),__vite__mapDeps([22,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-of-service",path:"/terms-of-service",meta:{},alias:[],redirect:ro==null?void 0:ro.redirect,component:()=>J(()=>import("./CSXQV5-h.js"),__vite__mapDeps([23,20,11,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)}],za=(e,t,n)=>(t=t===!0?{}:t,{default:()=>{var r;return t?Oe(e,t,n):(r=n.default)==null?void 0:r.call(n)}});function Bi(e){const t=(e==null?void 0:e.meta.key)??e.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""});return typeof t=="function"?t(e):t}function eg(e,t){return e===t||t===We?!1:Bi(e)!==Bi(t)?!0:!e.matched.every((r,o)=>{var s,i;return r.components&&r.components.default===((i=(s=t.matched[o])==null?void 0:s.components)==null?void 0:i.default)})}const tg={scrollBehavior(e,t,n){var u;const r=ge(),o=((u=et().options)==null?void 0:u.scrollBehaviorType)??"auto";let s=n||void 0;const i=typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop;if(!s&&t&&e&&i!==!1&&eg(e,t)&&(s={left:0,top:0}),e.path===t.path)return t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:Vi(e.hash),behavior:o}:!1;const l=c=>!!(c.meta.pageTransition??Oo),a=l(t)&&l(e)?"page:transition:finish":"page:finish";return new Promise(c=>{r.hooks.hookOnce(a,async()=>{await new Promise(f=>setTimeout(f,0)),e.hash&&(s={el:e.hash,top:Vi(e.hash),behavior:o}),c(s)})})}};function Vi(e){try{const t=document.querySelector(e);if(t)return parseFloat(getComputedStyle(t).scrollMarginTop)}catch{}return 0}const ng={hashMode:!1,scrollBehaviorType:"auto"},Me={...ng,...tg},rg=async e=>{var a;let t,n;if(!((a=e.meta)!=null&&a.validate))return;const r=ge(),o=et();if(([t,n]=Sn(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t)===!0)return;const i=Sr({statusCode:404,statusMessage:`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}}),l=o.beforeResolve(u=>{if(l(),u===e){const c=o.afterEach(async()=>{c(),await r.runWithContext(()=>Ut(i)),window.history.pushState({},"",e.fullPath)});return!1}})},og=async e=>{let t,n;const r=([t,n]=Sn(()=>ys(e.path)),t=await t,n(),t);if(r.redirect)return $t(r.redirect,{acceptRelative:!0})?(window.location.href=r.redirect,!1):r.redirect},sg=[rg,og],En={};function ig(e,t,n){const{pathname:r,search:o,hash:s}=t,i=e.indexOf("#");if(i>-1){const u=s.includes(e.slice(i))?e.slice(i).length:1;let c=s.slice(u);return c[0]!=="/"&&(c="/"+c),ci(c,"")}const l=ci(r,e),a=!n||Zf(l,n,{trailingSlash:!0})?l:n;return a+(a.includes("?")?"":o)+s}const lg=Rt({name:"nuxt:router",enforce:"pre",async setup(e){var k,A;let t,n,r=ps().app.baseURL;Me.hashMode&&!r.includes("#")&&(r+="#");const o=((k=Me.history)==null?void 0:k.call(Me,r))??(Me.hashMode?Tp(r):Va(r)),s=((A=Me.routes)==null?void 0:A.call(Me,Fi))??Fi;let i;const l=Jp({...Me,scrollBehavior:(y,m,_)=>{if(m===We){i=_;return}if(Me.scrollBehavior){if(l.options.scrollBehavior=Me.scrollBehavior,"scrollRestoration"in window.history){const w=l.beforeEach(()=>{w(),window.history.scrollRestoration="manual"})}return Me.scrollBehavior(y,We,i||_)}},history:o,routes:s});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(l);const a=Rn(l.currentRoute.value);l.afterEach((y,m)=>{a.value=m}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>a.value});const u=ig(r,window.location,e.payload.path),c=Rn(l.currentRoute.value),f=()=>{c.value=l.currentRoute.value};e.hook("page:finish",f),l.afterEach((y,m)=>{var _,w,E,L;((w=(_=y.matched[0])==null?void 0:_.components)==null?void 0:w.default)===((L=(E=m.matched[0])==null?void 0:E.components)==null?void 0:L.default)&&f()});const d={};for(const y in c.value)Object.defineProperty(d,y,{get:()=>c.value[y]});e._route=In(d),e._middleware=e._middleware||{global:[],named:{}};try{[t,n]=Sn(()=>l.isReady()),await t,n()}catch(y){[t,n]=Sn(()=>e.runWithContext(()=>Ut(y))),await t,n()}const g=u!==l.currentRoute.value.fullPath?l.resolve(u):l.currentRoute.value;f();const v=e.payload.state._layout;l.beforeEach(async(y,m)=>{var _;await e.callHook("page:loading:start"),y.meta=wt(y.meta),e.isHydrating&&v&&!It(y.meta.layout)&&(y.meta.layout=v),e._processingMiddleware=!0;{const w=new Set([...sg,...e._middleware.global]);for(const E of y.matched){const L=E.meta.middleware;if(L)for(const S of Es(L))w.add(S)}{const E=await e.runWithContext(()=>ys(y.path));if(E.appMiddleware)for(const L in E.appMiddleware)E.appMiddleware[L]?w.add(L):w.delete(L)}for(const E of w){const L=typeof E=="string"?e._middleware.named[E]||await((_=En[E])==null?void 0:_.call(En).then($=>$.default||$)):E;if(!L)throw new Error(`Unknown route middleware: '${E}'.`);const S=await e.runWithContext(()=>L(y,m));if(!e.payload.serverRendered&&e.isHydrating&&(S===!1||S instanceof Error)){const $=S||Ao({statusCode:404,statusMessage:`Page Not Found: ${u}`});return await e.runWithContext(()=>Ut($)),!1}if(S!==!0&&(S||S===!1))return S}}}),l.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")});const P=Ar();return l.afterEach(async(y,m,_)=>{delete e._processingMiddleware,!e.isHydrating&&P.value&&await e.runWithContext(Ud),_&&await e.callHook("page:loading:end"),y.matched.length===0&&await e.runWithContext(()=>Ut(Ao({statusCode:404,fatal:!1,statusMessage:`Page not found: ${y.fullPath}`,data:{path:y.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{"name"in g&&(g.name=void 0),await l.replace({...g,force:!0}),l.options.scrollBehavior=Me.scrollBehavior}catch(y){await e.runWithContext(()=>Ut(y))}}),{provide:{router:l}}}}),Ui=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),Hm=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),Ga=e=>{const t=ge();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{Ui(e)}):Ui(e)},ag=Rt({name:"nuxt:payload",setup(e){et().beforeResolve(async(t,n)=>{if(t.path===n.path)return;const r=await wi(t.path);r&&Object.assign(e.static.data,r.data)}),Ga(()=>{var t;e.hooks.hook("link:prefetch",async n=>{Cr(n).protocol||await wi(n)}),((t=navigator.connection)==null?void 0:t.effectiveType)!=="slow-2g"&&setTimeout(xr,1e3)})}}),cg=Rt(e=>{let t;async function n(){const r=await xr();t&&clearTimeout(t),t=setTimeout(n,1e3*60*60);try{const o=await $fetch(hs("builds/latest.json")+`?${Date.now()}`);o.id!==r.id&&e.hooks.callHook("app:manifest:update",o)}catch{}}Ga(()=>{t=setTimeout(n,1e3*60*60)})}),ug=ee(()=>J(()=>import("./BnwjeOpX.js"),__vite__mapDeps([24,25,26]),import.meta.url).then(e=>e.default||e.default||e)),fg=ee(()=>J(()=>import("./Cz78Sion.js"),__vite__mapDeps([20,11,5,6,7,8,21,9,10]),import.meta.url).then(e=>e.default||e.default||e)),dg=ee(()=>J(()=>import("./BRsYUypn.js"),__vite__mapDeps([27,21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),hg=ee(()=>J(()=>import("./X2wNORNR.js"),__vite__mapDeps([28,9,8,10,2]),import.meta.url).then(e=>e.default||e.default||e)),pg=ee(()=>J(()=>import("./Bse8ef0b.js"),__vite__mapDeps([21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),gg=ee(()=>J(()=>import("./BxiCSTFT.js"),__vite__mapDeps([5,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),mg=ee(()=>J(()=>import("./9UJQMWko.js"),__vite__mapDeps([29,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),yg=ee(()=>J(()=>import("./C17h_atD.js"),[],import.meta.url).then(e=>e.default||e.default||e)),_g=ee(()=>J(()=>import("./N8b39uzv.js"),[],import.meta.url).then(e=>e.default||e.default||e)),vg=ee(()=>J(()=>import("./BsvTfDZ0.js"),[],import.meta.url).then(e=>e.default||e.default||e)),bg=ee(()=>J(()=>import("./dGARKcZ6.js"),__vite__mapDeps([30,31]),import.meta.url).then(e=>e.default||e.default||e)),Eg=ee(()=>J(()=>import("./CGfQlKlL.js"),[],import.meta.url).then(e=>e.default||e.default||e)),wg=ee(()=>J(()=>import("./J2jEMbcE.js"),__vite__mapDeps([32,25,26,33]),import.meta.url).then(e=>e.default||e.default||e)),Rg=ee(()=>J(()=>import("./DkuQMAl2.js"),__vite__mapDeps([34,2]),import.meta.url).then(e=>e.default||e.default||e)),Pg=ee(()=>J(()=>import("./B60RBlQ9.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Tg=ee(()=>J(()=>import("./BBg3Df_v.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Cg=ee(()=>J(()=>import("./ByDkrM4K.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ag=ee(()=>J(()=>import("./lFVxmSVb.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Sg=ee(()=>J(()=>import("./D2xr6gf6.js"),[],import.meta.url).then(e=>e.default||e.default||e)),xg=ee(()=>J(()=>import("./C_1yPr0e.js"),[],import.meta.url).then(e=>e.default||e.default||e)),kg=ee(()=>J(()=>import("./DQA0lbK1.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Lg=ee(()=>J(()=>import("./Q0Y17sdK.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Og=ee(()=>J(()=>import("./_tWtRPYx.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ig=ee(()=>J(()=>import("./dzMqTbw3.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Hg=ee(()=>J(()=>import("./ti0Z0EYt.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Mg=ee(()=>J(()=>import("./DmSip271.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ng=ee(()=>J(()=>import("./BB7G3joz.js"),[],import.meta.url).then(e=>e.default||e.default||e)),$g=ee(()=>J(()=>import("./4r0YjvSz.js"),[],import.meta.url).then(e=>e.default||e.default||e)),jg=ee(()=>J(()=>import("./DgaJ7ELG.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Dg=ee(()=>J(()=>import("./Cst9DoAH.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Fg=ee(()=>J(()=>import("./DbrryaCF.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Bg=ee(()=>J(()=>import("./mB4jvhnn.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Vg=ee(()=>J(()=>import("./DxghXiKV.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ug=ee(()=>J(()=>import("./CZNwzoXQ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Wg=ee(()=>J(()=>import("./CToKNNT4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Kg=ee(()=>J(()=>import("./BhCbx3Wd.js"),[],import.meta.url).then(e=>e.default||e.default||e)),qg=[["ProseCode",ug],["ContentDoc",fg],["ContentList",dg],["ContentNavigation",hg],["ContentQuery",pg],["ContentRenderer",gg],["ContentRendererMarkdown",mg],["MDCSlot",yg],["DocumentDrivenEmpty",_g],["DocumentDrivenNotFound",vg],["Markdown",bg],["ProseCodeInline",Eg],["ProsePre",wg],["ProseA",Rg],["ProseBlockquote",Pg],["ProseEm",Tg],["ProseH1",Cg],["ProseH2",Ag],["ProseH3",Sg],["ProseH4",xg],["ProseH5",kg],["ProseH6",Lg],["ProseHr",Og],["ProseImg",Ig],["ProseLi",Hg],["ProseOl",Mg],["ProseP",Ng],["ProseScript",$g],["ProseStrong",jg],["ProseTable",Dg],["ProseTbody",Fg],["ProseTd",Bg],["ProseTh",Vg],["ProseThead",Ug],["ProseTr",Wg],["ProseUl",Kg]],zg=Rt({name:"nuxt:global-components",setup(e){for(const[t,n]of qg)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),_t={default:()=>J(()=>import("./Dhont5qJ.js"),__vite__mapDeps([35,2,11,36]),import.meta.url).then(e=>e.default||e)},Gg=Rt({name:"nuxt:prefetch",setup(e){const t=et();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{var o;const r=(o=n==null?void 0:n.meta)==null?void 0:o.layout;r&&typeof _t[r]=="function"&&await _t[r]()})}),e.hooks.hook("link:prefetch",n=>{if($t(n))return;const r=t.resolve(n);if(!r)return;const o=r.meta.layout;let s=Es(r.meta.middleware);s=s.filter(i=>typeof i=="string");for(const i of s)typeof En[i]=="function"&&En[i]();o&&typeof _t[o]=="function"&&_t[o]()})}});function Jg(e={}){const t=e.path||window.location.pathname;let n={};try{n=ur(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||(n==null?void 0:n.path)!==t||(n==null?void 0:n.expires){r.clear()}),e.hook("app:chunkError",({error:s})=>{r.add(s)});function o(s){const l="href"in s&&s.href[0]==="#"?n.app.baseURL+s.href:fs(n.app.baseURL,s.fullPath);Jg({path:l,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(o)}),t.onError((s,i)=>{r.has(s)&&o(i)})}}),Xg=[qh,Gh,lg,ag,cg,zg,Gg,Qg];function Yg(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function Zg(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:r=500,resetDelay:o=400}=e,s=e.estimatedProgress||Yg,i=ge(),l=qe(0),a=qe(!1);let u=!1,c,f,d,g;const v=()=>P(0);function P(E=0){if(!i.isHydrating){if(E>=100)return A();m(),l.value=E<0?0:E,n?f=setTimeout(()=>{a.value=!0,_()},n):(a.value=!0,_())}}function k(){d=setTimeout(()=>{a.value=!1,g=setTimeout(()=>{l.value=0},o)},r)}function A(E={}){l.value=100,u=!0,m(),y(),E.force?(l.value=0,a.value=!1):k()}function y(){clearTimeout(d),clearTimeout(g)}function m(){clearTimeout(f),cancelAnimationFrame(c)}function _(){u=!1;let E;function L(S){if(u)return;E??(E=S);const $=S-E;l.value=Math.max(0,Math.min(100,s(t,$))),c=requestAnimationFrame(L)}c=requestAnimationFrame(L)}let w=()=>{};{const E=i.hook("page:loading:start",()=>{v()}),L=i.hook("page:loading:end",()=>{A()}),S=i.hook("vue:error",()=>A());w=()=>{S(),E(),L(),m()}}return{_cleanup:w,progress:Le(()=>l.value),isLoading:Le(()=>a.value),start:v,set:P,finish:A,clear:m}}function em(e={}){const t=ge(),n=t._loadingIndicator=t._loadingIndicator||Zg(e);return el()&&(t._loadingIndicatorDeps=t._loadingIndicatorDeps||0,t._loadingIndicatorDeps++,fc(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const tm=ot({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:r,isLoading:o,start:s,finish:i,clear:l}=em({duration:e.duration,throttle:e.throttle,estimatedProgress:e.estimatedProgress});return n({progress:r,isLoading:o,start:s,finish:i,clear:l}),()=>Oe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:o.value?1:0,background:e.color||void 0,backgroundSize:`${100/r.value*100}% auto`,transform:`scaleX(${r.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}}),nm=ot({props:{vnode:{type:Object,required:!0},route:{type:Object,required:!0},vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(e){const t=e.renderKey,n=e.route,r={};for(const o in e.route)Object.defineProperty(r,o,{get:()=>t===e.renderKey?e.route[o]:n[o]});return Ot($n,In(r)),()=>Oe(e.vnode,{ref:e.vnodeRef})}}),rm=ot({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,expose:n}){const r=ge(),o=qe(),s=Ae($n,null);let i;n({pageRef:o});const l=Ae(Ra,null);let a;const u=r.deferHydration();if(r.isHydrating){const c=r.hooks.hookOnce("app:error",u);et().beforeEach(c)}return e.pageKey&&Qt(()=>e.pageKey,(c,f)=>{c!==f&&r.callHook("page:loading:start")}),()=>Oe(qa,{name:e.name,route:e.route,...t},{default:c=>{const f=sm(s,c.route,c.Component),d=s&&s.matched.length===c.route.matched.length;if(!c.Component){if(a&&!d)return a;u();return}if(a&&l&&!l.isCurrent(c.route))return a;if(f&&s&&(!l||l!=null&&l.isCurrent(s)))return d?a:null;const g=No(c,e.pageKey);!r.isHydrating&&!im(s,c.route,c.Component)&&i===g&&r.callHook("page:loading:end"),i=g;const v=!!(e.transition??c.route.meta.pageTransition??Oo),P=v&&om([e.transition,c.route.meta.pageTransition,Oo,{onAfterLeave:()=>{r.callHook("page:transition:finish",c.Component)}}].filter(Boolean)),k=e.keepalive??c.route.meta.keepalive??jh;return a=za(Tr,v&&P,Zp(k,Oe(es,{suspensible:!0,onPending:()=>r.callHook("page:start",c.Component),onResolve:()=>{ln(()=>r.callHook("page:finish",c.Component).then(()=>r.callHook("page:loading:end")).finally(u))}},{default:()=>{const A=Oe(nm,{key:g||void 0,vnode:c.Component,route:c.route,renderKey:g||void 0,trackRootNodes:v,vnodeRef:o});return k&&(A.type.name=c.Component.type.name||c.Component.type.__name||"RouteProvider"),A}}))).default(),a}})}});function om(e){const t=e.map(n=>({...n,onAfterLeave:n.onAfterLeave?Es(n.onAfterLeave):void 0}));return Ea(...t)}function sm(e,t,n){if(!e)return!1;const r=t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)});return!r||r===-1?!1:t.matched.slice(0,r).some((o,s)=>{var i,l,a;return((i=o.components)==null?void 0:i.default)!==((a=(l=e.matched[s])==null?void 0:l.components)==null?void 0:a.default)})||n&&No({route:t,Component:n})!==No({route:e,Component:n})}function im(e,t,n){return e?t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)})r.default||r);return()=>Oe(n,e.layoutProps,t.slots)}}),am=ot({name:"NuxtLayout",inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(e,t){const n=ge(),r=Ae($n),o=r===gs()?Xp():r,s=Le(()=>{let a=ue(e.name)??o.meta.layout??"default";return a&&!(a in _t)&&e.fallback&&(a=ue(e.fallback)),a}),i=qe();t.expose({layoutRef:i});const l=n.deferHydration();if(n.isHydrating){const a=n.hooks.hookOnce("app:error",l);et().beforeEach(a)}return()=>{const a=s.value&&s.value in _t,u=o.meta.layoutTransition??$h;return za(Tr,a&&u,{default:()=>Oe(es,{suspensible:!0,onResolve:()=>{ln(l)}},{default:()=>Oe(cm,{layoutProps:ea(t.attrs,{ref:i}),key:s.value||void 0,name:s.value,shouldProvide:!e.name,hasTransition:!!u},t.slots)})}).default()}}}),cm=ot({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean}},setup(e,t){const n=e.name;return e.shouldProvide&&Ot(Ra,{isCurrent:r=>n===(r.meta.layout??"default")}),()=>{var r,o;return!n||typeof n=="string"&&!(n in _t)?(o=(r=t.slots).default)==null?void 0:o.call(r):Oe(lm,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}}),um=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},fm={};function dm(e,t){const n=tm,r=rm,o=am;return Ye(),ju(Ce,null,[fe(n,{color:"#18caf9",height:2}),fe(o,null,{default:Xo(()=>[fe(r)]),_:1})],64)}const hm=um(fm,[["render",dm]]),pm={__name:"nuxt-error-page",props:{error:Object},setup(e){const n=e.error;n.stack&&n.stack.split(` -`).splice(1).map(f=>({text:f.replace("webpack:/","").replace(".vue",".js").trim(),internal:f.includes("node_modules")&&!f.includes(".cache")||f.includes("internal")||f.includes("new Promise")})).map(f=>`${f.text}`).join(` -`);const r=Number(n.statusCode||500),o=r===404,s=n.statusMessage??(o?"Page Not Found":"Internal Server Error"),i=n.message||n.toString(),l=void 0,c=o?ee(()=>J(()=>import("./R-gFWJPL.js"),__vite__mapDeps([37,2,11,38]),import.meta.url).then(f=>f.default||f)):ee(()=>J(()=>import("./B0VAc3Z5.js"),__vite__mapDeps([39,11,40]),import.meta.url).then(f=>f.default||f));return(f,d)=>(Ye(),yt(ue(c),ic(Yl({statusCode:ue(r),statusMessage:ue(s),description:ue(i),stack:ue(l)})),null,16))}},gm=pm,mm={__name:"nuxt-root",setup(e){const t=()=>null,n=ge(),r=n.deferHydration();if(n.isHydrating){const l=n.hooks.hookOnce("app:error",r);et().beforeEach(l)}const o=!1;Ot($n,gs()),n.hooks.callHookWith(l=>l.map(a=>a()),"vue:setup");const s=Ar();Hl((l,a,u)=>{if(n.hooks.callHook("vue:error",l,a,u).catch(c=>console.error("[nuxt] Error in `vue:error` hook",c)),Wd(l)&&(l.fatal||l.unhandled))return n.runWithContext(()=>Ut(l)),!1});const i=!1;return(l,a)=>(Ye(),yt(es,{onResolve:ue(r)},{default:Xo(()=>[ue(s)?(Ye(),yt(ue(gm),{key:0,error:ue(s)},null,8,["error"])):ue(i)?(Ye(),yt(ue(t),{key:1,context:ue(i)},null,8,["context"])):ue(o)?(Ye(),yt(Gc(ue(o)),{key:2})):(Ye(),yt(ue(hm),{key:3}))]),_:1},8,["onResolve"]))}},Wi=mm;let Ki;{let e;Ki=async function(){var i,l;if(e)return e;const r=!!((i=window.__NUXT__)!=null&&i.serverRendered||((l=document.getElementById("__NUXT_DATA__"))==null?void 0:l.dataset.ssr)==="true")?Rf(Wi):wf(Wi),o=xd({vueApp:r});async function s(a){await o.callHook("app:error",a),o.payload.error=o.payload.error||Sr(a)}r.config.errorHandler=s;try{await Ld(o,Xg)}catch(a){s(a)}try{await o.hooks.callHook("app:created",r),await o.hooks.callHook("app:beforeMount",r),r.mount(Dh),await o.hooks.callHook("app:mounted",r),await ln()}catch(a){s(a)}return r.config.errorHandler===s&&(r.config.errorHandler=void 0),r},e=Ki().catch(t=>{throw console.error("Error while mounting app:",t),t})}export{Se as $,wm as A,Sm as B,yr as C,_r as D,Qt as E,Ce as F,ln as G,Cm as H,wo as I,Oe as J,J as K,jc as L,Pe as M,Xf as N,ai as O,fs as P,us as Q,Im as R,qe as S,Rn as T,du as U,Il as V,fc as W,el as X,re as Y,Yt as Z,um as _,Xl as a,ur as a0,_m as a1,et as a2,rs as a3,Ga as a4,Ui as a5,os as a6,Hm as a7,Cr as a8,Ff as a9,Om as aa,km as ab,$t as ac,Lm as ad,Rm as ae,uu as af,cu as ag,xo as ah,fe as b,ju as c,Zl as d,Em as e,ot as f,yt as g,Am as h,ue as i,Ae as j,Le as k,Tm as l,xm as m,ea as n,Ye as o,bm as p,gs as q,Pm as r,Sr as s,ym as t,ps as u,vm as v,Xo as w,wt as x,ge as y,Mn as z}; diff --git a/_nuxt/BnI7OW5X.js b/_nuxt/BnI7OW5X.js deleted file mode 100644 index 7d721bb..0000000 --- a/_nuxt/BnI7OW5X.js +++ /dev/null @@ -1 +0,0 @@ -import{o as a,c as t,a as s,f as i,m as c,g as o,i as l,t as d,l as h}from"./BlS8upJP.js";const r={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},u=s("path",{fill:"#f5de19",d:"M18.774 19.7a3.727 3.727 0 0 0 3.376 2.078c1.418 0 2.324-.709 2.324-1.688c0-1.173-.931-1.589-2.491-2.272l-.856-.367c-2.469-1.052-4.11-2.37-4.11-5.156c0-2.567 1.956-4.52 5.012-4.52A5.058 5.058 0 0 1 26.9 10.52l-2.665 1.711a2.327 2.327 0 0 0-2.2-1.467a1.489 1.489 0 0 0-1.638 1.467c0 1.027.636 1.442 2.1 2.078l.856.366c2.908 1.247 4.549 2.518 4.549 5.376c0 3.081-2.42 4.769-5.671 4.769a6.575 6.575 0 0 1-6.236-3.5ZM6.686 20c.538.954 1.027 1.76 2.2 1.76c1.124 0 1.834-.44 1.834-2.15V7.975h3.422v11.683c0 3.543-2.078 5.156-5.11 5.156A5.312 5.312 0 0 1 3.9 21.688Z"},null,-1),_=[u];function m(e,n){return a(),t("svg",r,[..._])}const g={name:"vscode-icons-file-type-js",render:m},f={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},p=s("path",{fill:"#f5de19",d:"M4.014 14.976a2.51 2.51 0 0 0 1.567-.518a2.377 2.377 0 0 0 .805-1.358a15.261 15.261 0 0 0 .214-2.944q.012-2.085.075-2.747a5.236 5.236 0 0 1 .418-1.686a3.025 3.025 0 0 1 .755-1.018A3.046 3.046 0 0 1 9 4.125A6.762 6.762 0 0 1 10.544 4h.7v1.96h-.387a2.338 2.338 0 0 0-1.723.468a3.4 3.4 0 0 0-.425 2.092a36.054 36.054 0 0 1-.137 4.133a4.734 4.734 0 0 1-.768 2.06A4.567 4.567 0 0 1 6.1 16a3.809 3.809 0 0 1 1.992 1.754a8.861 8.861 0 0 1 .618 3.865q0 2.435.05 2.9a1.755 1.755 0 0 0 .504 1.181a2.639 2.639 0 0 0 1.592.337h.387V28h-.7a5.655 5.655 0 0 1-1.773-.2a2.97 2.97 0 0 1-1.324-.93a3.353 3.353 0 0 1-.681-1.63a24.175 24.175 0 0 1-.165-3.234a16.469 16.469 0 0 0-.214-3.106a2.408 2.408 0 0 0-.805-1.361a2.489 2.489 0 0 0-1.567-.524Zm23.972 2.035a2.489 2.489 0 0 0-1.567.524a2.408 2.408 0 0 0-.805 1.361a16.469 16.469 0 0 0-.212 3.109a24.175 24.175 0 0 1-.169 3.234a3.353 3.353 0 0 1-.681 1.63a2.97 2.97 0 0 1-1.324.93a5.655 5.655 0 0 1-1.773.2h-.7V26.04h.387a2.639 2.639 0 0 0 1.592-.337a1.755 1.755 0 0 0 .506-1.186q.05-.462.05-2.9a8.861 8.861 0 0 1 .618-3.865A3.809 3.809 0 0 1 25.9 16a4.567 4.567 0 0 1-1.7-1.286a4.734 4.734 0 0 1-.768-2.06a36.054 36.054 0 0 1-.137-4.133a3.4 3.4 0 0 0-.425-2.092a2.338 2.338 0 0 0-1.723-.468h-.387V4h.7a6.762 6.762 0 0 1 1.54.125a3.046 3.046 0 0 1 1.149.581a3.025 3.025 0 0 1 .755 1.018a5.236 5.236 0 0 1 .418 1.686q.062.662.075 2.747a15.261 15.261 0 0 0 .212 2.947a2.377 2.377 0 0 0 .805 1.355a2.51 2.51 0 0 0 1.567.518Z"},null,-1),v=[p];function y(e,n){return a(),t("svg",f,[...v])}const w={name:"vscode-icons-file-type-json",render:y},$={viewBox:"0 0 32 32",width:"1.2em",height:"1.2em"},V=s("path",{fill:"#007acc",d:"M23.827 8.243a4.424 4.424 0 0 1 2.223 1.281a5.853 5.853 0 0 1 .852 1.143c.011.045-1.534 1.083-2.471 1.662c-.034.023-.169-.124-.322-.35a2.014 2.014 0 0 0-1.67-1c-1.077-.074-1.771.49-1.766 1.433a1.3 1.3 0 0 0 .153.666c.237.49.677.784 2.059 1.383c2.544 1.095 3.636 1.817 4.31 2.843a5.158 5.158 0 0 1 .416 4.333a4.764 4.764 0 0 1-3.932 2.815a10.9 10.9 0 0 1-2.708-.028a6.531 6.531 0 0 1-3.616-1.884a6.278 6.278 0 0 1-.926-1.371a2.655 2.655 0 0 1 .327-.208c.158-.09.756-.434 1.32-.761l1.024-.6l.214.312a4.771 4.771 0 0 0 1.35 1.292a3.3 3.3 0 0 0 3.458-.175a1.545 1.545 0 0 0 .2-1.974c-.276-.395-.84-.727-2.443-1.422a8.8 8.8 0 0 1-3.349-2.055a4.687 4.687 0 0 1-.976-1.777a7.116 7.116 0 0 1-.062-2.268a4.332 4.332 0 0 1 3.644-3.374a9 9 0 0 1 2.691.084m-8.343 1.483l.011 1.454h-4.63v13.148H7.6V11.183H2.97V9.755a13.986 13.986 0 0 1 .04-1.466c.017-.023 2.832-.034 6.245-.028l6.211.017Z"},null,-1),x=[V];function B(e,n){return a(),t("svg",$,[...x])}const k={name:"vscode-icons-file-type-typescript",render:B},A={class:"code-outer"},Z={key:0,class:"code-title"},S={class:"icon-wrapper"},M={key:0,xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 32 32"},j=s("path",{fill:"#79B8FF",d:"M27.5 5.5h-9.3l-2.1 4.2H4.4v16.8h25.2v-21Zm0 4.2h-8.2l1.1-2.1h7.1Z"},null,-1),q=[j],F={class:"file-name"},I=i({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(e){return(n,C)=>(a(),t("div",A,[e.filename?(a(),t("div",Z,[s("div",S,[e.language==="console"?(a(),t("svg",M,q)):c("",!0),e.language==="json"?(a(),o(l(w),{key:1})):c("",!0),e.language==="js"?(a(),o(l(g),{key:2})):c("",!0),e.language==="ts"?(a(),o(l(k),{key:3})):c("",!0)]),s("span",F,d(e.filename),1)])):c("",!0),h(n.$slots,"default")]))}});export{I as _}; diff --git a/_nuxt/BneHlRLI.js b/_nuxt/BneHlRLI.js deleted file mode 100644 index 6ac3a4e..0000000 --- a/_nuxt/BneHlRLI.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as y}from"./CFzORWKb.js";import g from"./BxiCSTFT.js";import{u as v}from"./CRh1_mKz.js";import{q as x}from"./DF1VbFfH.js";import{f as C,h as q,o as s,c as o,i as t,a as c,b as i,w as h,d as p,F as w,r as N,t as n,m as a,l as B}from"./BlS8upJP.js";const S={class:"blog-outer"},V={key:0,class:"blog-wrapper"},$={key:0,class:"blog-breadcrumbs"},A={class:"crumb"},D=c("span",{class:"sep"},"›",-1),F={class:"crumb"},H={key:0,class:"sep"},L={key:1,class:"blog-header"},P={key:0},R=["href"],E={key:1},O={key:2},T={key:3,class:"blog-created-date"},j={key:0},U=C({__name:"BlogPage",props:{path:{type:String,required:!0},link:{type:String,required:!1}},async setup(_){let r,l;const{path:d,link:z}=_,{data:e}=([r,l]=q(()=>v("blog-post-"+d,()=>x(d).findOne(),"$fqRr3791H4")),r=await r,l(),r);return(b,G)=>{const u=y,f=g;return s(),o("div",S,[t(e)?(s(),o("div",V,[t(e).breadcrumbs?(s(),o("div",$,[c("div",A,[i(u,{to:"/"},{default:h(()=>[p("Home")]),_:1}),D]),(s(!0),o(w,null,N(t(e).breadcrumbs,(m,k)=>(s(),o("div",F,[i(u,{to:m.path},{default:h(()=>[p(n(m.name),1)]),_:2},1032,["to"]),k!=t(e).breadcrumbs.length-1?(s(),o("span",H,"›")):a("",!0)]))),256))])):a("",!0),t(e)&&(t(e).title||t(e).subtitle)?(s(),o("div",L,[t(e).link?(s(),o("h1",P,[c("a",{href:t(e).link},n(t(e).title),9,R)])):(s(),o("h1",E,n(t(e).title),1)),t(e).subtitle?(s(),o("h3",O,n(t(e).subtitle),1)):a("",!0),t(e).created?(s(),o("div",T,n(t(e).created.string),1)):a("",!0)])):a("",!0),c("section",null,[_.path?(s(),o("div",j,[i(f,{value:t(e)},null,8,["value"])])):a("",!0),B(b.$slots,"default")])])):a("",!0)])}}});export{U as _}; diff --git a/_nuxt/BnwjeOpX.js b/_nuxt/BnwjeOpX.js deleted file mode 100644 index c6189d0..0000000 --- a/_nuxt/BnwjeOpX.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as m}from"./BnI7OW5X.js";import"./BlS8upJP.js";export{m as default}; diff --git a/_nuxt/BECgZIvk.js b/_nuxt/BpUWW4O-.js similarity index 54% rename from _nuxt/BECgZIvk.js rename to _nuxt/BpUWW4O-.js index 6bf8a39..df53e58 100644 --- a/_nuxt/BECgZIvk.js +++ b/_nuxt/BpUWW4O-.js @@ -1,3 +1,3 @@ -import{S as P,X as R,W as z,E as N,a1 as H,a0 as K,G as q,q as x}from"./BlS8upJP.js";const S=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function V(r,i){if(typeof r!="string")throw new TypeError("argument str must be a string");const n={},t=(i||{}).decode||X;let o=0;for(;o{i+=t};return{toString(){return i},getContext(){return n},dispatch(t){return r.replacer&&(t=r.replacer(t)),this[t===null?"null":typeof t](t)},object(t){if(t&&typeof t.toJSON=="function")return this.object(t.toJSON());const o=Object.prototype.toString.call(t);let s="";const a=o.length;a<10?s="unknown:["+o+"]":s=o.slice(8,a-1),s=s.toLowerCase();let c=null;if((c=n.get(t))===void 0)n.set(t,n.size);else return this.dispatch("[CIRCULAR:"+c+"]");if(typeof Buffer<"u"&&Buffer.isBuffer&&Buffer.isBuffer(t))return e("buffer:"),e(t.toString("utf8"));if(s!=="object"&&s!=="function"&&s!=="asyncfunction")this[s]?this[s](t):r.ignoreUnknown||this.unkown(t,s);else{let u=Object.keys(t);r.unorderedObjects&&(u=u.sort());let f=[];r.respectType!==!1&&!A(t)&&(f=Y),r.excludeKeys&&(u=u.filter(l=>!r.excludeKeys(l)),f=f.filter(l=>!r.excludeKeys(l))),e("object:"+(u.length+f.length)+":");const h=l=>{this.dispatch(l),e(":"),r.excludeValues||this.dispatch(t[l]),e(",")};for(const l of u)h(l);for(const l of f)h(l)}},array(t,o){if(o=o===void 0?r.unorderedArrays!==!1:o,e("array:"+t.length+":"),!o||t.length<=1){for(const c of t)this.dispatch(c);return}const s=new Map,a=t.map(c=>{const u=D(r);u.dispatch(c);for(const[f,h]of u.getContext())s.set(f,h);return u.toString()});return n=s,a.sort(),this.array(a,!1)},date(t){return e("date:"+t.toJSON())},symbol(t){return e("symbol:"+t.toString())},unkown(t,o){if(e(o),!!t&&(e(":"),t&&typeof t.entries=="function"))return this.array(Array.from(t.entries()),!0)},error(t){return e("error:"+t.toString())},boolean(t){return e("bool:"+t)},string(t){e("string:"+t.length+":"),e(t)},function(t){e("fn:"),A(t)?this.dispatch("[native]"):this.dispatch(t.toString()),r.respectFunctionNames!==!1&&this.dispatch("function-name:"+String(t.name)),r.respectFunctionProperties&&this.object(t)},number(t){return e("number:"+t)},xml(t){return e("xml:"+t.toString())},null(){return e("Null")},undefined(){return e("Undefined")},regexp(t){return e("regex:"+t.toString())},uint8array(t){return e("uint8array:"),this.dispatch(Array.prototype.slice.call(t))},uint8clampedarray(t){return e("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(t))},int8array(t){return e("int8array:"),this.dispatch(Array.prototype.slice.call(t))},uint16array(t){return e("uint16array:"),this.dispatch(Array.prototype.slice.call(t))},int16array(t){return e("int16array:"),this.dispatch(Array.prototype.slice.call(t))},uint32array(t){return e("uint32array:"),this.dispatch(Array.prototype.slice.call(t))},int32array(t){return e("int32array:"),this.dispatch(Array.prototype.slice.call(t))},float32array(t){return e("float32array:"),this.dispatch(Array.prototype.slice.call(t))},float64array(t){return e("float64array:"),this.dispatch(Array.prototype.slice.call(t))},arraybuffer(t){return e("arraybuffer:"),this.dispatch(new Uint8Array(t))},url(t){return e("url:"+t.toString())},map(t){e("map:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},set(t){e("set:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},file(t){return e("file:"),this.dispatch([t.name,t.size,t.type,t.lastModfied])},blob(){if(r.ignoreUnknown)return e("[blob]");throw new Error(`Hashing Blob objects is currently not supported +import{R as P,W as R,V as z,D,a1 as H,a0 as K,E as q,q as x}from"./DiyP6pou.js";const S=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function V(r,i){if(typeof r!="string")throw new TypeError("argument str must be a string");const n={},t=(i||{}).decode||X;let o=0;for(;o{i+=t};return{toString(){return i},getContext(){return n},dispatch(t){return r.replacer&&(t=r.replacer(t)),this[t===null?"null":typeof t](t)},object(t){if(t&&typeof t.toJSON=="function")return this.object(t.toJSON());const o=Object.prototype.toString.call(t);let s="";const a=o.length;a<10?s="unknown:["+o+"]":s=o.slice(8,a-1),s=s.toLowerCase();let c=null;if((c=n.get(t))===void 0)n.set(t,n.size);else return this.dispatch("[CIRCULAR:"+c+"]");if(typeof Buffer<"u"&&Buffer.isBuffer&&Buffer.isBuffer(t))return e("buffer:"),e(t.toString("utf8"));if(s!=="object"&&s!=="function"&&s!=="asyncfunction")this[s]?this[s](t):r.ignoreUnknown||this.unkown(t,s);else{let u=Object.keys(t);r.unorderedObjects&&(u=u.sort());let f=[];r.respectType!==!1&&!A(t)&&(f=$),r.excludeKeys&&(u=u.filter(l=>!r.excludeKeys(l)),f=f.filter(l=>!r.excludeKeys(l))),e("object:"+(u.length+f.length)+":");const h=l=>{this.dispatch(l),e(":"),r.excludeValues||this.dispatch(t[l]),e(",")};for(const l of u)h(l);for(const l of f)h(l)}},array(t,o){if(o=o===void 0?r.unorderedArrays!==!1:o,e("array:"+t.length+":"),!o||t.length<=1){for(const c of t)this.dispatch(c);return}const s=new Map,a=t.map(c=>{const u=N(r);u.dispatch(c);for(const[f,h]of u.getContext())s.set(f,h);return u.toString()});return n=s,a.sort(),this.array(a,!1)},date(t){return e("date:"+t.toJSON())},symbol(t){return e("symbol:"+t.toString())},unkown(t,o){if(e(o),!!t&&(e(":"),t&&typeof t.entries=="function"))return this.array(Array.from(t.entries()),!0)},error(t){return e("error:"+t.toString())},boolean(t){return e("bool:"+t)},string(t){e("string:"+t.length+":"),e(t)},function(t){e("fn:"),A(t)?this.dispatch("[native]"):this.dispatch(t.toString()),r.respectFunctionNames!==!1&&this.dispatch("function-name:"+String(t.name)),r.respectFunctionProperties&&this.object(t)},number(t){return e("number:"+t)},xml(t){return e("xml:"+t.toString())},null(){return e("Null")},undefined(){return e("Undefined")},regexp(t){return e("regex:"+t.toString())},uint8array(t){return e("uint8array:"),this.dispatch(Array.prototype.slice.call(t))},uint8clampedarray(t){return e("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(t))},int8array(t){return e("int8array:"),this.dispatch(Array.prototype.slice.call(t))},uint16array(t){return e("uint16array:"),this.dispatch(Array.prototype.slice.call(t))},int16array(t){return e("int16array:"),this.dispatch(Array.prototype.slice.call(t))},uint32array(t){return e("uint32array:"),this.dispatch(Array.prototype.slice.call(t))},int32array(t){return e("int32array:"),this.dispatch(Array.prototype.slice.call(t))},float32array(t){return e("float32array:"),this.dispatch(Array.prototype.slice.call(t))},float64array(t){return e("float64array:"),this.dispatch(Array.prototype.slice.call(t))},arraybuffer(t){return e("arraybuffer:"),this.dispatch(new Uint8Array(t))},url(t){return e("url:"+t.toString())},map(t){e("map:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},set(t){e("set:");const o=[...t];return this.array(o,r.unorderedSets!==!1)},file(t){return e("file:"),this.dispatch([t.name,t.size,t.type,t.lastModfied])},blob(){if(r.ignoreUnknown)return e("[blob]");throw new Error(`Hashing Blob objects is currently not supported Use "options.replacer" or "options.ignoreUnknown" -`)},domwindow(){return e("domwindow")},bigint(t){return e("bigint:"+t.toString())},process(){return e("process")},timer(){return e("timer")},pipe(){return e("pipe")},tcp(){return e("tcp")},udp(){return e("udp")},tty(){return e("tty")},statwatcher(){return e("statwatcher")},securecontext(){return e("securecontext")},connection(){return e("connection")},zlib(){return e("zlib")},context(){return e("context")},nodescript(){return e("nodescript")},httpparser(){return e("httpparser")},dataview(){return e("dataview")},signal(){return e("signal")},fsevent(){return e("fsevent")},tlswrap(){return e("tlswrap")}}}const I="[native code] }",$=I.length;function A(r){return typeof r!="function"?!1:Function.prototype.toString.call(r).slice(-$)===I}class d{constructor(i,n){i=this.words=i||[],this.sigBytes=n===void 0?i.length*4:n}toString(i){return(i||Q).stringify(this)}concat(i){if(this.clamp(),this.sigBytes%4)for(let n=0;n>>2]>>>24-n%4*8&255;this.words[this.sigBytes+n>>>2]|=e<<24-(this.sigBytes+n)%4*8}else for(let n=0;n>>2]=i.words[n>>>2];return this.sigBytes+=i.sigBytes,this}clamp(){this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4)}clone(){return new d([...this.words])}}const Q={stringify(r){const i=[];for(let n=0;n>>2]>>>24-n%4*8&255;i.push((e>>>4).toString(16),(e&15).toString(16))}return i.join("")}},Z={stringify(r){const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=[];for(let e=0;e>>2]>>>24-e%4*8&255,o=r.words[e+1>>>2]>>>24-(e+1)%4*8&255,s=r.words[e+2>>>2]>>>24-(e+2)%4*8&255,a=t<<16|o<<8|s;for(let c=0;c<4&&e*8+c*6>>6*(3-c)&63))}return n.join("")}},ee={parse(r){const i=r.length,n=[];for(let e=0;e>>2]|=(r.charCodeAt(e)&255)<<24-e%4*8;return new d(n,i)}},te={parse(r){return ee.parse(unescape(encodeURIComponent(r)))}};class re{constructor(){this._data=new d,this._nDataBytes=0,this._minBufferSize=0,this.blockSize=512/32}reset(){this._data=new d,this._nDataBytes=0}_append(i){typeof i=="string"&&(i=te.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes}_doProcessBlock(i,n){}_process(i){let n,e=this._data.sigBytes/(this.blockSize*4);i?e=Math.ceil(e):e=Math.max((e|0)-this._minBufferSize,0);const t=e*this.blockSize,o=Math.min(t*4,this._data.sigBytes);if(t){for(let s=0;s>>7)^(w<<14|w>>>18)^w>>>3,m=y[l-2],F=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;y[l]=L+y[l-7]+F+y[l-16]}const g=c&u^~c&f,v=t&o^t&s^o&s,b=(t<<30|t>>>2)^(t<<19|t>>>13)^(t<<10|t>>>22),M=(c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25),_=h+M+g+ie[l]+y[l],U=b+v;h=f,f=u,u=c,c=a+_|0,a=s,s=o,o=t,t=_+U|0}e[0]=e[0]+t|0,e[1]=e[1]+o|0,e[2]=e[2]+s|0,e[3]=e[3]+a|0,e[4]=e[4]+c|0,e[5]=e[5]+u|0,e[6]=e[6]+f|0,e[7]=e[7]+h|0}finalize(i){super.finalize(i);const n=this._nDataBytes*8,e=this._data.sigBytes*8;return this._data.words[e>>>5]|=128<<24-e%32,this._data.words[(e+64>>>9<<4)+14]=Math.floor(n/4294967296),this._data.words[(e+64>>>9<<4)+15]=n,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}}function oe(r){return new se().finalize(r).toString(Z)}function de(r,i={}){const n=typeof r=="string"?r:B(r,i);return oe(n).slice(0,10)}function ae(r,i,n={}){return r===i||B(r,n)===B(i,n)}function p(r){if(typeof r!="object")return r;var i,n,e=Object.prototype.toString.call(r);if(e==="[object Object]"){if(r.constructor!==Object&&typeof r.constructor=="function"){n=new r.constructor;for(i in r)r.hasOwnProperty(i)&&n[i]!==r[i]&&(n[i]=p(r[i]))}else{n={};for(i in r)i==="__proto__"?Object.defineProperty(n,i,{value:p(r[i]),configurable:!0,enumerable:!0,writable:!0}):n[i]=p(r[i])}return n}if(e==="[object Array]"){for(i=r.length,n=Array(i);i--;)n[i]=p(r[i]);return n}return e==="[object Set]"?(n=new Set,r.forEach(function(t){n.add(p(t))}),n):e==="[object Map]"?(n=new Map,r.forEach(function(t,o){n.set(p(o),p(t))}),n):e==="[object Date]"?new Date(+r):e==="[object RegExp]"?(n=new RegExp(r.source,r.flags),n.lastIndex=r.lastIndex,n):e==="[object DataView]"?new r.constructor(p(r.buffer)):e==="[object ArrayBuffer]"?r.slice(0):e.slice(-6)==="Array]"?new r.constructor(r):r}const ce={path:"/",watch:!0,decode:r=>K(decodeURIComponent(r)),encode:r=>encodeURIComponent(typeof r=="string"?r:JSON.stringify(r))},ue=void 0;function k(r,i){var c;const n={...ce,...i},e=O(n)||{};let t;n.maxAge!==void 0?t=n.maxAge*1e3:n.expires&&(t=n.expires.getTime()-Date.now());const o=t!==void 0&&t<=0,s=p(o?void 0:e[r]??((c=n.default)==null?void 0:c.call(n))),a=t&&!o?he(s,t,n.watch&&n.watch!=="shallow"):P(s);{let u=null;try{!ue&&typeof BroadcastChannel<"u"&&(u=new BroadcastChannel(`nuxt:cookies:${r}`))}catch{}const f=()=>{n.readonly||ae(a.value,e[r])||(fe(r,a.value,n),e[r]=p(a.value),u==null||u.postMessage({value:n.encode(a.value)}))},h=g=>{var b;const v=g.refresh?(b=O(n))==null?void 0:b[r]:n.decode(g.value);l=!0,e[r]=a.value=v,q(()=>{l=!1})};let l=!1;R()&&z(()=>{l=!0,f(),u==null||u.close()}),u&&(u.onmessage=({data:g})=>h(g)),n.watch?N(a,()=>{l||f()},{deep:n.watch!=="shallow"}):f()}return a}function O(r={}){return V(document.cookie,r)}function le(r,i,n={}){return i==null?T(r,i,{...n,maxAge:-1}):T(r,i,n)}function fe(r,i,n={}){document.cookie=le(r,i,n)}const j=2147483647;function he(r,i,n){let e,t,o=0;const s=n?P(r):{value:r};return R()&&z(()=>{t==null||t(),clearTimeout(e)}),H((a,c)=>{n&&(t=N(s,c));function u(){clearTimeout(e);const f=i-o,h=f{if(o+=h,o({isEnabled:()=>{const e=x().query;return Object.prototype.hasOwnProperty.call(e,"preview")&&!e.preview?!1:!!(e.preview||k("previewToken").value||sessionStorage.getItem("previewToken"))},getPreviewToken:()=>k("previewToken").value||sessionStorage.getItem("previewToken")||void 0,setPreviewToken:e=>{k("previewToken").value=e,x().query.preview=e||"",e?sessionStorage.setItem("previewToken",e):sessionStorage.removeItem("previewToken"),window.location.reload()}});export{de as h,ye as u}; +`)},domwindow(){return e("domwindow")},bigint(t){return e("bigint:"+t.toString())},process(){return e("process")},timer(){return e("timer")},pipe(){return e("pipe")},tcp(){return e("tcp")},udp(){return e("udp")},tty(){return e("tty")},statwatcher(){return e("statwatcher")},securecontext(){return e("securecontext")},connection(){return e("connection")},zlib(){return e("zlib")},context(){return e("context")},nodescript(){return e("nodescript")},httpparser(){return e("httpparser")},dataview(){return e("dataview")},signal(){return e("signal")},fsevent(){return e("fsevent")},tlswrap(){return e("tlswrap")}}}const I="[native code] }",G=I.length;function A(r){return typeof r!="function"?!1:Function.prototype.toString.call(r).slice(-G)===I}class d{constructor(i,n){i=this.words=i||[],this.sigBytes=n===void 0?i.length*4:n}toString(i){return(i||Q).stringify(this)}concat(i){if(this.clamp(),this.sigBytes%4)for(let n=0;n>>2]>>>24-n%4*8&255;this.words[this.sigBytes+n>>>2]|=e<<24-(this.sigBytes+n)%4*8}else for(let n=0;n>>2]=i.words[n>>>2];return this.sigBytes+=i.sigBytes,this}clamp(){this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4)}clone(){return new d([...this.words])}}const Q={stringify(r){const i=[];for(let n=0;n>>2]>>>24-n%4*8&255;i.push((e>>>4).toString(16),(e&15).toString(16))}return i.join("")}},Z={stringify(r){const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=[];for(let e=0;e>>2]>>>24-e%4*8&255,o=r.words[e+1>>>2]>>>24-(e+1)%4*8&255,s=r.words[e+2>>>2]>>>24-(e+2)%4*8&255,a=t<<16|o<<8|s;for(let c=0;c<4&&e*8+c*6>>6*(3-c)&63))}return n.join("")}},ee={parse(r){const i=r.length,n=[];for(let e=0;e>>2]|=(r.charCodeAt(e)&255)<<24-e%4*8;return new d(n,i)}},te={parse(r){return ee.parse(unescape(encodeURIComponent(r)))}};class re{constructor(){this._data=new d,this._nDataBytes=0,this._minBufferSize=0,this.blockSize=512/32}reset(){this._data=new d,this._nDataBytes=0}_append(i){typeof i=="string"&&(i=te.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes}_doProcessBlock(i,n){}_process(i){let n,e=this._data.sigBytes/(this.blockSize*4);i?e=Math.ceil(e):e=Math.max((e|0)-this._minBufferSize,0);const t=e*this.blockSize,o=Math.min(t*4,this._data.sigBytes);if(t){for(let s=0;s>>7)^(w<<14|w>>>18)^w>>>3,m=y[l-2],F=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;y[l]=L+y[l-7]+F+y[l-16]}const g=c&u^~c&f,v=t&o^t&s^o&s,b=(t<<30|t>>>2)^(t<<19|t>>>13)^(t<<10|t>>>22),M=(c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25),_=h+M+g+ie[l]+y[l],U=b+v;h=f,f=u,u=c,c=a+_|0,a=s,s=o,o=t,t=_+U|0}e[0]=e[0]+t|0,e[1]=e[1]+o|0,e[2]=e[2]+s|0,e[3]=e[3]+a|0,e[4]=e[4]+c|0,e[5]=e[5]+u|0,e[6]=e[6]+f|0,e[7]=e[7]+h|0}finalize(i){super.finalize(i);const n=this._nDataBytes*8,e=this._data.sigBytes*8;return this._data.words[e>>>5]|=128<<24-e%32,this._data.words[(e+64>>>9<<4)+14]=Math.floor(n/4294967296),this._data.words[(e+64>>>9<<4)+15]=n,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}}function oe(r){return new se().finalize(r).toString(Z)}function de(r,i={}){const n=typeof r=="string"?r:B(r,i);return oe(n).slice(0,10)}function ae(r,i,n={}){return r===i||B(r,n)===B(i,n)}function p(r){if(typeof r!="object")return r;var i,n,e=Object.prototype.toString.call(r);if(e==="[object Object]"){if(r.constructor!==Object&&typeof r.constructor=="function"){n=new r.constructor;for(i in r)r.hasOwnProperty(i)&&n[i]!==r[i]&&(n[i]=p(r[i]))}else{n={};for(i in r)i==="__proto__"?Object.defineProperty(n,i,{value:p(r[i]),configurable:!0,enumerable:!0,writable:!0}):n[i]=p(r[i])}return n}if(e==="[object Array]"){for(i=r.length,n=Array(i);i--;)n[i]=p(r[i]);return n}return e==="[object Set]"?(n=new Set,r.forEach(function(t){n.add(p(t))}),n):e==="[object Map]"?(n=new Map,r.forEach(function(t,o){n.set(p(o),p(t))}),n):e==="[object Date]"?new Date(+r):e==="[object RegExp]"?(n=new RegExp(r.source,r.flags),n.lastIndex=r.lastIndex,n):e==="[object DataView]"?new r.constructor(p(r.buffer)):e==="[object ArrayBuffer]"?r.slice(0):e.slice(-6)==="Array]"?new r.constructor(r):r}const ce={path:"/",watch:!0,decode:r=>K(decodeURIComponent(r)),encode:r=>encodeURIComponent(typeof r=="string"?r:JSON.stringify(r))},ue=void 0;function k(r,i){var c;const n={...ce,...i},e=O(n)||{};let t;n.maxAge!==void 0?t=n.maxAge*1e3:n.expires&&(t=n.expires.getTime()-Date.now());const o=t!==void 0&&t<=0,s=p(o?void 0:e[r]??((c=n.default)==null?void 0:c.call(n))),a=t&&!o?he(s,t,n.watch&&n.watch!=="shallow"):P(s);{let u=null;try{!ue&&typeof BroadcastChannel<"u"&&(u=new BroadcastChannel(`nuxt:cookies:${r}`))}catch{}const f=()=>{n.readonly||ae(a.value,e[r])||(fe(r,a.value,n),e[r]=p(a.value),u==null||u.postMessage({value:n.encode(a.value)}))},h=g=>{var b;const v=g.refresh?(b=O(n))==null?void 0:b[r]:n.decode(g.value);l=!0,e[r]=a.value=v,q(()=>{l=!1})};let l=!1;R()&&z(()=>{l=!0,f(),u==null||u.close()}),u&&(u.onmessage=({data:g})=>h(g)),n.watch?D(a,()=>{l||f()},{deep:n.watch!=="shallow"}):f()}return a}function O(r={}){return V(document.cookie,r)}function le(r,i,n={}){return i==null?T(r,i,{...n,maxAge:-1}):T(r,i,n)}function fe(r,i,n={}){document.cookie=le(r,i,n)}const j=2147483647;function he(r,i,n){let e,t,o=0;const s=n?P(r):{value:r};return R()&&z(()=>{t==null||t(),clearTimeout(e)}),H((a,c)=>{n&&(t=D(s,c));function u(){clearTimeout(e);const f=i-o,h=f{if(o+=h,o({isEnabled:()=>{const e=x().query;return Object.prototype.hasOwnProperty.call(e,"preview")&&!e.preview?!1:!!(e.preview||k("previewToken").value||sessionStorage.getItem("previewToken"))},getPreviewToken:()=>k("previewToken").value||sessionStorage.getItem("previewToken")||void 0,setPreviewToken:e=>{k("previewToken").value=e,x().query.preview=e||"",e?sessionStorage.setItem("previewToken",e):sessionStorage.removeItem("previewToken"),window.location.reload()}});export{de as h,ye as u}; diff --git a/_nuxt/BqBwjWqG.js b/_nuxt/BqBwjWqG.js deleted file mode 100644 index f6499db..0000000 --- a/_nuxt/BqBwjWqG.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o}from"./BneHlRLI.js";import{u as e}from"./maW11VfC.js";import{f as i,g as r,o as n}from"./BlS8upJP.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const u=i({__name:"how-playwright-initializes",setup(p){return e({title:"QAComet | How importing from Playwright works",meta:[{name:"description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:image",content:"https://qacomet.com/img/playwright/playwright-core_initialization_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | How importing from playwright works"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",datePublished:"2024-03-13T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(a,m)=>{const t=o;return n(),r(t,{title:"How importing from Playwright works",path:"playwright/how-playwright-initializes"})}}});export{u as default}; diff --git a/_nuxt/BqUvtMHT.js b/_nuxt/BqUvtMHT.js new file mode 100644 index 0000000..ffae6e5 --- /dev/null +++ b/_nuxt/BqUvtMHT.js @@ -0,0 +1 @@ +import{Q as C,R as y,S as w,K as b,T as O,U as B,D as M,V as _,y as R,s as S,i as z,z as E,W as H}from"./DiyP6pou.js";const K=s=>s==="defer"||s===!1;function U(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=R(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(K(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=j(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=S(c),r.data.value=z(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>T(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=E();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=H();if(a.watch){const n=M(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function T(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function j(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{U as u}; diff --git a/_nuxt/BsYmvPZw.js b/_nuxt/BsYmvPZw.js deleted file mode 100644 index 1c1cb1b..0000000 --- a/_nuxt/BsYmvPZw.js +++ /dev/null @@ -1 +0,0 @@ -const l=/\d/,C=["-","_","/","."];function h(e=""){if(!l.test(e))return e!==e.toLowerCase()}function c(e,t){const i=t??C,r=[];if(!e||typeof e!="string")return r;let n="",o,u;for(const s of e){const p=i.includes(s);if(p===!0){r.push(n),n="",o=void 0;continue}const a=h(s);if(u===!1){if(o===!1&&a===!0){r.push(n),n=s,o=a;continue}if(o===!0&&a===!1&&n.length>1){const f=n.at(-1);r.push(n.slice(0,Math.max(0,n.length-1))),n=f+s,o=a;continue}}n+=s,o=a,u=p}return r.push(n),r}function y(e){return e?e[0].toUpperCase()+e.slice(1):""}function A(e,t){return e?(Array.isArray(e)?e:c(e)).map(i=>y(t!=null&&t.normalize?i.toLowerCase():i)).join(""):""}function R(e,t){return e?(Array.isArray(e)?e:c(e)).map(i=>i.toLowerCase()).join(t??"-"):""}export{R as k,A as p}; diff --git a/_nuxt/BzoHbl1P.js b/_nuxt/BzoHbl1P.js deleted file mode 100644 index 0a3765b..0000000 --- a/_nuxt/BzoHbl1P.js +++ /dev/null @@ -1 +0,0 @@ -import i from"./Cz78Sion.js";import{f as a,c as s,a as e,b as m,u as c,o as p}from"./BlS8upJP.js";import{u as d}from"./maW11VfC.js";import{_ as g}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const _={class:"page-wrapper"},l={class:"legal-outer"},u=e("h1",{class:"page-header"},"Terms & Conditions",-1),T=a({__name:"terms-and-conditions",setup(h){const o=c(),t=new URL(o.public.baseUrl);t.pathname=g;const n=t.toString();return d({title:"QAComet - Terms & Conditions",meta:[{name:"description",content:"Terms and Conditions for QAComet"},{property:"og:image",content:n},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(f,y)=>{const r=i;return p(),s("div",_,[e("div",l,[u,m(r,{path:"/terms-and-conditions"})])])}}});export{T as default}; diff --git a/_nuxt/C-v3KzvZ.js b/_nuxt/C-v3KzvZ.js new file mode 100644 index 0000000..2ec26af --- /dev/null +++ b/_nuxt/C-v3KzvZ.js @@ -0,0 +1 @@ +const l=/\d/,C=["-","_","/","."];function h(e=""){if(!l.test(e))return e!==e.toLowerCase()}function c(e,o){const t=C,r=[];if(!e||typeof e!="string")return r;let n="",i,u;for(const s of e){const p=t.includes(s);if(p===!0){r.push(n),n="",i=void 0;continue}const a=h(s);if(u===!1){if(i===!1&&a===!0){r.push(n),n=s,i=a;continue}if(i===!0&&a===!1&&n.length>1){const f=n.at(-1);r.push(n.slice(0,Math.max(0,n.length-1))),n=f+s,i=a;continue}}n+=s,i=a,u=p}return r.push(n),r}function y(e){return e?e[0].toUpperCase()+e.slice(1):""}function A(e,o){return e?(Array.isArray(e)?e:c(e)).map(t=>y(o!=null&&o.normalize?t.toLowerCase():t)).join(""):""}function R(e,o){return e?(Array.isArray(e)?e:c(e)).map(t=>t.toLowerCase()).join("-"):""}export{R as k,A as p}; diff --git a/_nuxt/Cst9DoAH.js b/_nuxt/C3TgqYuk.js similarity index 65% rename from _nuxt/Cst9DoAH.js rename to _nuxt/C3TgqYuk.js index 7a9dd4b..d193a73 100644 --- a/_nuxt/Cst9DoAH.js +++ b/_nuxt/C3TgqYuk.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const a={};function c(e,l){return r(),t("table",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./DiyP6pou.js";const a={};function c(e,l){return r(),t("table",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; diff --git a/_nuxt/B0VAc3Z5.js b/_nuxt/C4g8nH2O.js similarity index 95% rename from _nuxt/B0VAc3Z5.js rename to _nuxt/C4g8nH2O.js index 85d40c3..99cba01 100644 --- a/_nuxt/B0VAc3Z5.js +++ b/_nuxt/C4g8nH2O.js @@ -1 +1 @@ -import{u as o}from"./maW11VfC.js";import{_ as a,o as s,c as i,a as e,t as r,p as u,e as l}from"./BlS8upJP.js";const c=t=>(u("data-v-6fdef64d"),t=t(),l(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},f=["textContent"],g=["textContent"],b={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,f),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,g)])]))}},w=a(b,[["__scopeId","data-v-6fdef64d"]]);export{w as default}; +import{u as o}from"./ChQXwC9l.js";import{_ as a,o as s,c as i,a as e,t as r,p as u,e as l}from"./DiyP6pou.js";const c=t=>(u("data-v-6fdef64d"),t=t(),l(),t),d={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},p=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),h={class:"max-w-520px text-center"},f=["textContent"],g=["textContent"],b={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const n=t;return o({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(m,x)=>(s(),i("div",d,[p,e("div",h,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:r(t.statusCode)},null,8,f),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:r(t.description)},null,8,g)])]))}},w=a(b,[["__scopeId","data-v-6fdef64d"]]);export{w as default}; diff --git a/_nuxt/C5ITgUyT.js b/_nuxt/C5ITgUyT.js new file mode 100644 index 0000000..6b688bf --- /dev/null +++ b/_nuxt/C5ITgUyT.js @@ -0,0 +1 @@ +import n from"./_ufwR5o8.js";import{f as a,c as r,a as t,b as i,u as c,o as m}from"./DiyP6pou.js";import{_ as p}from"./e4iyi0z6.js";import"./ChQXwC9l.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./Cb50__Mb.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const _={class:"page-wrapper"},d={class:"legal-outer"},l=t("h1",{class:"page-header"},"Terms & Conditions",-1),R=a({__name:"terms-and-conditions",setup(f){const e=c(),o=new URL(e.public.baseUrl);return o.pathname=p,o.toString(),(g,u)=>{const s=n;return m(),r("div",_,[t("div",d,[l,i(s,{path:"/terms-and-conditions"})])])}}});export{R as default}; diff --git a/_nuxt/C17h_atD.js b/_nuxt/C5JBqY-4.js similarity index 96% rename from _nuxt/C17h_atD.js rename to _nuxt/C5JBqY-4.js index e05d13e..4846c24 100644 --- a/_nuxt/C17h_atD.js +++ b/_nuxt/C5JBqY-4.js @@ -1 +1 @@ -import{f as p,H as m,k as A,J as l,z as w}from"./BlS8upJP.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; +import{f as p,G as m,k as A,I as l,z as w}from"./DiyP6pou.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; diff --git a/_nuxt/CCgfT4mO.js b/_nuxt/CCgfT4mO.js deleted file mode 100644 index 1f66d41..0000000 --- a/_nuxt/CCgfT4mO.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n}from"./CZcQ1mDI.js";import{_ as s}from"./BneHlRLI.js";import{f as r,g as m,w as c,u as p,o as u,a as g,b as h}from"./BlS8upJP.js";import{u as l}from"./maW11VfC.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const d=""+new URL("open-graph-banner-automatisch.CS0Jtz2i.jpg",import.meta.url).href,f={class:"testimonial-outer"},N=r({__name:"automatisch",setup(_){const o=p(),t=new URL(o.public.baseUrl);t.pathname=d;const e=t.toString();return l({title:"Automatisch - A QAComet Case Study",meta:[{name:"description",content:"We've worked extensively with Automatisch providing a wide range of services, such as writing end to end tests, bug finding, and more. See our case study for details about our work."},{property:"og:image",content:e},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"Automatisch - QAComet Case Study"},{property:"og:url",content:"https://qacomet.com/case-studies/automatisch"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"NewsArticle",headline:"Automatisch - A QAComet Case Study",image:[e],datePublished:"2024-02-26T08:00:00-06:00",author:[{"@type":"Organization",name:"QAComet",url:"https://qacomet.com"}]})}]}),(y,w)=>{const a=n,i=s;return u(),m(i,{link:"https://automatisch.io",path:"/case-studies/automatisch"},{default:c(()=>[g("div",f,[h(a,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",testimonial:"I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product."})])]),_:1})}}});export{N as default}; diff --git a/_nuxt/CFzORWKb.js b/_nuxt/CFzORWKb.js deleted file mode 100644 index d60860a..0000000 --- a/_nuxt/CFzORWKb.js +++ /dev/null @@ -1 +0,0 @@ -import{a2 as _,f as B,k as b,S as P,a3 as w,a4 as L,a5 as N,a6 as T,a7 as I,J as C,A as U,P as j,a8 as O,a9 as V,aa as D,u as E,y as q,ab as F,ac as k,I as H,Q as z}from"./BlS8upJP.js";async function R(t,r=_()){const{path:s,matched:e}=r.resolve(t);if(!e.length||(r._routePreloaded||(r._routePreloaded=new Set),r._routePreloaded.has(s)))return;const n=r._preloadPromises=r._preloadPromises||[];if(n.length>4)return Promise.all(n).then(()=>R(t,r));r._routePreloaded.add(s);const i=e.map(u=>{var a;return(a=u.components)==null?void 0:a.default}).filter(u=>typeof u=="function");for(const u of i){const a=Promise.resolve(u()).catch(()=>{}).finally(()=>n.splice(n.indexOf(a)));n.push(a)}await Promise.all(n)}const M=(...t)=>t.find(r=>r!==void 0);function Q(t){const r=t.componentName||"NuxtLink";function s(e,n){if(!e||t.trailingSlash!=="append"&&t.trailingSlash!=="remove")return e;if(typeof e=="string")return S(e,t.trailingSlash);const i="path"in e&&e.path!==void 0?e.path:n(e).path;return{...e,name:void 0,path:S(i,t.trailingSlash)}}return B({name:r,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(e,{slots:n}){const i=_(),u=E(),a=b(()=>{const l=e.to||e.href||"";return s(l,i.resolve)}),f=b(()=>typeof a.value=="string"&&k(a.value,{acceptRelative:!0})),g=b(()=>e.target&&e.target!=="_self"),p=b(()=>e.external||g.value?!0:typeof a.value=="object"?!1:a.value===""||f.value),x=P(!1),v=P(null),A=l=>{var d;v.value=e.custom?(d=l==null?void 0:l.$el)==null?void 0:d.nextElementSibling:l==null?void 0:l.$el};if(e.prefetch!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!J()){const d=q();let h,o=null;w(()=>{const y=$();L(()=>{h=N(()=>{var c;(c=v==null?void 0:v.value)!=null&&c.tagName&&(o=y.observe(v.value,async()=>{o==null||o(),o=null;const m=typeof a.value=="string"?a.value:i.resolve(a.value).fullPath;await Promise.all([d.hooks.callHook("link:prefetch",m).catch(()=>{}),!p.value&&R(a.value,i).catch(()=>{})]),x.value=!0}))})})}),T(()=>{h&&I(h),o==null||o(),o=null})}return()=>{var o,y;if(!p.value){const c={ref:A,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(x.value&&(c.class=e.prefetchedClass||t.prefetchedClass),c.rel=e.rel||void 0),C(U("RouterLink"),c,n.default)}const l=typeof a.value=="object"?((o=i.resolve(a.value))==null?void 0:o.href)??null:a.value&&!e.external&&!f.value?s(j(u.app.baseURL,a.value),i.resolve):a.value||null,d=e.target||null,h=M(e.noRel?"":e.rel,t.externalRelAttribute,f.value||g.value?"noopener noreferrer":"")||null;if(e.custom){if(!n.default)return null;const c=()=>F(l,{replace:e.replace,external:e.external});return n.default({href:l,navigate:c,get route(){if(!l)return;const m=O(l);return{path:m.pathname,fullPath:m.pathname,get query(){return V(m.search)},hash:m.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:l}},rel:h,target:d,isExternal:p.value,isActive:!1,isExactActive:!1})}return C("a",{ref:v,href:l,rel:h,target:d},(y=n.default)==null?void 0:y.call(n))}}})}const G=Q(D);function S(t,r){const s=r==="append"?H:z;return k(t)&&!t.startsWith("http")?t:s(t,!0)}function $(){const t=q();if(t._observer)return t._observer;let r=null;const s=new Map,e=(i,u)=>(r||(r=new IntersectionObserver(a=>{for(const f of a){const g=s.get(f.target);(f.isIntersecting||f.intersectionRatio>0)&&g&&g()}})),s.set(i,u),r.observe(i),()=>{s.delete(i),r.unobserve(i),s.size===0&&(r.disconnect(),r=null)});return t._observer={observe:e}}function J(){const t=navigator.connection;return!!(t&&(t.saveData||/2g/.test(t.effectiveType)))}export{G as _}; diff --git a/_nuxt/BhCbx3Wd.js b/_nuxt/CGDdIL0g.js similarity index 64% rename from _nuxt/BhCbx3Wd.js rename to _nuxt/CGDdIL0g.js index e0353da..53350e8 100644 --- a/_nuxt/BhCbx3Wd.js +++ b/_nuxt/CGDdIL0g.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function l(e,n){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./DiyP6pou.js";const c={};function l(e,n){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",l]]);export{_ as default}; diff --git a/_nuxt/Q0Y17sdK.js b/_nuxt/CI0Itg7s.js similarity index 71% rename from _nuxt/Q0Y17sdK.js rename to _nuxt/CI0Itg7s.js index f605c7a..c938031 100644 --- a/_nuxt/Q0Y17sdK.js +++ b/_nuxt/CI0Itg7s.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH6",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./DiyP6pou.js";const l=["id"],p=["href"],k=d({__name:"ProseH6",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/CRh1_mKz.js b/_nuxt/CRh1_mKz.js deleted file mode 100644 index a6a9b50..0000000 --- a/_nuxt/CRh1_mKz.js +++ /dev/null @@ -1 +0,0 @@ -import{R as C,S as y,T as w,L as b,U as O,V as B,E,W as _,y as M,s as R,i as S,z,X as H}from"./BlS8upJP.js";const T=s=>s==="defer"||s===!1;function U(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=M(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(T(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=K(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=R(c),r.data.value=S(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>j(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=z();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=H();if(a.watch){const n=E(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function j(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function K(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{U as u}; diff --git a/_nuxt/CSXQV5-h.js b/_nuxt/CSXQV5-h.js deleted file mode 100644 index 1276425..0000000 --- a/_nuxt/CSXQV5-h.js +++ /dev/null @@ -1 +0,0 @@ -import i from"./Cz78Sion.js";import{f as s,c as a,a as t,b as m,u as c,o as p}from"./BlS8upJP.js";import{u as g}from"./maW11VfC.js";import{_}from"./Czu_W2CL.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./Bse8ef0b.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const d={class:"page-wrapper"},l={class:"legal-outer"},f=t("h1",{class:"page-header"},"Terms of Service",-1),I=s({__name:"terms-of-service",setup(u){const o=c(),e=new URL(o.public.baseUrl);e.pathname=_;const r=e.toString();return g({title:"QAComet - Terms of Service",meta:[{name:"description",content:"Terms of Service for QAComet"},{property:"og:image",content:r},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com/terms-of-service"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:site",content:"@qacomet"},{name:"twitter:creator",content:"@qacomet"}]}),(h,y)=>{const n=i;return p(),a("div",d,[t("div",l,[f,m(n,{path:"/terms-of-service"})])])}}});export{I as default}; diff --git a/_nuxt/BB7G3joz.js b/_nuxt/CW_zoPMf.js similarity index 64% rename from _nuxt/BB7G3joz.js rename to _nuxt/CW_zoPMf.js index 5d78f52..4dd9214 100644 --- a/_nuxt/BB7G3joz.js +++ b/_nuxt/CW_zoPMf.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,l as t}from"./BlS8upJP.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,l as t}from"./DiyP6pou.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/CZcQ1mDI.js b/_nuxt/CZcQ1mDI.js deleted file mode 100644 index e9aa1c1..0000000 --- a/_nuxt/CZcQ1mDI.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as S}from"./CFzORWKb.js";import{f as _,j as n,k as s,o as t,c as l,l as Z,m as V,n as A,a,C as f,i as g,t as H,b as y,d as M,w as $,p as k,e as x,_ as L}from"./BlS8upJP.js";const b=["width","height","fill","transform"],z={key:0},B=a("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},null,-1),C=[B],N={key:1},P=a("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"},null,-1),j=a("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"},null,-1),F=[P,j],I={key:2},U=a("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),E=[U],R={key:3},q=a("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"},null,-1),D=[q],Q={key:4},T=a("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"},null,-1),W=[T],G={key:5},O=a("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"},null,-1),J=[O],K={name:"PhArrowRight"},X=_({...K,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,w)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",z,C)):r.value==="duotone"?(t(),l("g",N,F)):r.value==="fill"?(t(),l("g",I,E)):r.value==="light"?(t(),l("g",R,D)):r.value==="regular"?(t(),l("g",Q,W)):r.value==="thin"?(t(),l("g",G,J)):V("",!0)],16,b))}}),Y=["width","height","fill","transform"],a0={key:0},e0=a("path",{d:"M100,52H40A20,20,0,0,0,20,72v64a20,20,0,0,0,20,20H96v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,100,52Zm-4,80H44V76H96ZM216,52H156a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20h56v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,216,52Zm-4,80H160V76h52Z"},null,-1),t0=[e0],l0={key:1},o0=a("path",{d:"M108,72v72H40a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8h60A8,8,0,0,1,108,72Zm108-8H156a8,8,0,0,0-8,8v64a8,8,0,0,0,8,8h68V72A8,8,0,0,0,216,64Z",opacity:"0.2"},null,-1),r0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),s0=[o0,r0],n0={key:2},i0=a("path",{d:"M116,72v88a48.05,48.05,0,0,1-48,48,8,8,0,0,1,0-16,32,32,0,0,0,32-32v-8H40a16,16,0,0,1-16-16V72A16,16,0,0,1,40,56h60A16,16,0,0,1,116,72ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Z"},null,-1),h0=[i0],c0={key:3},d0=a("path",{d:"M100,58H40A14,14,0,0,0,26,72v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,100,58Zm2,80H40a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2ZM216,58H156a14,14,0,0,0-14,14v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,216,58Zm2,80H156a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2Z"},null,-1),u0=[d0],v0={key:4},m0=a("path",{d:"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z"},null,-1),p0=[m0],g0={key:5},H0=a("path",{d:"M100,60H40A12,12,0,0,0,28,72v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,100,60Zm4,80H40a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM216,60H156a12,12,0,0,0-12,12v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,216,60Zm4,80H156a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4Z"},null,-1),y0=[H0],_0={name:"PhQuotes"},V0=_({..._0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(e){const o=e,i=n("weight","regular"),u=n("size","1em"),v=n("color","currentColor"),h=n("mirrored",!1),r=s(()=>o.weight??i),c=s(()=>o.size??u),m=s(()=>o.color??v),p=s(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:h?"scale(-1, 1)":void 0);return(d,w)=>(t(),l("svg",A({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:m.value,transform:p.value},d.$attrs),[Z(d.$slots,"default"),r.value==="bold"?(t(),l("g",a0,t0)):r.value==="duotone"?(t(),l("g",l0,s0)):r.value==="fill"?(t(),l("g",n0,h0)):r.value==="light"?(t(),l("g",c0,u0)):r.value==="regular"?(t(),l("g",v0,p0)):r.value==="thin"?(t(),l("g",g0,y0)):V("",!0)],16,Y))}}),Z0=e=>(k("data-v-97758cd8"),e=e(),x(),e),A0={class:"testimonial-wrapper"},w0={class:"left"},S0={class:"image-wrapper"},f0=["href"],M0={class:"right"},$0={class:"text-wrapper"},k0={class:"text"},x0={class:"name"},L0=["href"],b0={key:0,class:"see-more-outer"},z0=Z0(()=>a("span",{class:"see-more-text"},"Read Our Case Study",-1)),B0=_({__name:"Testimonial",props:{image:String,imageAlt:String,company:String,companyUrl:String,person:String,personUrl:String,testimonial:String,caseStudy:String},setup(e){const o=e,i=s(()=>({"background-image":'url("'+o.image+'")'}));return(u,v)=>{const h=S;return t(),l("div",A0,[a("div",w0,[a("div",S0,[a("div",{class:"image-container",style:f(g(i))},null,4)]),a("a",{class:"brand-wrapper",href:e.companyUrl},H(e.company),9,f0)]),a("div",M0,[a("div",$0,[y(g(V0),{color:"#F5F6F1"}),a("div",k0,[a("span",null,H(e.testimonial),1),a("span",x0,[M(" — "),a("a",{href:e.personUrl},H(e.person),9,L0)])])]),e.caseStudy?(t(),l("div",b0,[y(h,{to:e.caseStudy,class:"see-more-wrapper"},{default:$(()=>[z0,a("span",null,[y(g(X))])]),_:1},8,["to"])])):V("",!0)])])}}}),P0=L(B0,[["__scopeId","data-v-97758cd8"]]);export{X as F,V0 as G,P0 as _}; diff --git a/_nuxt/BRsYUypn.js b/_nuxt/CZxlAbJ7.js similarity index 78% rename from _nuxt/BRsYUypn.js rename to _nuxt/CZxlAbJ7.js index ab2b930..c4e3f6d 100644 --- a/_nuxt/BRsYUypn.js +++ b/_nuxt/CZxlAbJ7.js @@ -1 +1 @@ -import d from"./Bse8ef0b.js";import{f as c,H as l,J as f}from"./BlS8upJP.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";import"./BECgZIvk.js";const u=(r,t)=>f("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:p,query:a}=r,m={...a||{},path:p||(a==null?void 0:a.path)||"/"};return f(d,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:n})=>t.default({list:e,refresh:o,isPartial:n,...this.$attrs}):e=>u("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):u("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):u("not-found",e==null?void 0:e.data)}})}}),S=h;export{S as default}; +import d from"./Cb50__Mb.js";import{f as c,G as l,I as f}from"./DiyP6pou.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";import"./BpUWW4O-.js";const u=(r,t)=>f("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:p,query:a}=r,m={...a||{},path:p||(a==null?void 0:a.path)||"/"};return f(d,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:n})=>t.default({list:e,refresh:o,isPartial:n,...this.$attrs}):e=>u("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):u("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):u("not-found",e==null?void 0:e.data)}})}}),S=h;export{S as default}; diff --git a/_nuxt/DQA0lbK1.js b/_nuxt/CaXXO5HX.js similarity index 71% rename from _nuxt/DQA0lbK1.js rename to _nuxt/CaXXO5HX.js index 8074549..3a0fe2e 100644 --- a/_nuxt/DQA0lbK1.js +++ b/_nuxt/CaXXO5HX.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH5",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./DiyP6pou.js";const l=["id"],p=["href"],k=d({__name:"ProseH5",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/Bse8ef0b.js b/_nuxt/Cb50__Mb.js similarity index 89% rename from _nuxt/Bse8ef0b.js rename to _nuxt/Cb50__Mb.js index 06d63b1..f6cfb5b 100644 --- a/_nuxt/Bse8ef0b.js +++ b/_nuxt/Cb50__Mb.js @@ -1 +1 @@ -import{u as g}from"./CRh1_mKz.js";import{q as m}from"./DF1VbFfH.js";import{f as C,v as S,k as b,u as k,E as _,H as A,J as N}from"./BlS8upJP.js";import{h as O}from"./BECgZIvk.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!k().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${O(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=A(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>N("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),J=Q;export{J as default}; +import{u as g}from"./BqUvtMHT.js";import{q as m}from"./DEZhdWR8.js";import{f as C,v as S,k as b,u as k,D as _,G as A,I as N}from"./DiyP6pou.js";import{h as O}from"./BpUWW4O-.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!k().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${O(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=A(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>N("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),D=Q;export{D as default}; diff --git a/_nuxt/D2xr6gf6.js b/_nuxt/Cfp4urEI.js similarity index 71% rename from _nuxt/D2xr6gf6.js rename to _nuxt/Cfp4urEI.js index 0e1e21b..90e413e 100644 --- a/_nuxt/D2xr6gf6.js +++ b/_nuxt/Cfp4urEI.js @@ -1 +1 @@ -import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./BlS8upJP.js";const l=["id"],p=["href"],k=d({__name:"ProseH3",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as d,u as c,k as u,o as s,c as n,i as f,l as t}from"./DiyP6pou.js";const l=["id"],p=["href"],k=d({__name:"ProseH3",props:{id:{}},setup(r){const a=r,{headings:o}=c().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&f(i)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,p)):t(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/maW11VfC.js b/_nuxt/ChQXwC9l.js similarity index 67% rename from _nuxt/maW11VfC.js rename to _nuxt/ChQXwC9l.js index e3942e2..5c82559 100644 --- a/_nuxt/maW11VfC.js +++ b/_nuxt/ChQXwC9l.js @@ -1 +1 @@ -import{ad as f,S as u,ae as o,E as d,a6 as v,af as l,ag as i,z as h,ah as m}from"./BlS8upJP.js";function U(t,a={}){const e=a.head||f();if(e)return e.ssr?e.push(t,a):p(e,t,a)}function p(t,a,e={}){const s=u(!1),n=u({});o(()=>{n.value=s.value?{}:m(a)});const r=t.push(n.value,e);return d(n,c=>{r.patch(c)}),h()&&(v(()=>{r.dispose()}),l(()=>{s.value=!0}),i(()=>{s.value=!1})),r}export{U as u}; +import{ad as f,R as u,ae as o,D as d,a6 as v,af as l,ag as i,z as h,ah as m}from"./DiyP6pou.js";function U(t,a={}){const e=a.head||f();if(e)return e.ssr?e.push(t,a):p(e,t,a)}function p(t,a,e={}){const s=u(!1),n=u({});o(()=>{n.value=s.value?{}:m(a)});const r=t.push(n.value,e);return d(n,c=>{r.patch(c)}),h()&&(v(()=>{r.dispose()}),l(()=>{s.value=!0}),i(()=>{s.value=!1})),r}export{U as u}; diff --git a/_nuxt/Ci9wJC62.js b/_nuxt/Ci9wJC62.js new file mode 100644 index 0000000..225439f --- /dev/null +++ b/_nuxt/Ci9wJC62.js @@ -0,0 +1 @@ +import{_ as V}from"./Djecwb_v.js";import{u as x}from"./ChQXwC9l.js";import{f as H,j as i,k as r,o as t,c as a,l as _,m as Z,n as k,a as e,x as $,b as n,w as p,C as A,i as w,F as L,A as y,d as g}from"./DiyP6pou.js";const b=["width","height","fill","transform"],B={key:0},S=e("path",{d:"M224,44H32A12,12,0,0,0,20,56V192a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A12,12,0,0,0,224,44Zm-96,83.72L62.85,68h130.3ZM92.79,128,44,172.72V83.28Zm17.76,16.28,9.34,8.57a12,12,0,0,0,16.22,0l9.34-8.57L193.15,188H62.85ZM163.21,128,212,83.28v89.44Z"},null,-1),z=[S],F={key:1},N=e("path",{d:"M224,56l-96,88L32,56Z",opacity:"0.2"},null,-1),P=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),T=[N,P],q={key:2},D=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),E=[D],W={key:3},j=e("path",{d:"M224,50H32a6,6,0,0,0-6,6V192a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A6,6,0,0,0,224,50Zm-96,85.86L47.42,62H208.58ZM101.67,128,38,186.36V69.64Zm8.88,8.14L124,148.42a6,6,0,0,0,8.1,0l13.4-12.28L208.58,194H47.43ZM154.33,128,218,69.64V186.36Z"},null,-1),G=[j],Q={key:4},I=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),O=[I],U={key:5},R=e("path",{d:"M224,52H32a4,4,0,0,0-4,4V192a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A4,4,0,0,0,224,52Zm-96,86.57L42.28,60H213.72ZM104.63,128,36,190.91V65.09Zm5.92,5.43L125.3,147a4,4,0,0,0,5.4,0l14.75-13.52L213.72,196H42.28ZM151.37,128,220,65.09V190.91Z"},null,-1),Y=[R],J={name:"PhEnvelope"},K=H({...J,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(v){const o=v,d=i("weight","regular"),m=i("size","1em"),u=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??u),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(t(),a("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(t(),a("g",B,z)):l.value==="duotone"?(t(),a("g",F,T)):l.value==="fill"?(t(),a("g",q,E)):l.value==="light"?(t(),a("g",W,G)):l.value==="regular"?(t(),a("g",Q,O)):l.value==="thin"?(t(),a("g",U,Y)):Z("",!0)],16,b))}}),X=["width","height","fill","transform"],e1={key:0},t1=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"},null,-1),a1=[t1],o1={key:1},l1=e("path",{d:"M216,64V192H40V64Z",opacity:"0.2"},null,-1),s1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),i1=[l1,s1],r1={key:2},n1=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"},null,-1),c1=[n1],h1={key:3},d1=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"},null,-1),m1=[d1],p1={key:4},g1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),v1=[g1],u1={key:5},f1=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"},null,-1),C1=[f1],w1={name:"PhList"},H1=H({...w1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(v){const o=v,d=i("weight","regular"),m=i("size","1em"),u=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??u),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(t(),a("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(t(),a("g",e1,a1)):l.value==="duotone"?(t(),a("g",o1,i1)):l.value==="fill"?(t(),a("g",r1,c1)):l.value==="light"?(t(),a("g",h1,m1)):l.value==="regular"?(t(),a("g",p1,v1)):l.value==="thin"?(t(),a("g",u1,C1)):Z("",!0)],16,X))}}),_1=["width","height","fill","transform"],Z1={key:0},k1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-56,0a16,16,0,1,1,16,16A16,16,0,0,1,112,104Zm112,92H140v-8.87a84,84,0,1,0-24,0V196H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM68,104a60,60,0,1,1,60,60A60.07,60.07,0,0,1,68,104Z"},null,-1),M1=[k1],y1={key:1},V1=e("path",{d:"M128,32a72,72,0,1,0,72,72A72,72,0,0,0,128,32Zm0,104a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z",opacity:"0.2"},null,-1),x1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),$1=[V1,x1],A1={key:2},L1=e("path",{d:"M160,104a32,32,0,1,1-32-32A32,32,0,0,1,160,104Zm72,104a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h88V183.6a80,80,0,1,1,16,0V200h88A8,8,0,0,1,232,208ZM128,152a48,48,0,1,0-48-48A48.05,48.05,0,0,0,128,152Z"},null,-1),b1=[L1],B1={key:3},S1=e("path",{d:"M166,104a38,38,0,1,0-38,38A38,38,0,0,0,166,104Zm-64,0a26,26,0,1,1,26,26A26,26,0,0,1,102,104Zm122,98H134V181.75a78,78,0,1,0-12,0V202H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM62,104a66,66,0,1,1,66,66A66.08,66.08,0,0,1,62,104Z"},null,-1),z1=[S1],F1={key:4},N1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),P1=[N1],T1={key:5},q1=e("path",{d:"M164,104a36,36,0,1,0-36,36A36,36,0,0,0,164,104Zm-64,0a28,28,0,1,1,28,28A28,28,0,0,1,100,104ZM224,204H132V179.89a76,76,0,1,0-8,0V204H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM60,104a68,68,0,1,1,68,68A68.07,68.07,0,0,1,60,104Z"},null,-1),D1=[q1],E1={name:"PhWebcam"},W1=H({...E1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(v){const o=v,d=i("weight","regular"),m=i("size","1em"),u=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??u),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(t(),a("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(t(),a("g",Z1,M1)):l.value==="duotone"?(t(),a("g",y1,$1)):l.value==="fill"?(t(),a("g",A1,b1)):l.value==="light"?(t(),a("g",B1,z1)):l.value==="regular"?(t(),a("g",F1,P1)):l.value==="thin"?(t(),a("g",T1,D1)):Z("",!0)],16,_1))}}),j1="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%2027%2027'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;'%3e%3cg%20transform='matrix(1,0,0,1,-2.69278,-2.69278)'%3e%3cg%20transform='matrix(0.707107,0.707107,-0.707107,0.707107,15.9609,-5.3514)'%3e%3cg%20transform='matrix(-1,5.72459e-17,-1.78677e-16,1.16352,31.1254,-2.7646)'%3e%3cpath%20d='M16,30.287C17.302,27.607%2018.843,23.262%2019.905,22.248C20.664,21.523%2022.019,25.187%2022.374,24.2C23.063,22.286%2024.039,16.218%2024.039,10.763C24.039,5.307%2018.68,2.723%2016,2.723C13.32,2.723%207.961,5.307%207.961,10.763C7.961,16.218%208.937,22.286%209.626,24.2C9.981,25.187%2011.336,21.523%2012.095,22.248C13.157,23.262%2014.698,27.607%2016,30.287'%20style='fill:rgb(245,245,241);stroke:rgb(245,245,241);stroke-width:1.84px;'/%3e%3c/g%3e%3cg%20transform='matrix(0.61912,-0.61912,0.554112,0.554112,-6.10261,3.31527)'%3e%3cellipse%20cx='13.502'%20cy='23.224'%20rx='5.14'%20ry='5.742'%20style='fill:rgb(16,12,10);'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",G1="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1800'%20height='1200'%3e%3cpath%20fill='%23002868'%20d='M0%200h1800v1200H0'/%3e%3cpath%20fill='%23fff'%20d='M0%20400h1800v400H0'/%3e%3cpath%20d='M1130.81,750A400,400%200%201,1%201130.81,450L760,600'%20fill='%23BF0A30'/%3e%3ccircle%20cx='760'%20cy='600'%20r='200'%20fill='gold'/%3e%3c/svg%3e",Q1={class:"navbar"},I1={class:"nav-main"},O1=e("img",{src:j1,alt:"QAComet Logo"},null,-1),U1=e("span",null,"QAComet",-1),R1=y('Why QAComet?Recent WorkTasksFAQsStart Today',5),Y1=[R1],J1=e("a",{href:"/#plan",class:"nav-cta"},"Start Today",-1),K1={class:"main"},X1={class:"page-footer"},e0={class:"page-wrapper footer-wrapper"},t0={class:"footer-sections"},a0={class:"footer-section"},o0=e("div",{class:"footer-logo"},null,-1),l0=e("div",{class:"footer-section-title"},"Contact",-1),s0={class:"footer-links"},i0={class:"link-wrapper"},r0={class:"link-icon"},n0=e("div",{class:"link-text"},[e("a",{href:"mailto:hello@qacomet.com"},"Email us")],-1),c0={class:"link-wrapper"},h0={class:"link-icon"},d0=e("div",{class:"link-text"},[e("a",{href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call"},"Book a free call")],-1),m0=y('',2),p0={class:"footer-section"},g0=e("div",{class:"footer-section-title"},"Blog",-1),v0={class:"footer-links"},u0={class:"footer-section"},f0=e("div",{class:"footer-section-title"},"Links",-1),C0={class:"footer-links"},w0=e("a",{href:"mailto:hello@qacomet.com"},"Contact",-1),H0=e("div",{class:"footer-end"},[e("span",{class:"copy"},[e("img",{src:G1,alt:"Colorado Flag"}),g(" © 2024 QAComet LLC")])],-1),M0=H({__name:"default",setup(v){const o=$({menu:!1});function d(){o.menu=!o.menu}return x({meta:[{name:"msapplication-TileColor",content:"#F5F6F1"},{name:"theme-color",content:"#F5F6F1"}],link:[{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"},{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"},{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"},{rel:"icon",href:"/favicon.ico"},{rel:"manifest",href:"/site.webmanifest"},{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:"#100c09"}]}),(m,u)=>{const s=V;return t(),a(L,null,[e("nav",Q1,[e("div",I1,[n(s,{to:"/",class:"nav-logo"},{default:p(()=>[O1,U1]),_:1}),e("div",{class:A(["nav-links",{"display-nav-links":w(o).menu}])},Y1,2),J1,e("button",{class:"menu",onClick:d,"aria-label":"Toggle mobile menu"},[n(w(H1),{color:"#F5F6F1",weight:"bold"})])])]),e("div",K1,[_(m.$slots,"default"),e("footer",X1,[e("div",e0,[e("div",t0,[e("div",a0,[o0,l0,e("div",s0,[e("div",i0,[e("div",r0,[n(w(K))]),n0]),e("div",c0,[e("div",h0,[n(w(W1))]),d0])]),m0]),e("div",p0,[g0,e("div",v0,[n(s,{to:"/white-papers/",prefetch:""},{default:p(()=>[g("White Papers")]),_:1}),n(s,{to:"/case-studies/",prefetch:""},{default:p(()=>[g("Case Studies")]),_:1}),n(s,{to:"/playwright/",prefetch:""},{default:p(()=>[g("Playwright Internals")]),_:1})])]),e("div",u0,[f0,e("div",C0,[n(s,{to:"/terms-of-service/",prefetch:""},{default:p(()=>[g("Terms of Service")]),_:1}),n(s,{to:"/terms-and-conditions/",prefetch:""},{default:p(()=>[g("Terms & Conditions")]),_:1}),n(s,{to:"/privacy-policy/",prefetch:""},{default:p(()=>[g("Privacy Policy")]),_:1}),w0])])]),H0])])])],64)}}});export{M0 as default}; diff --git a/_nuxt/4r0YjvSz.js b/_nuxt/Ck8lORen.js similarity index 72% rename from _nuxt/4r0YjvSz.js rename to _nuxt/Ck8lORen.js index 963f0a0..a5a0b83 100644 --- a/_nuxt/4r0YjvSz.js +++ b/_nuxt/Ck8lORen.js @@ -1 +1 @@ -import{f as o,i as s,o as n,c as r,d as e,m as a,a as t}from"./BlS8upJP.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; +import{f as o,i as s,o as n,c as r,d as e,m as a,a as t}from"./DiyP6pou.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; diff --git a/_nuxt/Ck9OydBO.js b/_nuxt/Ck9OydBO.js new file mode 100644 index 0000000..ffb7229 --- /dev/null +++ b/_nuxt/Ck9OydBO.js @@ -0,0 +1 @@ +import{_ as t}from"./Du8iVdrZ.js";import{f as e,g as r,o as i}from"./DiyP6pou.js";import"./Djecwb_v.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const h=e({__name:"how-qa-factors-into-vc-due-diligence",setup(n){return(a,c)=>{const o=t;return i(),r(o,{title:"How Software QA Factors Into VC Investment Decisions",path:"white-papers/how-qa-factors-into-vc-due-diligence"})}}});export{h as default}; diff --git a/_nuxt/CGfQlKlL.js b/_nuxt/Ckubu9hk.js similarity index 64% rename from _nuxt/CGfQlKlL.js rename to _nuxt/Ckubu9hk.js index ca626b7..1ba78f5 100644 --- a/_nuxt/CGfQlKlL.js +++ b/_nuxt/Ckubu9hk.js @@ -1 +1 @@ -import{_ as o,o as n,c as r,l as c}from"./BlS8upJP.js";const s={};function t(e,l){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; +import{_ as o,o as n,c as r,l as c}from"./DiyP6pou.js";const s={};function t(e,l){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; diff --git a/_nuxt/Cn1tIV_T.js b/_nuxt/Cn1tIV_T.js deleted file mode 100644 index dfe2b45..0000000 --- a/_nuxt/Cn1tIV_T.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as h}from"./CFzORWKb.js";import{u as _}from"./CRh1_mKz.js";import{q as m}from"./DF1VbFfH.js";import{u as g}from"./maW11VfC.js";import{f as y,h as w,c as n,a as t,F as u,r as f,i as v,o as a,t as o,b as l,w as d,d as i}from"./BlS8upJP.js";import"./BECgZIvk.js";const k={class:"blog-outer"},C={class:"blog-wrapper"},b=t("div",{class:"blog-header"},[t("h1",null,"Playwright Internals"),t("h2",{class:"subheader"},"A series on the inner workings of Microsoft's Playwright framework")],-1),x={class:"content-wrapper"},A={class:"blog-post-wrapper"},P={class:"date-wrapper"},Q={class:"month"},q={class:"day"},D={class:"year"},N={class:"description-wrapper"},E=y({__name:"index",async setup(B){let r,s;const{data:p}=([r,s]=w(()=>_("playwright-posts",()=>m("/playwright").only(["title","link","created","shortDescription"]).sort({"created.number":-1,$numeric:!0}).find())),r=await r,s(),r);return g({title:"QAComet | Internals of Playwright",meta:[{name:"description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_of_playwright_linkedin.jpg"},{property:"og:image:width",content:"1200"},{property:"og:image:height",content:"630"},{property:"og:title",content:"QAComet | Internals of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Have you ever wanted to dive into the internals of Playwright? This series of posts will take you deep into the inner workings of Playwright."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(H,I)=>{const c=h;return a(),n("div",k,[t("div",C,[b,t("div",x,[(a(!0),n(u,null,f(v(p),e=>(a(),n("div",A,[t("div",P,[t("div",Q,o(e.created.month),1),t("div",q,o(e.created.day),1),t("div",D,o(e.created.year),1)]),t("div",N,[t("h3",null,[l(c,{to:e.link},{default:d(()=>[i(o(e.title),1)]),_:2},1032,["to"])]),t("p",null,[i(o(e.shortDescription)+" ",1),l(c,{class:"read",to:e.link},{default:d(()=>[i("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{E as default}; diff --git a/_nuxt/dzMqTbw3.js b/_nuxt/CukA5Xl1.js similarity index 79% rename from _nuxt/dzMqTbw3.js rename to _nuxt/CukA5Xl1.js index 3852490..e1b036d 100644 --- a/_nuxt/dzMqTbw3.js +++ b/_nuxt/CukA5Xl1.js @@ -1 +1 @@ -import{f as r,k as n,o as c,c as h,i as o,O as u,I as l,u as d,P as f}from"./BlS8upJP.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,a=n(()=>{var i;if((i=t.src)!=null&&i.startsWith("/")&&!t.src.startsWith("//")){const s=u(l(d().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return f(s,t.src)}return t.src});return(i,s)=>(c(),h("img",{src:o(a),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; +import{f as r,k as n,o as c,c as h,i as o,N as u,H as l,u as d,O as f}from"./DiyP6pou.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,a=n(()=>{var i;if((i=t.src)!=null&&i.startsWith("/")&&!t.src.startsWith("//")){const s=u(l(d().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return f(s,t.src)}return t.src});return(i,s)=>(c(),h("img",{src:o(a),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; diff --git a/_nuxt/R-gFWJPL.js b/_nuxt/Cw0Mq-1J.js similarity index 95% rename from _nuxt/R-gFWJPL.js rename to _nuxt/Cw0Mq-1J.js index f173dd0..b424100 100644 --- a/_nuxt/R-gFWJPL.js +++ b/_nuxt/Cw0Mq-1J.js @@ -1 +1 @@ -import{_ as a}from"./CFzORWKb.js";import{u as s}from"./maW11VfC.js";import{_ as i,o as u,c,a as e,t as o,b as d,w as l,d as p,p as h,e as f}from"./BlS8upJP.js";const g=t=>(h("data-v-73a07988"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},m=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),x={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const r=a;return u(),c("div",b,[m,e("div",x,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[d(r,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:l(()=>[p(o(t.backHome),1)]),_:1})])])])}}},I=i(w,[["__scopeId","data-v-73a07988"]]);export{I as default}; +import{_ as a}from"./Djecwb_v.js";import{u as s}from"./ChQXwC9l.js";import{_ as i,o as u,c,a as e,t as o,b as d,w as l,d as p,p as h,e as f}from"./DiyP6pou.js";const g=t=>(h("data-v-73a07988"),t=t(),f(),t),b={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},m=g(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),x={class:"max-w-520px text-center z-20"},y=["textContent"],_=["textContent"],k={class:"w-full flex items-center justify-center"},w={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const n=t;return s({title:`${n.statusCode} - ${n.statusMessage} | ${n.appName}`,script:[],style:[{children:'*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}:before,:after{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / .5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(z,S)=>{const r=a;return u(),c("div",b,[m,e("div",x,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:o(t.statusCode)},null,8,y),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:o(t.description)},null,8,_),e("div",k,[d(r,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:l(()=>[p(o(t.backHome),1)]),_:1})])])])}}},I=i(w,[["__scopeId","data-v-73a07988"]]);export{I as default}; diff --git a/_nuxt/B60RBlQ9.js b/_nuxt/Cw7TSr0H.js similarity index 65% rename from _nuxt/B60RBlQ9.js rename to _nuxt/Cw7TSr0H.js index fb45900..43eee0a 100644 --- a/_nuxt/B60RBlQ9.js +++ b/_nuxt/Cw7TSr0H.js @@ -1 +1 @@ -import{_ as o,o as t,c,l as r}from"./BlS8upJP.js";const s={};function l(e,n){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",l]]);export{_ as default}; +import{_ as o,o as t,c,l as r}from"./DiyP6pou.js";const s={};function l(e,n){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",l]]);export{_ as default}; diff --git a/_nuxt/Cz78Sion.js b/_nuxt/Cz78Sion.js deleted file mode 100644 index bab2b2d..0000000 --- a/_nuxt/Cz78Sion.js +++ /dev/null @@ -1 +0,0 @@ -import{i as d,E as w,q as y,G as D,u as g,f as H,H as q,I as S,J as u}from"./BlS8upJP.js";import{u as _}from"./maW11VfC.js";import b from"./BxiCSTFT.js";import x from"./Bse8ef0b.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const a=(p,s=y())=>{const e=d(p),f=g();w(()=>d(p),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),D(()=>_(t))},{immediate:!0})},$=H({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(p){const{contentHead:s}=g().public.content,e=q(),{tag:f,excerpt:m,path:n,query:t,head:r}=p,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||S(y().path),find:"one"},C=(o,i)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return u(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),u(b,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||u("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||u("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),E=$;export{E as default}; diff --git a/_nuxt/Czu_W2CL.js b/_nuxt/Czu_W2CL.js deleted file mode 100644 index 0ded20c..0000000 --- a/_nuxt/Czu_W2CL.js +++ /dev/null @@ -1 +0,0 @@ -import"./BlS8upJP.js";const o=""+new URL("open-graph-banner.Cso2_SHa.jpg",import.meta.url).href;export{o as _}; diff --git a/_nuxt/DF1VbFfH.js b/_nuxt/DEZhdWR8.js similarity index 83% rename from _nuxt/DF1VbFfH.js rename to _nuxt/DEZhdWR8.js index 570310a..a9dfe55 100644 --- a/_nuxt/DF1VbFfH.js +++ b/_nuxt/DEZhdWR8.js @@ -1,7 +1,2 @@ -function __vite__mapDeps(indexes) { - if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CFwVd7gV.js","./BlS8upJP.js","./entry.DiT2Mvoi.css","./BsYmvPZw.js","./BECgZIvk.js"] - } - return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) -} -import{N as P,u as h,O as $,P as b,Q as C,K as E}from"./BlS8upJP.js";import{u as w,h as l}from"./BECgZIvk.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),T=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,B=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),g=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},j=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>!i.includes(s)&&!n.includes(s[0]))},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>i.includes(s)||n.includes(s[0]))},Q=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(s=>!s.startsWith("$"));for(const s of i)t=t.sort((a,e)=>{const o=[d(a,s),d(e,s)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[s]===-1&&o.reverse(),n.compare(o[0],o[1])});return t},I=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,o=c=>c)=>(...c)=>(n[e]=o(...c),a),s=e=>{var o;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(o=e.dirConfig)==null?void 0:o._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(s),findOne:()=>t(i("first")(!0)).then(s),count:()=>t(i("count")(!0)).then(s),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,o)=>({query:e,...o})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,o)=>a.withSurround(e,o).find().then(s)),a}function m(t){return JSON.stringify(t,O)}function O(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const A=t=>{let r=m(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),F=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},v=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${A(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await E(()=>import("./CFwVd7gV.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const s=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:m(n),previewToken:w().getPreviewToken()}});if(typeof s=="string"&&s.startsWith(""))throw new Error("Not found");return s};function K(t,...r){const{content:n}=h().public,i=x(v(),{initialParams:typeof t!="string"?t:{},legacy:!0});let s;typeof t=="string"&&(s=$(b(t,...r)));const a=i.params;return i.params=()=>{var o,c,p;const e=a();return s&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:C(s)}):e.where.push({_path:new RegExp(`^${s.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(o=e.sort)!=null&&o.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{I as a,u as b,Q as c,B as d,A as e,j as f,d as g,q as h,x as i,m as j,T as o,K as q,D as s,F as u,y as w}; +const __vite__fileDeps=["./BWKb2ttN.js","./DiyP6pou.js","./entry.DrGH3nHD.css","./C-v3KzvZ.js","./BpUWW4O-.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{M as P,u as h,N as $,O as b,P as C,J as E}from"./DiyP6pou.js";import{u as w,h as l}from"./BpUWW4O-.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),T=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,B=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),g=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},j=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>!i.includes(s)&&!n.includes(s[0]))},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=g(t);return f(r,s=>i.includes(s)||n.includes(s[0]))},I=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(s=>!s.startsWith("$"));for(const s of i)t=t.sort((a,e)=>{const o=[d(a,s),d(e,s)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[s]===-1&&o.reverse(),n.compare(o[0],o[1])});return t},Q=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,o=c=>c)=>(...c)=>(n[e]=o(...c),a),s=e=>{var o;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(o=e.dirConfig)==null?void 0:o._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(s),findOne:()=>t(i("first")(!0)).then(s),count:()=>t(i("count")(!0)).then(s),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,o)=>({query:e,...o})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,o)=>a.withSurround(e,o).find().then(s)),a}function m(t){return JSON.stringify(t,O)}function O(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const A=t=>{let r=m(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),F=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},v=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${A(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await E(()=>import("./BWKb2ttN.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const s=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:m(n),previewToken:w().getPreviewToken()}});if(typeof s=="string"&&s.startsWith(""))throw new Error("Not found");return s};function N(t,...r){const{content:n}=h().public,i=x(v(),{initialParams:typeof t!="string"?t:{},legacy:!0});let s;typeof t=="string"&&(s=$(b(t,...r)));const a=i.params;return i.params=()=>{var o,c,p;const e=a();return s&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:C(s)}):e.where.push({_path:new RegExp(`^${s.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(o=e.sort)!=null&&o.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{Q as a,u as b,I as c,B as d,A as e,j as f,d as g,q as h,x as i,m as j,T as o,N as q,D as s,F as u,y as w}; diff --git a/_nuxt/BxiCSTFT.js b/_nuxt/DMFARuCF.js similarity index 89% rename from _nuxt/BxiCSTFT.js rename to _nuxt/DMFARuCF.js index 76ca784..39d9ad3 100644 --- a/_nuxt/BxiCSTFT.js +++ b/_nuxt/DMFARuCF.js @@ -1 +1 @@ -import{_ as o}from"./DQv0CMQg.js";import{f as l,E as s,H as d,J as c}from"./BlS8upJP.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";const g=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,u;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(u=t==null?void 0:t.value)==null?void 0:u._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var i,f;const n=d(),{value:e,excerpt:a,tag:u}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((i=r==null?void 0:r.children)!=null&&i.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:u,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:u,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((f=r==null?void 0:r.children)!=null&&f.length)?c(o,{value:e,excerpt:a,tag:u,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:u},null,2))}});export{g as default}; +import{_ as o}from"./aHVSc_rA.js";import{f as l,D as s,G as d,I as c}from"./DiyP6pou.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";const g=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,u;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(u=t==null?void 0:t.value)==null?void 0:u._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var i,f;const n=d(),{value:e,excerpt:a,tag:u}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((i=r==null?void 0:r.children)!=null&&i.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:u,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:u,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((f=r==null?void 0:r.children)!=null&&f.length)?c(o,{value:e,excerpt:a,tag:u,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:u},null,2))}});export{g as default}; diff --git a/_nuxt/DNJ0aMK4.js b/_nuxt/DNJ0aMK4.js new file mode 100644 index 0000000..9a3d1aa --- /dev/null +++ b/_nuxt/DNJ0aMK4.js @@ -0,0 +1 @@ +import{_ as o}from"./Du8iVdrZ.js";import{f as r,g as e,o as p}from"./DiyP6pou.js";import"./Djecwb_v.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const B=r({__name:"architecture",setup(a){return(m,c)=>{const t=o;return p(),e(t,{path:"playwright/architecture"})}}});export{B as default}; diff --git a/_nuxt/_tWtRPYx.js b/_nuxt/DN_H2i4g.js similarity index 53% rename from _nuxt/_tWtRPYx.js rename to _nuxt/DN_H2i4g.js index a2b8246..2b4c391 100644 --- a/_nuxt/_tWtRPYx.js +++ b/_nuxt/DN_H2i4g.js @@ -1 +1 @@ -import{_ as e,o as r,c}from"./BlS8upJP.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; +import{_ as e,o as r,c}from"./DiyP6pou.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; diff --git a/_nuxt/DS-4onvx.js b/_nuxt/DS-4onvx.js deleted file mode 100644 index b850b9f..0000000 --- a/_nuxt/DS-4onvx.js +++ /dev/null @@ -1 +0,0 @@ -import{u as C}from"./maW11VfC.js";import{f,j as i,k as c,o as a,c as l,l as A,m as _,n as Z,a as e,q as z,s as q,v as D,x as F,y as V,z as N,_ as L,A as H,b as v,d as $,B as R,C as W,t as b,D as j,w as y,F as Q,u as T}from"./BlS8upJP.js";import{u as E}from"./CRh1_mKz.js";import{F as U,G as X,_ as G}from"./CZcQ1mDI.js";import{_ as J}from"./Czu_W2CL.js";import"./CFzORWKb.js";const Y=["width","height","fill","transform"],I={key:0},O=e("path",{d:"M216,36H68.53a20.09,20.09,0,0,0-17.15,9.71L5.71,121.83a12,12,0,0,0,0,12.34l45.67,76.12A20.09,20.09,0,0,0,68.53,220H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36Zm-4,160H70.8L30,128,70.8,60H212ZM103.51,143.51,119,128l-15.52-15.51a12,12,0,0,1,17-17L136,111l15.51-15.52a12,12,0,0,1,17,17L153,128l15.52,15.51a12,12,0,0,1-17,17L136,145l-15.51,15.52a12,12,0,0,1-17-17Z"},null,-1),K=[O],e1={key:1},t1=e("path",{d:"M224,56V200a8,8,0,0,1-8,8H68.53a8,8,0,0,1-6.86-3.88L16,128,61.67,51.88A8,8,0,0,1,68.53,48H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),a1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),l1=[t1,a1],o1={key:2},s1=e("path",{d:"M216,40H68.53a16.12,16.12,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11h0A16.11,16.11,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM165.66,146.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.35,18.35a8,8,0,0,1-11.31-11.32L124.69,128l-18.35-18.34a8,8,0,1,1,11.31-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128Z"},null,-1),n1=[s1],r1={key:3},i1=e("path",{d:"M216,42H68.53a14,14,0,0,0-12,6.8L10.86,124.91a6,6,0,0,0,0,6.18L56.53,207.2a14,14,0,0,0,12,6.8H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42Zm2,158a2,2,0,0,1-2,2H68.53a2,2,0,0,1-1.71-1h0L23,128,66.82,55a2,2,0,0,1,1.71-1H216a2,2,0,0,1,2,2Zm-53.76-91.76L144.48,128l19.76,19.76a6,6,0,1,1-8.48,8.48L136,136.48l-19.76,19.76a6,6,0,0,1-8.48-8.48L127.52,128l-19.76-19.76a6,6,0,0,1,8.48-8.48L136,119.52l19.76-19.76a6,6,0,0,1,8.48,8.48Z"},null,-1),c1=[i1],h1={key:4},d1=e("path",{d:"M216,40H68.53a16.08,16.08,0,0,0-13.72,7.77L9.14,123.88a8,8,0,0,0,0,8.24l45.67,76.11A16.08,16.08,0,0,0,68.53,216H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM61.67,204.12,68.53,200h0ZM216,200H68.53l-43.2-72,43.2-72H216ZM106.34,146.34,124.69,128l-18.35-18.34a8,8,0,0,1,11.32-11.32L136,116.69l18.34-18.35a8,8,0,0,1,11.32,11.32L147.31,128l18.35,18.34a8,8,0,0,1-11.32,11.32L136,139.31l-18.34,18.35a8,8,0,0,1-11.32-11.32Z"},null,-1),u1=[d1],p1={key:5},g1=e("path",{d:"M216,44H68.53a12.06,12.06,0,0,0-10.29,5.83L12.57,125.94a4,4,0,0,0,0,4.12l45.67,76.11A12.06,12.06,0,0,0,68.53,212H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44Zm4,156a4,4,0,0,1-4,4H68.53a4,4,0,0,1-3.43-1.94L20.67,128,65.1,53.94A4,4,0,0,1,68.53,52H216a4,4,0,0,1,4,4Zm-57.17-93.17L141.66,128l21.17,21.17a4,4,0,0,1-5.66,5.66L136,133.66l-21.17,21.17a4,4,0,0,1-5.66-5.66L130.34,128l-21.17-21.17a4,4,0,0,1,5.66-5.66L136,122.34l21.17-21.17a4,4,0,1,1,5.66,5.66Z"},null,-1),m1=[g1],v1={name:"PhBackspace"},$1=f({...v1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",I,K)):t.value==="duotone"?(a(),l("g",e1,l1)):t.value==="fill"?(a(),l("g",o1,n1)):t.value==="light"?(a(),l("g",r1,c1)):t.value==="regular"?(a(),l("g",h1,u1)):t.value==="thin"?(a(),l("g",p1,m1)):_("",!0)],16,Y))}}),y1=["width","height","fill","transform"],w1={key:0},A1=e("path",{d:"M220,32H76A20,20,0,0,0,56,52V72H36A20,20,0,0,0,16,92V204a20,20,0,0,0,20,20H180a20,20,0,0,0,20-20V184h20a20,20,0,0,0,20-20V52A20,20,0,0,0,220,32ZM176,96v16H40V96Zm0,104H40V136H176Zm40-40H200V92a20,20,0,0,0-20-20H80V56H216Z"},null,-1),f1=[A1],_1={key:1},Z1=e("path",{d:"M224,56V168a8,8,0,0,1-8,8H192V88a8,8,0,0,0-8-8H64V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z",opacity:"0.2"},null,-1),H1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,88H184v16H40ZM184,200H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),L1=[Z1,H1],k1={key:2},M1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm32,80H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),V1=[M1],b1={key:3},x1=e("path",{d:"M216,42H72A14,14,0,0,0,58,56V74H40A14,14,0,0,0,26,88V200a14,14,0,0,0,14,14H184a14,14,0,0,0,14-14V182h18a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,86H184a2,2,0,0,1,2,2v18H38V88A2,2,0,0,1,40,86ZM186,200a2,2,0,0,1-2,2H40a2,2,0,0,1-2-2V118H186Zm32-32a2,2,0,0,1-2,2H198V88a14,14,0,0,0-14-14H70V56a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Z"},null,-1),C1=[x1],S1={key:4},B1=e("path",{d:"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM184,88v16H40V88Zm0,112H40V120H184v80Zm32-32H200V88a16,16,0,0,0-16-16H72V56H216Z"},null,-1),P1=[B1],z1={key:5},q1=e("path",{d:"M216,44H72A12,12,0,0,0,60,56V76H40A12,12,0,0,0,28,88V200a12,12,0,0,0,12,12H184a12,12,0,0,0,12-12V180h20a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,84H184a4,4,0,0,1,4,4v20H36V88A4,4,0,0,1,40,84ZM188,200a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V116H188Zm32-32a4,4,0,0,1-4,4H196V88a12,12,0,0,0-12-12H68V56a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Z"},null,-1),D1=[q1],F1={name:"PhBrowsers"},N1=f({...F1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",w1,f1)):t.value==="duotone"?(a(),l("g",_1,L1)):t.value==="fill"?(a(),l("g",k1,V1)):t.value==="light"?(a(),l("g",b1,C1)):t.value==="regular"?(a(),l("g",S1,P1)):t.value==="thin"?(a(),l("g",z1,D1)):_("",!0)],16,y1))}}),R1=["width","height","fill","transform"],W1={key:0},j1=e("path",{d:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},null,-1),Q1=[j1],T1={key:1},E1=e("path",{d:"M160,48V208L80,128Z",opacity:"0.2"},null,-1),U1=e("path",{d:"M163.06,40.61a8,8,0,0,0-8.72,1.73l-80,80a8,8,0,0,0,0,11.32l80,80A8,8,0,0,0,168,208V48A8,8,0,0,0,163.06,40.61ZM152,188.69,91.31,128,152,67.31Z"},null,-1),X1=[E1,U1],G1={key:2},J1=e("path",{d:"M168,48V208a8,8,0,0,1-13.66,5.66l-80-80a8,8,0,0,1,0-11.32l80-80A8,8,0,0,1,168,48Z"},null,-1),Y1=[J1],I1={key:3},O1=e("path",{d:"M164.24,203.76a6,6,0,1,1-8.48,8.48l-80-80a6,6,0,0,1,0-8.48l80-80a6,6,0,0,1,8.48,8.48L88.49,128Z"},null,-1),K1=[O1],e0={key:4},t0=e("path",{d:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"},null,-1),a0=[t0],l0={key:5},o0=e("path",{d:"M162.83,205.17a4,4,0,0,1-5.66,5.66l-80-80a4,4,0,0,1,0-5.66l80-80a4,4,0,1,1,5.66,5.66L85.66,128Z"},null,-1),s0=[o0],n0={name:"PhCaretLeft"},r0=f({...n0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",W1,Q1)):t.value==="duotone"?(a(),l("g",T1,X1)):t.value==="fill"?(a(),l("g",G1,Y1)):t.value==="light"?(a(),l("g",I1,K1)):t.value==="regular"?(a(),l("g",e0,a0)):t.value==="thin"?(a(),l("g",l0,s0)):_("",!0)],16,R1))}}),i0=["width","height","fill","transform"],c0={key:0},h0=e("path",{d:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},null,-1),d0=[h0],u0={key:1},p0=e("path",{d:"M176,128,96,208V48Z",opacity:"0.2"},null,-1),g0=e("path",{d:"M181.66,122.34l-80-80A8,8,0,0,0,88,48V208a8,8,0,0,0,13.66,5.66l80-80A8,8,0,0,0,181.66,122.34ZM104,188.69V67.31L164.69,128Z"},null,-1),m0=[p0,g0],v0={key:2},$0=e("path",{d:"M181.66,133.66l-80,80A8,8,0,0,1,88,208V48a8,8,0,0,1,13.66-5.66l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),y0=[$0],w0={key:3},A0=e("path",{d:"M180.24,132.24l-80,80a6,6,0,0,1-8.48-8.48L167.51,128,91.76,52.24a6,6,0,0,1,8.48-8.48l80,80A6,6,0,0,1,180.24,132.24Z"},null,-1),f0=[A0],_0={key:4},Z0=e("path",{d:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"},null,-1),H0=[Z0],L0={key:5},k0=e("path",{d:"M178.83,130.83l-80,80a4,4,0,0,1-5.66-5.66L170.34,128,93.17,50.83a4,4,0,0,1,5.66-5.66l80,80A4,4,0,0,1,178.83,130.83Z"},null,-1),M0=[k0],V0={name:"PhCaretRight"},b0=f({...V0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",c0,d0)):t.value==="duotone"?(a(),l("g",u0,m0)):t.value==="fill"?(a(),l("g",v0,y0)):t.value==="light"?(a(),l("g",w0,f0)):t.value==="regular"?(a(),l("g",_0,H0)):t.value==="thin"?(a(),l("g",L0,M0)):_("",!0)],16,i0))}}),x0=["width","height","fill","transform"],C0={key:0},S0=e("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},null,-1),B0=[S0],P0={key:1},z0=e("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"},null,-1),q0=e("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),D0=[z0,q0],F0={key:2},N0=e("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"},null,-1),R0=[N0],W0={key:3},j0=e("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"},null,-1),Q0=[j0],T0={key:4},E0=e("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"},null,-1),U0=[E0],X0={key:5},G0=e("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"},null,-1),J0=[G0],Y0={name:"PhCheck"},I0=f({...Y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",C0,B0)):t.value==="duotone"?(a(),l("g",P0,D0)):t.value==="fill"?(a(),l("g",F0,R0)):t.value==="light"?(a(),l("g",W0,Q0)):t.value==="regular"?(a(),l("g",T0,U0)):t.value==="thin"?(a(),l("g",X0,J0)):_("",!0)],16,x0))}}),O0=["width","height","fill","transform"],K0={key:0},e2=e("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm40.49-92.49a12,12,0,0,1,0,17l-48,48a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L144,143l39.51-39.52A12,12,0,0,1,200.49,103.51Z"},null,-1),t2=[e2],a2={key:1},l2=e("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"},null,-1),o2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),s2=[l2,o2],n2={key:2},r2=e("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-50.27-6.86-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35a8,8,0,0,1,11.32,11.32Z"},null,-1),i2=[r2],c2={key:3},h2=e("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm36.24-94.24a6,6,0,0,1,0,8.48l-48,48a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L144,151.51l43.76-43.75A6,6,0,0,1,196.24,107.76Z"},null,-1),d2=[h2],u2={key:4},p2=e("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"},null,-1),g2=[p2],m2={key:5},v2=e("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm34.83-94.83a4,4,0,0,1,0,5.66l-48,48a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L144,154.34l45.17-45.17A4,4,0,0,1,194.83,109.17Z"},null,-1),$2=[v2],y2={name:"PhCloudCheck"},w2=f({...y2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",K0,t2)):t.value==="duotone"?(a(),l("g",a2,s2)):t.value==="fill"?(a(),l("g",n2,i2)):t.value==="light"?(a(),l("g",c2,d2)):t.value==="regular"?(a(),l("g",u2,g2)):t.value==="thin"?(a(),l("g",m2,$2)):_("",!0)],16,O0))}}),A2=["width","height","fill","transform"],f2={key:0},_2=e("path",{d:"M224,44H32A20,20,0,0,0,12,64V192a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V64A20,20,0,0,0,224,44Zm-4,24V88H36V68ZM36,188V112H220v76Zm172-24a12,12,0,0,1-12,12H164a12,12,0,0,1,0-24h32A12,12,0,0,1,208,164Zm-68,0a12,12,0,0,1-12,12H116a12,12,0,0,1,0-24h12A12,12,0,0,1,140,164Z"},null,-1),Z2=[_2],H2={key:1},L2=e("path",{d:"M232,96v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V96Z",opacity:"0.2"},null,-1),k2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),M2=[L2,k2],V2={key:2},b2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM136,176H120a8,8,0,0,1,0-16h16a8,8,0,0,1,0,16Zm64,0H168a8,8,0,0,1,0-16h32a8,8,0,0,1,0,16ZM32,88V64H224V88Z"},null,-1),x2=[b2],C2={key:3},S2=e("path",{d:"M224,50H32A14,14,0,0,0,18,64V192a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM32,62H224a2,2,0,0,1,2,2V90H30V64A2,2,0,0,1,32,62ZM224,194H32a2,2,0,0,1-2-2V102H226v90A2,2,0,0,1,224,194Zm-18-26a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h32A6,6,0,0,1,206,168Zm-64,0a6,6,0,0,1-6,6H120a6,6,0,0,1,0-12h16A6,6,0,0,1,142,168Z"},null,-1),B2=[S2],P2={key:4},z2=e("path",{d:"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,16V88H32V64Zm0,128H32V104H224v88Zm-16-24a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h32A8,8,0,0,1,208,168Zm-64,0a8,8,0,0,1-8,8H120a8,8,0,0,1,0-16h16A8,8,0,0,1,144,168Z"},null,-1),q2=[z2],D2={key:5},F2=e("path",{d:"M224,52H32A12,12,0,0,0,20,64V192a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM32,60H224a4,4,0,0,1,4,4V92H28V64A4,4,0,0,1,32,60ZM224,196H32a4,4,0,0,1-4-4V100H228v92A4,4,0,0,1,224,196Zm-20-28a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h32A4,4,0,0,1,204,168Zm-64,0a4,4,0,0,1-4,4H120a4,4,0,0,1,0-8h16A4,4,0,0,1,140,168Z"},null,-1),N2=[F2],R2={name:"PhCreditCard"},W2=f({...R2,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",f2,Z2)):t.value==="duotone"?(a(),l("g",H2,M2)):t.value==="fill"?(a(),l("g",V2,x2)):t.value==="light"?(a(),l("g",C2,B2)):t.value==="regular"?(a(),l("g",P2,q2)):t.value==="thin"?(a(),l("g",D2,N2)):_("",!0)],16,A2))}}),j2=["width","height","fill","transform"],Q2={key:0},T2=e("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Zm100.49-60.49a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17,0l-24-24a12,12,0,0,1,17-17L116,155V124a12,12,0,0,1,24,0v31l3.51-3.52A12,12,0,0,1,160.49,151.51Z"},null,-1),E2=[T2],U2={key:1},X2=e("path",{d:"M208,88H152V32Z",opacity:"0.2"},null,-1),G2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),J2=[X2,G2],Y2={key:2},I2=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34Zm-56,83.32-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35a8,8,0,0,1,11.32,11.32ZM152,88V44l44,44Z"},null,-1),O2=[I2],K2={key:3},e6=e("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Zm-43.76-62.24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L122,169.51V120a6,6,0,0,1,12,0v49.51l13.76-13.75A6,6,0,0,1,156.24,155.76Z"},null,-1),t6=[e6],a6={key:4},l6=e("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-42.34-61.66a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L120,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35A8,8,0,0,1,157.66,154.34Z"},null,-1),o6=[l6],s6={key:5},n6=e("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Zm-45.17-62.83a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L124,174.34V120a4,4,0,0,1,8,0v54.34l17.17-17.17A4,4,0,0,1,154.83,157.17Z"},null,-1),r6=[n6],i6={name:"PhFileArrowDown"},c6=f({...i6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",Q2,E2)):t.value==="duotone"?(a(),l("g",U2,J2)):t.value==="fill"?(a(),l("g",Y2,O2)):t.value==="light"?(a(),l("g",K2,t6)):t.value==="regular"?(a(),l("g",a6,o6)):t.value==="thin"?(a(),l("g",s6,r6)):_("",!0)],16,j2))}}),h6=["width","height","fill","transform"],d6={key:0},u6=e("path",{d:"M216,44H40A12,12,0,0,0,28,56V208a20,20,0,0,0,20,20H88a20,20,0,0,0,20-20V164h40v12a20,20,0,0,0,20,20h40a20,20,0,0,0,20-20V56A12,12,0,0,0,216,44Zm-12,64H172V68h32ZM84,68v40H52V68Zm0,136H52V132H84Zm24-64V68h40v72Zm64,32V132h32v40Z"},null,-1),p6=[u6],g6={key:1},m6=e("path",{d:"M216,56v64H160V56ZM40,208a8,8,0,0,0,8,8H88a8,8,0,0,0,8-8V120H40Z",opacity:"0.2"},null,-1),v6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48Zm-8,64H168V64h40ZM88,64v48H48V64Zm0,144H48V128H88Zm16-64V64h48v80Zm64,32V128h40v48Z"},null,-1),$6=[m6,v6],y6={key:2},w6=e("path",{d:"M160,56v96a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h40A8,8,0,0,1,160,56Zm64-8H184a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4h48a4,4,0,0,0,4-4V56A8,8,0,0,0,224,48Zm4,80H180a4,4,0,0,0-4,4v44a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V132A4,4,0,0,0,228,128ZM80,48H40a8,8,0,0,0-8,8v52a4,4,0,0,0,4,4H84a4,4,0,0,0,4-4V56A8,8,0,0,0,80,48Zm4,80H36a4,4,0,0,0-4,4v76a16,16,0,0,0,16,16H72a16,16,0,0,0,16-16V132A4,4,0,0,0,84,128Z"},null,-1),A6=[w6],f6={key:3},_6=e("path",{d:"M216,50H40a6,6,0,0,0-6,6V208a14,14,0,0,0,14,14H88a14,14,0,0,0,14-14V158h52v18a14,14,0,0,0,14,14h40a14,14,0,0,0,14-14V56A6,6,0,0,0,216,50Zm-6,64H166V62h44ZM90,62v52H46V62Zm0,146a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V126H90Zm12-62V62h52v84Zm106,32H168a2,2,0,0,1-2-2V126h44v50A2,2,0,0,1,208,178Z"},null,-1),Z6=[_6],H6={key:4},L6=e("path",{d:"M216,48H40a8,8,0,0,0-8,8V208a16,16,0,0,0,16,16H88a16,16,0,0,0,16-16V160h48v16a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V56A8,8,0,0,0,216,48ZM88,208H48V128H88Zm0-96H48V64H88Zm64,32H104V64h48Zm56,32H168V128h40Zm0-64H168V64h40Z"},null,-1),k6=[L6],M6={key:5},V6=e("path",{d:"M216,52H40a4,4,0,0,0-4,4V208a12,12,0,0,0,12,12H88a12,12,0,0,0,12-12V156h56v20a12,12,0,0,0,12,12h40a12,12,0,0,0,12-12V56A4,4,0,0,0,216,52ZM92,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V124H92Zm0-92H44V60H92Zm64,32H100V60h56Zm56,28a4,4,0,0,1-4,4H168a4,4,0,0,1-4-4V124h48Zm0-60H164V60h48Z"},null,-1),b6=[V6],x6={name:"PhKanban"},C6=f({...x6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",d6,p6)):t.value==="duotone"?(a(),l("g",g6,$6)):t.value==="fill"?(a(),l("g",y6,A6)):t.value==="light"?(a(),l("g",f6,Z6)):t.value==="regular"?(a(),l("g",H6,k6)):t.value==="thin"?(a(),l("g",M6,b6)):_("",!0)],16,h6))}}),S6=["width","height","fill","transform"],B6={key:0},P6=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},null,-1),z6=[P6],q6={key:1},D6=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),F6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),N6=[D6,F6],R6={key:2},W6=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H72a8,8,0,0,1,0-16H184a8,8,0,0,1,0,16Z"},null,-1),j6=[W6],Q6={key:3},T6=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128Z"},null,-1),E6=[T6],U6={key:4},X6=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z"},null,-1),G6=[X6],J6={key:5},Y6=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128Z"},null,-1),I6=[Y6],O6={name:"PhMinus"},K6=f({...O6,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",B6,z6)):t.value==="duotone"?(a(),l("g",q6,N6)):t.value==="fill"?(a(),l("g",R6,j6)):t.value==="light"?(a(),l("g",Q6,E6)):t.value==="regular"?(a(),l("g",U6,G6)):t.value==="thin"?(a(),l("g",J6,I6)):_("",!0)],16,S6))}}),e4=["width","height","fill","transform"],t4={key:0},a4=e("path",{d:"M224,154.8l-47.09-21.11-.18-.08a19.94,19.94,0,0,0-19,1.75,13.08,13.08,0,0,0-1.12.84l-22.31,19c-13-7.05-26.43-20.37-33.49-33.21l19.06-22.66a11.76,11.76,0,0,0,.85-1.15,20,20,0,0,0,1.66-18.83,1.42,1.42,0,0,1-.08-.18L101.2,32A20.06,20.06,0,0,0,80.42,20.15,60.27,60.27,0,0,0,28,80c0,81.61,66.39,148,148,148a60.27,60.27,0,0,0,59.85-52.42A20.06,20.06,0,0,0,224,154.8ZM176,204A124.15,124.15,0,0,1,52,80,36.29,36.29,0,0,1,80.48,44.46l18.82,42L80.14,109.28a12,12,0,0,0-.86,1.16A20,20,0,0,0,78,130.08c9.42,19.28,28.83,38.56,48.31,48A20,20,0,0,0,146,176.63a11.63,11.63,0,0,0,1.11-.85l22.43-19.07,42,18.81A36.29,36.29,0,0,1,176,204Z"},null,-1),l4=[a4],o4={key:1},s4=e("path",{d:"M223.94,174.08A48.33,48.33,0,0,1,176,216,136,136,0,0,1,40,80,48.33,48.33,0,0,1,81.92,32.06a8,8,0,0,1,8.3,4.8l21.13,47.2a8,8,0,0,1-.66,7.53L89.32,117a7.93,7.93,0,0,0-.54,7.81c8.27,16.93,25.77,34.22,42.75,42.41a7.92,7.92,0,0,0,7.83-.59l25-21.3a8,8,0,0,1,7.59-.69l47.16,21.13A8,8,0,0,1,223.94,174.08Z",opacity:"0.2"},null,-1),n4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),r4=[s4,n4],i4={key:2},c4=e("path",{d:"M231.88,175.08A56.26,56.26,0,0,1,176,224C96.6,224,32,159.4,32,80A56.26,56.26,0,0,1,80.92,24.12a16,16,0,0,1,16.62,9.52l21.12,47.15,0,.12A16,16,0,0,1,117.39,96c-.18.27-.37.52-.57.77L96,121.45c7.49,15.22,23.41,31,38.83,38.51l24.34-20.71a8.12,8.12,0,0,1,.75-.56,16,16,0,0,1,15.17-1.4l.13.06,47.11,21.11A16,16,0,0,1,231.88,175.08Z"},null,-1),h4=[c4],d4={key:3},u4=e("path",{d:"M221.59,160.3l-47.24-21.17a14,14,0,0,0-13.28,1.22,4.81,4.81,0,0,0-.56.42l-24.69,21a1.88,1.88,0,0,1-1.68.06c-15.87-7.66-32.31-24-40-39.65a1.91,1.91,0,0,1,0-1.68l21.07-25a6.13,6.13,0,0,0,.42-.58,14,14,0,0,0,1.12-13.27L95.73,34.49a14,14,0,0,0-14.56-8.38A54.24,54.24,0,0,0,34,80c0,78.3,63.7,142,142,142a54.25,54.25,0,0,0,53.89-47.17A14,14,0,0,0,221.59,160.3ZM176,210C104.32,210,46,151.68,46,80A42.23,42.23,0,0,1,82.67,38h.23a2,2,0,0,1,1.84,1.31l21.1,47.11a2,2,0,0,1,0,1.67L84.73,113.15a4.73,4.73,0,0,0-.43.57,14,14,0,0,0-.91,13.73c8.87,18.16,27.17,36.32,45.53,45.19a14,14,0,0,0,13.77-1c.19-.13.38-.27.56-.42l24.68-21a1.92,1.92,0,0,1,1.6-.1l47.25,21.17a2,2,0,0,1,1.21,2A42.24,42.24,0,0,1,176,210Z"},null,-1),p4=[u4],g4={key:4},m4=e("path",{d:"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z"},null,-1),v4=[m4],$4={key:5},y4=e("path",{d:"M220.78,162.13,173.56,141A12,12,0,0,0,162.18,142a3.37,3.37,0,0,0-.38.28L137,163.42a3.93,3.93,0,0,1-3.7.21c-16.24-7.84-33.05-24.52-40.89-40.57a3.9,3.9,0,0,1,.18-3.69l21.2-25.21c.1-.12.19-.25.28-.38a12,12,0,0,0,1-11.36L93.9,35.28a12,12,0,0,0-12.48-7.19A52.25,52.25,0,0,0,36,80c0,77.2,62.8,140,140,140a52.25,52.25,0,0,0,51.91-45.42A12,12,0,0,0,220.78,162.13ZM220,173.58A44.23,44.23,0,0,1,176,212C103.22,212,44,152.78,44,80A44.23,44.23,0,0,1,82.42,36a3.87,3.87,0,0,1,.48,0,4,4,0,0,1,3.67,2.49l21.11,47.14a4,4,0,0,1-.23,3.6l-21.19,25.2c-.1.13-.2.25-.29.39a12,12,0,0,0-.78,11.75c8.69,17.79,26.61,35.58,44.6,44.27a12,12,0,0,0,11.79-.87l.37-.28,24.83-21.12a3.93,3.93,0,0,1,3.57-.27l47.21,21.16A4,4,0,0,1,220,173.58Z"},null,-1),w4=[y4],A4={name:"PhPhone"},S=f({...A4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",t4,l4)):t.value==="duotone"?(a(),l("g",o4,r4)):t.value==="fill"?(a(),l("g",i4,h4)):t.value==="light"?(a(),l("g",d4,p4)):t.value==="regular"?(a(),l("g",g4,v4)):t.value==="thin"?(a(),l("g",$4,w4)):_("",!0)],16,e4))}}),f4=["width","height","fill","transform"],_4={key:0},Z4=e("path",{d:"M137,168l11.52-11.51a12,12,0,0,0-17-17L120,151l-15-15,11.52-11.51a12,12,0,0,0-17-17L88,119,72.49,103.51a12,12,0,0,0-17,17L59,124,38.54,144.49a36,36,0,0,0,0,50.91l2.55,2.54L15.51,223.51a12,12,0,0,0,17,17l25.57-25.58,2.54,2.55a36.06,36.06,0,0,0,50.91,0L132,197l3.51,3.52a12,12,0,0,0,17-17ZM94.54,200.49a12,12,0,0,1-17,0L55.51,178.43a12,12,0,0,1,0-17L76,141l39,39Zm146-185a12,12,0,0,0-17,0L197.94,41.09l-2.54-2.55a36.05,36.05,0,0,0-50.91,0L124,59l-3.51-3.52a12,12,0,0,0-17,17l80,80a12,12,0,0,0,17-17L197,132l20.49-20.49a36,36,0,0,0,0-50.91l-2.55-2.54,25.58-25.57A12,12,0,0,0,240.49,15.51Zm-40,79L180,115,141,76l20.49-20.49a12,12,0,0,1,17,0l22.06,22.06a12,12,0,0,1,0,17Z"},null,-1),H4=[Z4],L4={key:1},k4=e("path",{d:"M76,124l56,56-29,29a24,24,0,0,1-33.94,0L47,186.91A24,24,0,0,1,47,153ZM209,69.09,186.91,47A24,24,0,0,0,153,47L124,76l56,56,29-29A24,24,0,0,0,209,69.09Z",opacity:"0.2"},null,-1),M4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),V4=[k4,M4],b4={key:2},x4=e("path",{d:"M149.66,149.66,131.31,168l18.35,18.34a8,8,0,0,1-11.32,11.32L132,191.31l-23.31,23.32a32.06,32.06,0,0,1-45.26,0l-5.37-5.38-28.4,28.41a8,8,0,0,1-11.32-11.32l28.41-28.4-5.38-5.37a32,32,0,0,1,0-45.26L64.69,124l-6.35-6.34a8,8,0,0,1,11.32-11.32L88,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32L99.31,136,120,156.69l18.34-18.35a8,8,0,0,1,11.32,11.32Zm88-131.32a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Z"},null,-1),C4=[x4],S4={key:3},B4=e("path",{d:"M148.24,139.76a6,6,0,0,0-8.48,0L120,159.51,96.49,136l19.75-19.76a6,6,0,0,0-8.48-8.48L88,127.51,68.24,107.76a6,6,0,0,0-8.48,8.48L67.51,124,42.79,148.73a30,30,0,0,0,0,42.42l6.78,6.79L19.76,227.76a6,6,0,1,0,8.48,8.48l29.82-29.81,6.79,6.78a30,30,0,0,0,42.42,0L132,188.49l7.76,7.75a6,6,0,0,0,8.48-8.48L128.49,168l19.75-19.76A6,6,0,0,0,148.24,139.76Zm-49.45,65a18,18,0,0,1-25.46,0L51.27,182.67a18,18,0,0,1,0-25.46L76,132.49,123.51,180Zm137.45-185a6,6,0,0,0-8.48,0L197.94,49.57l-6.79-6.78a30,30,0,0,0-42.42,0L124,67.51l-7.76-7.75a6,6,0,0,0-8.48,8.48l80,80a6,6,0,0,0,8.48-8.48L188.49,132l24.72-24.73a30,30,0,0,0,0-42.42l-6.78-6.79,29.81-29.82A6,6,0,0,0,236.24,19.76Zm-31.51,79L180,123.51,132.49,76l24.72-24.73a18,18,0,0,1,25.46,0l22.06,22.06a18,18,0,0,1,0,25.46Z"},null,-1),P4=[B4],z4={key:4},q4=e("path",{d:"M149.66,138.34a8,8,0,0,0-11.32,0L120,156.69,99.31,136l18.35-18.34a8,8,0,0,0-11.32-11.32L88,124.69,69.66,106.34a8,8,0,0,0-11.32,11.32L64.69,124,41.37,147.31a32,32,0,0,0,0,45.26l5.38,5.37-28.41,28.4a8,8,0,0,0,11.32,11.32l28.4-28.41,5.37,5.38a32,32,0,0,0,45.26,0L132,191.31l6.34,6.35a8,8,0,0,0,11.32-11.32L131.31,168l18.35-18.34A8,8,0,0,0,149.66,138.34Zm-52.29,65a16,16,0,0,1-22.62,0L52.69,181.25a16,16,0,0,1,0-22.62L76,135.31,120.69,180Zm140.29-185a8,8,0,0,0-11.32,0l-28.4,28.41-5.37-5.38a32.05,32.05,0,0,0-45.26,0L124,64.69l-6.34-6.35a8,8,0,0,0-11.32,11.32l80,80a8,8,0,0,0,11.32-11.32L191.31,132l23.32-23.31a32,32,0,0,0,0-45.26l-5.38-5.37,28.41-28.4A8,8,0,0,0,237.66,18.34Zm-34.35,79L180,120.69,135.31,76l23.32-23.31a16,16,0,0,1,22.62,0l22.06,22A16,16,0,0,1,203.31,97.37Z"},null,-1),D4=[q4],F4={key:5},N4=e("path",{d:"M146.83,141.17a4,4,0,0,0-5.66,0L120,162.34,93.66,136l21.17-21.17a4,4,0,0,0-5.66-5.66L88,130.34,66.83,109.17a4,4,0,0,0-5.66,5.66L70.34,124,44.2,150.14a28,28,0,0,0,0,39.6l8.2,8.2L21.17,229.17a4,4,0,0,0,5.66,5.66L58.06,203.6l8.2,8.2a28,28,0,0,0,39.6,0L132,185.66l9.17,9.17a4,4,0,0,0,5.66-5.66L125.66,168l21.17-21.17A4,4,0,0,0,146.83,141.17Zm-46.63,65a20,20,0,0,1-28.28,0L49.86,184.08a20,20,0,0,1,0-28.28L76,129.66,126.34,180Zm134.63-185a4,4,0,0,0-5.66,0L197.94,52.4l-8.2-8.2a28,28,0,0,0-39.6,0L124,70.34l-9.17-9.17a4,4,0,0,0-5.66,5.66l80,80a4,4,0,0,0,5.66-5.66L185.66,132l26.14-26.14a28,28,0,0,0,0-39.6l-8.2-8.2,31.23-31.23A4,4,0,0,0,234.83,21.17ZM212,86.06a19.86,19.86,0,0,1-5.86,14.14L180,126.34,129.66,76,155.8,49.86a20,20,0,0,1,28.28,0l22.06,22.06A19.85,19.85,0,0,1,212,86.06Z"},null,-1),R4=[N4],W4={name:"PhPlugs"},j4=f({...W4,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",_4,H4)):t.value==="duotone"?(a(),l("g",L4,V4)):t.value==="fill"?(a(),l("g",b4,C4)):t.value==="light"?(a(),l("g",S4,P4)):t.value==="regular"?(a(),l("g",z4,D4)):t.value==="thin"?(a(),l("g",F4,R4)):_("",!0)],16,f4))}}),Q4=["width","height","fill","transform"],T4={key:0},E4=e("path",{d:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},null,-1),U4=[E4],X4={key:1},G4=e("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"},null,-1),J4=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),Y4=[G4,J4],I4={key:2},O4=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"},null,-1),K4=[O4],e8={key:3},t8=e("path",{d:"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z"},null,-1),a8=[t8],l8={key:4},o8=e("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"},null,-1),s8=[o8],n8={key:5},r8=e("path",{d:"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z"},null,-1),i8=[r8],c8={name:"PhPlus"},h8=f({...c8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",T4,U4)):t.value==="duotone"?(a(),l("g",X4,Y4)):t.value==="fill"?(a(),l("g",I4,K4)):t.value==="light"?(a(),l("g",e8,a8)):t.value==="regular"?(a(),l("g",l8,s8)):t.value==="thin"?(a(),l("g",n8,i8)):_("",!0)],16,Q4))}}),d8=["width","height","fill","transform"],u8={key:0},p8=e("path",{d:"M20,128A76.08,76.08,0,0,1,96,52h99l-3.52-3.51a12,12,0,1,1,17-17l24,24a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L195,76H96a52.06,52.06,0,0,0-52,52,12,12,0,0,1-24,0Zm204-12a12,12,0,0,0-12,12,52.06,52.06,0,0,1-52,52H61l3.52-3.51a12,12,0,1,0-17-17l-24,24a12,12,0,0,0,0,17l24,24a12,12,0,1,0,17-17L61,204h99a76.08,76.08,0,0,0,76-76A12,12,0,0,0,224,116Z"},null,-1),g8=[p8],m8={key:1},v8=e("path",{d:"M224,64v64a64,64,0,0,1-64,64H32V128A64,64,0,0,1,96,64Z",opacity:"0.2"},null,-1),$8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),y8=[v8,$8],w8={key:2},A8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56h96V40a8,8,0,0,1,13.66-5.66l24,24a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,192,88V72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H64V168a8,8,0,0,0-13.66-5.66l-24,24a8,8,0,0,0,0,11.32l24,24A8,8,0,0,0,64,216V200h96a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),f8=[A8],_8={key:3},Z8=e("path",{d:"M26,128A70.08,70.08,0,0,1,96,58H209.51L195.76,44.24a6,6,0,0,1,8.48-8.48l24,24a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L209.51,70H96a58.07,58.07,0,0,0-58,58,6,6,0,0,1-12,0Zm198-6a6,6,0,0,0-6,6,58.07,58.07,0,0,1-58,58H46.49l13.75-13.76a6,6,0,0,0-8.48-8.48l-24,24a6,6,0,0,0,0,8.48l24,24a6,6,0,0,0,8.48-8.48L46.49,198H160a70.08,70.08,0,0,0,70-70A6,6,0,0,0,224,122Z"},null,-1),H8=[Z8],L8={key:4},k8=e("path",{d:"M24,128A72.08,72.08,0,0,1,96,56H204.69L194.34,45.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L204.69,72H96a56.06,56.06,0,0,0-56,56,8,8,0,0,1-16,0Zm200-8a8,8,0,0,0-8,8,56.06,56.06,0,0,1-56,56H51.31l10.35-10.34a8,8,0,0,0-11.32-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L51.31,200H160a72.08,72.08,0,0,0,72-72A8,8,0,0,0,224,120Z"},null,-1),M8=[k8],V8={key:5},b8=e("path",{d:"M28,128A68.07,68.07,0,0,1,96,60H214.34L197.17,42.83a4,4,0,0,1,5.66-5.66l24,24a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L214.34,68H96a60.07,60.07,0,0,0-60,60,4,4,0,0,1-8,0Zm196-4a4,4,0,0,0-4,4,60.07,60.07,0,0,1-60,60H41.66l17.17-17.17a4,4,0,0,0-5.66-5.66l-24,24a4,4,0,0,0,0,5.66l24,24a4,4,0,1,0,5.66-5.66L41.66,196H160a68.07,68.07,0,0,0,68-68A4,4,0,0,0,224,124Z"},null,-1),x8=[b8],C8={name:"PhRepeat"},S8=f({...C8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",u8,g8)):t.value==="duotone"?(a(),l("g",m8,y8)):t.value==="fill"?(a(),l("g",w8,f8)):t.value==="light"?(a(),l("g",_8,H8)):t.value==="regular"?(a(),l("g",L8,M8)):t.value==="thin"?(a(),l("g",V8,x8)):_("",!0)],16,d8))}}),B8=["width","height","fill","transform"],P8={key:0},z8=e("path",{d:"M227.85,46.89a20,20,0,0,0-18.74-18.74c-13.13-.77-46.65.42-74.48,28.24L131,60H74.36a19.83,19.83,0,0,0-14.14,5.86L25.87,100.19a20,20,0,0,0,11.35,33.95l37.14,5.18,42.32,42.32,5.19,37.18A19.88,19.88,0,0,0,135.34,235a20.13,20.13,0,0,0,6.37,1,19.9,19.9,0,0,0,14.1-5.87l34.34-34.35A19.85,19.85,0,0,0,196,181.64V125l3.6-3.59C227.43,93.54,228.62,60,227.85,46.89ZM76,84h31L75.75,115.28l-27.23-3.8ZM151.6,73.37A72.27,72.27,0,0,1,204,52a72.17,72.17,0,0,1-21.38,52.41L128,159,97,128ZM172,180l-27.49,27.49-3.8-27.23L172,149Zm-72,22c-8.71,11.85-26.19,26-60,26a12,12,0,0,1-12-12c0-33.84,14.12-51.32,26-60A12,12,0,1,1,68.18,175.3C62.3,179.63,55.51,187.8,53,203c15.21-2.51,23.37-9.3,27.7-15.18A12,12,0,1,1,100,202Z"},null,-1),q8=[z8],D8={key:1},F8=e("path",{d:"M184,120v61.65a8,8,0,0,1-2.34,5.65l-34.35,34.35a8,8,0,0,1-13.57-4.53L128,176ZM136,72H74.35a8,8,0,0,0-5.65,2.34L34.35,108.69a8,8,0,0,0,4.53,13.57L80,128ZM40,216c37.65,0,50.69-19.69,54.56-28.18L68.18,161.44C59.69,165.31,40,178.35,40,216Z",opacity:"0.2"},null,-1),N8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),R8=[F8,N8],W8={key:2},j8=e("path",{d:"M101.85,191.14C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Zm122-144a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.4,27.07h0L88,108.7A8,8,0,0,1,76.67,97.39l26.56-26.57A4,4,0,0,0,100.41,64H74.35A15.9,15.9,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A16,16,0,0,0,192,181.65V155.59a4,4,0,0,0-6.83-2.82l-26.57,26.56a8,8,0,0,1-11.71-.42,8.2,8.2,0,0,1,.6-11.1l49.27-49.27h0C223.45,91.86,224.6,59.71,223.85,47.12Z"},null,-1),Q8=[j8],T8={key:3},E8=e("path",{d:"M221.86,47.24a14,14,0,0,0-13.11-13.1c-12.31-.73-43.77.39-69.88,26.5L133.52,66H74.35a13.9,13.9,0,0,0-9.89,4.1L30.11,104.44a14,14,0,0,0,7.94,23.76l39.13,5.46,45.16,45.16L127.8,218a14,14,0,0,0,23.76,7.92l34.35-34.35a13.91,13.91,0,0,0,4.1-9.89V122.48l5.35-5.35h0C221.46,91,222.59,59.56,221.86,47.24ZM38.11,115a2,2,0,0,1,.49-2L72.94,78.58A2,2,0,0,1,74.35,78h47.17L77.87,121.64l-38.14-5.32A1.93,1.93,0,0,1,38.11,115ZM178,181.65a2,2,0,0,1-.59,1.41L143.08,217.4a2,2,0,0,1-3.4-1.11l-5.32-38.16L178,134.48Zm8.87-73h0L128,167.51,88.49,128l58.87-58.88a78.47,78.47,0,0,1,60.69-23A2,2,0,0,1,209.88,48,78.47,78.47,0,0,1,186.88,108.64ZM100,190.31C95.68,199.84,81.13,222,40,222a6,6,0,0,1-6-6c0-41.13,22.16-55.68,31.69-60a6,6,0,1,1,5,10.92c-7,3.17-22.53,13.52-24.47,42.91,29.39-1.94,39.74-17.52,42.91-24.47a6,6,0,1,1,10.92,5Z"},null,-1),U8=[E8],X8={key:4},G8=e("path",{d:"M223.85,47.12a16,16,0,0,0-15-15c-12.58-.75-44.73.4-71.41,27.07L132.69,64H74.36A15.91,15.91,0,0,0,63,68.68L28.7,103a16,16,0,0,0,9.07,27.16l38.47,5.37,44.21,44.21,5.37,38.49a15.94,15.94,0,0,0,10.78,12.92,16.11,16.11,0,0,0,5.1.83A15.91,15.91,0,0,0,153,227.3L187.32,193A15.91,15.91,0,0,0,192,181.64V123.31l4.77-4.77C223.45,91.86,224.6,59.71,223.85,47.12ZM74.36,80h42.33L77.16,119.52,40,114.34Zm74.41-9.45a76.65,76.65,0,0,1,59.11-22.47,76.46,76.46,0,0,1-22.42,59.16L128,164.68,91.32,128ZM176,181.64,141.67,216l-5.19-37.17L176,139.31Zm-74.16,9.5C97.34,201,82.29,224,40,224a8,8,0,0,1-8-8c0-42.29,23-57.34,32.86-61.85a8,8,0,0,1,6.64,14.56c-6.43,2.93-20.62,12.36-23.12,38.91,26.55-2.5,36-16.69,38.91-23.12a8,8,0,1,1,14.56,6.64Z"},null,-1),J8=[G8],Y8={key:5},I8=e("path",{d:"M219.86,47.36a12,12,0,0,0-11.22-11.22c-12-.71-42.82.38-68.35,25.91L134.35,68h-60a11.9,11.9,0,0,0-8.48,3.52L31.52,105.85a12,12,0,0,0,6.81,20.37l39.79,5.55,46.11,46.11,5.55,39.81a12,12,0,0,0,20.37,6.79l34.34-34.35a11.9,11.9,0,0,0,3.52-8.48v-60l5.94-5.94C219.48,90.18,220.57,59.41,219.86,47.36ZM36.21,115.6a3.94,3.94,0,0,1,1-4.09L71.53,77.17A4,4,0,0,1,74.35,76h52L78.58,123.76,39.44,118.3A3.94,3.94,0,0,1,36.21,115.6ZM180,181.65a4,4,0,0,1-1.17,2.83l-34.35,34.34a4,4,0,0,1-6.79-2.25l-5.46-39.15L180,129.65Zm-52-11.31L85.66,128l60.28-60.29c23.24-23.24,51.25-24.23,62.22-23.58a3.93,3.93,0,0,1,3.71,3.71c.65,11-.35,39-23.58,62.22ZM98.21,189.48C94,198.66,80,220,40,220a4,4,0,0,1-4-4c0-40,21.34-54,30.52-58.21a4,4,0,0,1,3.32,7.28c-7.46,3.41-24.43,14.66-25.76,46.85,32.19-1.33,43.44-18.3,46.85-25.76a4,4,0,1,1,7.28,3.32Z"},null,-1),O8=[I8],K8={name:"PhRocketLaunch"},ee=f({...K8,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",P8,q8)):t.value==="duotone"?(a(),l("g",D8,R8)):t.value==="fill"?(a(),l("g",W8,Q8)):t.value==="light"?(a(),l("g",T8,U8)):t.value==="regular"?(a(),l("g",X8,J8)):t.value==="thin"?(a(),l("g",Y8,O8)):_("",!0)],16,B8))}}),te=["width","height","fill","transform"],ae={key:0},le=e("path",{d:"M125.18,156.94a64,64,0,1,0-82.36,0,100.23,100.23,0,0,0-39.49,32,12,12,0,0,0,19.35,14.2,76,76,0,0,1,122.64,0,12,12,0,0,0,19.36-14.2A100.33,100.33,0,0,0,125.18,156.94ZM44,108a40,40,0,1,1,40,40A40,40,0,0,1,44,108Zm206.1,97.67a12,12,0,0,1-16.78-2.57A76.31,76.31,0,0,0,172,172a12,12,0,0,1,0-24,40,40,0,1,0-10.3-78.67,12,12,0,1,1-6.16-23.19,64,64,0,0,1,57.64,110.8,100.23,100.23,0,0,1,39.49,32A12,12,0,0,1,250.1,205.67Z"},null,-1),oe=[le],se={key:1},ne=e("path",{d:"M136,108A52,52,0,1,1,84,56,52,52,0,0,1,136,108Z",opacity:"0.2"},null,-1),re=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),ie=[ne,re],ce={key:2},he=e("path",{d:"M164.47,195.63a8,8,0,0,1-6.7,12.37H10.23a8,8,0,0,1-6.7-12.37,95.83,95.83,0,0,1,47.22-37.71,60,60,0,1,1,66.5,0A95.83,95.83,0,0,1,164.47,195.63Zm87.91-.15a95.87,95.87,0,0,0-47.13-37.56A60,60,0,0,0,144.7,54.59a4,4,0,0,0-1.33,6A75.83,75.83,0,0,1,147,150.53a4,4,0,0,0,1.07,5.53,112.32,112.32,0,0,1,29.85,30.83,23.92,23.92,0,0,1,3.65,16.47,4,4,0,0,0,3.95,4.64h60.3a8,8,0,0,0,7.73-5.93A8.22,8.22,0,0,0,252.38,195.48Z"},null,-1),de=[he],ue={key:3},pe=e("path",{d:"M112.6,158.43a58,58,0,1,0-57.2,0A93.83,93.83,0,0,0,5.21,196.72a6,6,0,0,0,10.05,6.56,82,82,0,0,1,137.48,0,6,6,0,0,0,10-6.56A93.83,93.83,0,0,0,112.6,158.43ZM38,108a46,46,0,1,1,46,46A46.06,46.06,0,0,1,38,108Zm211,97a6,6,0,0,1-8.3-1.74A81.8,81.8,0,0,0,172,166a6,6,0,0,1,0-12,46,46,0,1,0-17.08-88.73,6,6,0,1,1-4.46-11.14,58,58,0,0,1,50.14,104.3,93.83,93.83,0,0,1,50.19,38.29A6,6,0,0,1,249,205Z"},null,-1),ge=[pe],me={key:4},ve=e("path",{d:"M117.25,157.92a60,60,0,1,0-66.5,0A95.83,95.83,0,0,0,3.53,195.63a8,8,0,1,0,13.4,8.74,80,80,0,0,1,134.14,0,8,8,0,0,0,13.4-8.74A95.83,95.83,0,0,0,117.25,157.92ZM40,108a44,44,0,1,1,44,44A44.05,44.05,0,0,1,40,108Zm210.14,98.7a8,8,0,0,1-11.07-2.33A79.83,79.83,0,0,0,172,168a8,8,0,0,1,0-16,44,44,0,1,0-16.34-84.87,8,8,0,1,1-5.94-14.85,60,60,0,0,1,55.53,105.64,95.83,95.83,0,0,1,47.22,37.71A8,8,0,0,1,250.14,206.7Z"},null,-1),$e=[ve],ye={key:5},we=e("path",{d:"M107.19,159a56,56,0,1,0-46.38,0A91.83,91.83,0,0,0,6.88,197.81a4,4,0,1,0,6.7,4.37,84,84,0,0,1,140.84,0,4,4,0,1,0,6.7-4.37A91.83,91.83,0,0,0,107.19,159ZM36,108a48,48,0,1,1,48,48A48.05,48.05,0,0,1,36,108Zm212,95.35a4,4,0,0,1-5.53-1.17A83.81,83.81,0,0,0,172,164a4,4,0,0,1,0-8,48,48,0,1,0-17.82-92.58,4,4,0,1,1-3-7.43,56,56,0,0,1,44,103,91.83,91.83,0,0,1,53.93,38.86A4,4,0,0,1,248,203.35Z"},null,-1),Ae=[we],fe={name:"PhUsers"},_e=f({...fe,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(s){const o=s,n=i("weight","regular"),h=i("size","1em"),u=i("color","currentColor"),p=i("mirrored",!1),t=c(()=>o.weight??n),r=c(()=>o.size??h),g=c(()=>o.color??u),m=c(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:p?"scale(-1, 1)":void 0);return(d,w)=>(a(),l("svg",Z({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:r.value,height:r.value,fill:g.value,transform:m.value},d.$attrs),[A(d.$slots,"default"),t.value==="bold"?(a(),l("g",ae,oe)):t.value==="duotone"?(a(),l("g",se,ie)):t.value==="fill"?(a(),l("g",ce,de)):t.value==="light"?(a(),l("g",ue,ge)):t.value==="regular"?(a(),l("g",me,$e)):t.value==="thin"?(a(),l("g",ye,Ae)):_("",!0)],16,te))}}),x="__nuxt_component";async function Ze(s,o){const n=V(),h=z(),u=N(),{fetchKey:p,_fetchKeyBase:t}=u.proxy.$options,r=(typeof p=="function"?p(()=>""):p)||[t,h.fullPath,h.matched.findIndex(d=>Object.values(d.components||{}).includes(u.type))].join(":"),{data:g,error:m}=await E(`options:asyncdata:${r}`,()=>n.runWithContext(()=>o(n)));if(m.value)throw q(m.value);g.value&&typeof g.value=="object"&&Object.assign(await s,D(F(g.value)))}const k=function(...o){const[n,h]=o,{setup:u}=n;return!u&&!n.asyncData&&!n.head?{[x]:!0,...n}:{[x]:!0,_fetchKeyBase:h,...n,setup(p,t){const r=V(),g=u?Promise.resolve(r.runWithContext(()=>u(p,t))).then(d=>d||{}):{},m=[];if(n.asyncData&&m.push(Ze(g,n.asyncData)),n.head){const d=V();C(typeof n.head=="function"?()=>n.head(d):n.head)}return Promise.resolve(g).then(()=>Promise.all(m)).then(()=>g).finally(()=>{m.length=0})}}},He=k({components:{PhRocketLaunch:ee}},"$zFVJLCtHYa"),M="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8zQyM/GmJhYTFpWBkNamJjMWIoLMYog83Mm19qfrzeG0m2ylZRYuPXgr+ArbJWikjJljWxYXrOmzc1k8y53XM/93vPOd17LtjDGSWr1/kgmytooWDAvRBZdDtfcdKGjTq8UUVXZ+YmwtS0rweJFLvzmrVqx/1rTfGEroCtQXhUUbWC8KTw9FpBNXlXuENJR+PC58J9mlxQ+N7UYxa/mZyy+MdkLRwaA3ursDtVxbEqVtJaVlhejiebWVXK9zFf0pzIzc/J2i2zC50QQQK4mWKcMfwMMCLej5dB+mVHjXxfKX+WvOQq4lXW0VghRZoCfaKuSvWErEnREzIyrJv9/9tXPTk0aFVvDkD9i2F89IBzB4rbhvF9bBjFE3A8w1Wukp8/guFP0bcrmucQXJtwcV3RYntwuQWdT2pUi5Ykh0x7MgnvZ9ASgfZbaFyyelY+5/QRwhvyVTewfwC9Eu9a/gU46mfRWXQCPQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcxJREFUSIm91sGLjlEUx/HPDAt11WWlbEYUNsqCsrChhCQSWSg2alIsrJQ/wsLKxsLORs1sJDY0TdEYTUqzmYWIMlm4i2M2M43F+yrG+77PfXjNb3nOved7z3nOPc+lpSLKlYjyPqKsRJSpiLKvzf6RlrCTeLzG/AV7UsqlJsZoGyCu9rBtw9naAG0zXMaGHq7XKeWDQwVGlFGs9POnlKtitSnpjoYDjQ0beKLBX/Udq8oQUTJeYu+AZXM4kFLuW3YqMowouzHRAIP9uNEU748MI8pG7MRhHMf5moN19R2XUsoTA4ER5TTGcaoycJPu4xFmUspffwNGlMt4MCRQPz3EvZTyi5GIsoBd/xkIq7gwElGWsGkdgDA/iul1gsHYKK7j0zoBX/3s0s06HXoEF7HlP8AWcbTnpIkoW3ETt/X+O9ToXXfvNKYwmVL+NnC0RZRDOvdpeyVkFXdwN6X8odeCxlkaUY7haQVsEedSygObsHFkpZSf4UkFcLwJVgXs6nmD/82g+fk3wNkG/9qH1T8DezbAL6oeHrXAjwa8Z/B2qMCU8hIm+7hnU8qfhwrs6haW1tiWca1FjHpgSnlB5yE1p3PB53EmpTzTBvgD8suAQT4OgVAAAAAASUVORK5CYII=",Le=""+new URL("planet-blue.Dl2xr_Rd.png",import.meta.url).href,ke=""+new URL("planet-ring.Cu48O4jc.png",import.meta.url).href,Me=""+new URL("planet-red.BluWtDiz.png",import.meta.url).href,Ve={class:"page-wrapper hero-wrapper"},be={class:"hero"},xe=e("h1",null,[$("Blast your Startup to the "),e("span",{class:"emph"},"Cosmos")],-1),Ce=e("h2",null,"QAComet: Subscription-Based Quality Assurance for your SaaS",-1),Se={class:"cta-outer"},Be={class:"hero-cta",href:"#plan"},Pe=e("span",{class:"hero-cta-text"},"Get Started",-1),ze={class:"hero-cta-icon"},qe=e("img",{class:"star star-1",src:M},null,-1),De=e("img",{class:"star star-2",src:M},null,-1),Fe=e("img",{class:"star star-3",src:M},null,-1),Ne=e("img",{class:"star star-4",src:M},null,-1),Re=e("div",{class:"hero-images"},[e("img",{class:"star planet-1",src:Le}),e("img",{class:"star planet-2",src:ke}),e("img",{class:"star planet-3",src:Me})],-1);function We(s,o,n,h,u,p){const t=H("PhRocketLaunch");return a(),l("div",Ve,[e("div",be,[xe,Ce,e("div",Se,[e("a",Be,[Pe,e("div",ze,[v(t)])]),qe,De,Fe,Ne])]),Re])}const je=L(He,[["render",We]]),Qe=k({components:{}},"$0jV3At8Fqp"),Te="data:image/png;base64,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",Ee=""+new URL("linkwarden-logo.Cnb5oU7W.png",import.meta.url).href,Ue={class:"brand-logos-wrapper"},Xe=R('
',1),Ge=[Xe];function Je(s,o,n,h,u,p){return a(),l("div",Ue,Ge)}const Ye=L(Qe,[["render",Je]]),Ie=k({name:"HowItWorks",components:{PhFileArrowDown:c6,PhKanban:C6,PhRepeat:S8}},"$Y4gCXyqNGe"),Oe={class:"how-it-works-outer"},Ke=e("div",{class:"bg-img"},null,-1),et={class:"how-it-works-inner",id:"how-it-works"},tt={class:"page-wrapper"},at=e("div",{class:"section-header"},[e("h1",null,"We've Revamped QA"),e("h2",null,[$("Now it's an Asnyc Workflow"),e("br"),$("Orbiting around your Product")])],-1),lt={class:"steps-wrapper pt-8"},ot={class:"step"},st={class:"step-icon shadow-main"},nt=e("div",{class:"step-copy"},[e("h3",null,"Schedule"),e("span",null,"Subscribe to our service and submit as many tickets as you want on our Github Project board.")],-1),rt={class:"step"},it={class:"step-icon shadow-main"},ct=e("div",{class:"step-copy"},[e("h3",null,"Receive"),e("span",null,"You'll see a response with a full QA report, test code, etc. within 2-3 business days")],-1),ht={class:"step"},dt={class:"step-icon shadow-main"},ut=e("div",{class:"step-copy"},[e("h3",null,"Update"),e("span",null,"We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.")],-1);function pt(s,o,n,h,u,p){const t=H("ph-kanban"),r=H("ph-file-arrow-down"),g=H("ph-repeat");return a(),l("div",Oe,[Ke,e("div",et,[e("div",tt,[at,e("div",lt,[e("div",ot,[e("div",st,[v(t,{weight:"duotone"})]),nt]),e("div",rt,[e("div",it,[v(r,{weight:"duotone"})]),ct]),e("div",ht,[e("div",dt,[v(g)]),ut])])])])])}const gt=L(Ie,[["render",pt]]),mt=""+new URL("ali-photo.C0U5PBBD.jpg",import.meta.url).href,vt=k({components:{PhArrowRight:U,PhCaretLeft:r0,PhCaretRight:b0,PhQuotes:X},data(){return{image:mt,slides:[{}]}},methods:{slideLeft(){},slideRight(){}}},"$WfSQQL4a1P"),$t={class:"recent-work-outer",id:"recent-work"},yt={class:"page-wrapper"},wt=e("div",{class:"section-header"},[e("h1",null,"Recent QA Work")],-1),At={class:"slider-outer"};function ft(s,o,n,h,u,p){const t=G;return a(),l("div",$t,[e("div",yt,[wt,e("div",At,[v(t,{image:"/img/ali-photo.jpg",imageAlt:"Photo of Ali B.",company:"Automatisch",companyUrl:"https://automatisch.io",person:"Ali B.",personUrl:"https://github.com/barinali",caseStudy:"/case-studies/automatisch",testimonial:"Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier."})])])])}const _t=L(vt,[["render",ft]]),Zt=k({name:"HowItWorks",components:{PhBackspace:$1,PhBrowsers:N1,PhCloudCheck:w2,PhCreditCard:W2,PhPlugs:j4,PhUsers:_e}},"$qIsZyFbGE8"),Ht="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20413%20213'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-229.252,-1518.25)'%3e%3cg%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,142.617,1012.17)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,2.5,0)'%3e%3cpath%20d='M245.577,1528.18L406.577,1577.68C407.368,1577.93%20408.208,1577.48%20408.451,1576.69C408.695,1575.9%20408.25,1575.06%20407.458,1574.82L246.458,1525.32C245.667,1525.07%20244.827,1525.52%20244.584,1526.31C244.34,1527.1%20244.785,1527.94%20245.577,1528.18Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Lt="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%20255%20257'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(1,0,0,1,-918.017,-1484.25)'%3e%3cg%20transform='matrix(1,0,0,1,499,10)'%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,534.882,968.167)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,332.382,1070.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,393.382,1214.67)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,544.882,1046.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(0.384615,0,0,0.333333,576.882,1136.42)'%3e%3cellipse%20cx='238.252'%20cy='1533.25'%20rx='13'%20ry='15'%20style='fill:rgb(245,245,241);fill-opacity:0.77;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M251.03,1514.78L258.03,1568.94C258.136,1569.76%20258.889,1570.34%20259.71,1570.24C260.531,1570.13%20261.111,1569.38%20261.005,1568.56L254.005,1514.39C253.899,1513.57%20253.146,1512.99%20252.325,1513.1C251.504,1513.2%20250.924,1513.95%20251.03,1514.78Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,375.5,-23.75)'%3e%3cpath%20d='M265.344,1593.85L287.344,1660.22C287.604,1661.01%20288.454,1661.43%20289.239,1661.17C290.025,1660.91%20290.452,1660.06%20290.191,1659.28L268.191,1592.9C267.931,1592.12%20267.081,1591.69%20266.296,1591.95C265.51,1592.21%20265.083,1593.06%20265.344,1593.85Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M243.711,1529.74L429.711,1505.49C430.532,1505.38%20431.112,1504.63%20431.005,1503.81C430.898,1502.99%20430.144,1502.41%20429.324,1502.51L243.324,1526.76C242.503,1526.87%20241.923,1527.62%20242.03,1528.44C242.137,1529.27%20242.89,1529.84%20243.711,1529.74Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,195,53.5)'%3e%3cpath%20d='M301.117,1664.27L437.617,1517.14C438.18,1516.54%20438.145,1515.59%20437.538,1515.03C436.931,1514.46%20435.981,1514.5%20435.418,1515.11L298.918,1662.23C298.355,1662.84%20298.39,1663.79%20298.997,1664.35C299.604,1664.91%20300.554,1664.88%20301.117,1664.27Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3cg%20transform='matrix(1,0,0,1,181,77.75)'%3e%3cpath%20d='M247.632,1516.83L297.632,1637.08C297.95,1637.84%20298.829,1638.2%20299.593,1637.88C300.358,1637.57%20300.72,1636.69%20300.403,1635.92L250.402,1515.67C250.085,1514.91%20249.206,1514.55%20248.442,1514.87C247.677,1515.18%20247.315,1516.06%20247.632,1516.83Z'%20style='fill:rgb(245,245,241);fill-opacity:0.47;'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",kt={class:"services-outer",id:"tasks"},Mt=e("img",{class:"constellation-1",width:"320",src:Ht},null,-1),Vt=e("img",{class:"constellation-2",width:"240",src:Lt},null,-1),bt={class:"services-inner"},xt={class:"page-wrapper"},Ct=e("div",{class:"section-header"},[e("h1",null,"Subscription Benefits"),e("h2",null,"A Constellation of QA and Testing Services for Robust Launches of New Products and Features")],-1),St={class:"steps-wrapper first-steps-wrapper"},Bt={class:"step"},Pt={class:"step-icon shadow-main"},zt=e("div",{class:"step-copy"},[e("h3",null,"Sales Funnel Testing"),e("span",null,"Find bugs before potential customers leave from frustration")],-1),qt={class:"step"},Dt={class:"step-icon shadow-main"},Ft=e("div",{class:"step-copy"},[e("h3",null,"Usability Testing"),e("span",null,"Extensive usability tests for those hard to find edge cases and bugs")],-1),Nt={class:"step"},Rt={class:"step-icon shadow-main"},Wt=e("div",{class:"step-copy"},[e("h3",null,"E2E Testing"),e("span",null,"We'll test user workflows guaranteeing minimal functionality before deployment")],-1),jt={class:"steps-wrapper"},Qt={class:"step"},Tt={class:"step-icon shadow-main"},Et=e("div",{class:"step-copy"},[e("h3",null,"Multi-Browser Support"),e("span",null,"We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac")],-1),Ut={class:"step"},Xt={class:"step-icon shadow-main"},Gt=e("div",{class:"step-copy"},[e("h3",null,"Regression Testing"),e("span",null,"Make sure bug fixes don't revert, especially for core functionality")],-1),Jt={class:"step"},Yt={class:"step-icon shadow-main"},It=e("div",{class:"step-copy"},[e("h3",null,"Integration Testing"),e("span",null,"Ensure your systems are coordinating together")],-1);function Ot(s,o,n,h,u,p){const t=H("ph-credit-card"),r=H("ph-users"),g=H("ph-cloud-check"),m=H("ph-browsers"),d=H("ph-backspace"),w=H("ph-plugs");return a(),l("div",kt,[Mt,Vt,e("div",bt,[e("div",xt,[Ct,e("div",St,[e("div",Bt,[e("div",Pt,[v(t)]),zt]),e("div",qt,[e("div",Dt,[v(r)]),Ft]),e("div",Nt,[e("div",Rt,[v(g)]),Wt])]),e("div",jt,[e("div",Qt,[e("div",Tt,[v(m)]),Et]),e("div",Ut,[e("div",Xt,[v(d)]),Gt]),e("div",Jt,[e("div",Yt,[v(w)]),It])])])])])}const Kt=L(Zt,[["render",Ot]]),ea=k({props:{setOption:{type:Function,default:s=>{}}},watch:{option(){this.setBgStyle()}},data(){return{option:"monthly",bgStyle:{width:"0px",height:"0px"}}},computed:{ariaLabel(){return this.option==="monthly"?"Toggle yearly plan":"Toggle monthly plan"}},mounted(){this.setBgStyle(),document.fonts.ready.finally(()=>{this.setBgStyle()})},methods:{setBgStyle(){const s=this.$refs.wrapper;if(!s)return;const o=s.getBoundingClientRect();if(this.option==="monthly"){const n=this.$refs.monthly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x-2;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}else{const n=this.$refs.yearly;if(n){const h=n.getBoundingClientRect(),u=h.x-o.x;this.bgStyle={width:h.width+"px",height:h.height-4+"px",borderRadius:Math.ceil((n.offsetHeight-2)/2)+"px",transform:"translateX("+u+"px)"}}}},toggle(){this.option=this.option==="monthly"?"yearly":"monthly",this.setOption(this.option)}}},"$m7wA03iy9u"),ta=["aria-label"],aa={class:"text",ref:"monthly"},la={class:"text",ref:"yearly"};function oa(s,o,n,h,u,p){return a(),l("button",{class:"toggle-wrapper",ref:"wrapper",onClick:o[0]||(o[0]=(...t)=>s.toggle&&s.toggle(...t)),"aria-label":s.ariaLabel},[e("div",{class:"toggle-bg",style:W(s.bgStyle)},null,4),e("span",aa,"Monthly",512),e("span",la,"Yearly",512)],8,ta)}const sa=L(ea,[["render",oa]]),na=k({name:"Plan",components:{PhCheck:I0,PhPhone:S},data(){return{option:"monthly"}},computed:{signupLink(){return"mailto:hello@qacomet.com?subject=Get Started "+(this.option==="monthly"?"Monthly":"Yearly")+"&body=Hey,%0D%0A%0D%0AI'm interested in using your service, could you send me an invoice and we can get started?"},bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)},price(){return this.option==="monthly"?"4,999":"4,249"}},methods:{setOption(s){this.option=s}}},"$DqbyBHNawb"),ra={class:"plan-outer",id:"plan"},ia={class:"page-wrapper"},ca=e("div",{class:"section-header plan-header",style:{"padding-bottom":"2rem"}},[e("img",{class:"star star-1",src:M}),e("img",{class:"star star-2",src:M}),e("img",{class:"star star-3",src:M}),e("h1",null,"Clear Pricing"),e("h2",null,[$("Building great products is hard,"),e("br"),$("pricing shouldn't be")])],-1),ha={class:"plan-toggle-wrapper"},da={class:"plan"},ua={class:"plan-body"},pa={class:"plan-info"},ga=e("span",{class:"slash"},null,-1),ma=e("span",{class:"slash"},"/",-1),va=e("span",{class:"mo"},"mo",-1),$a=e("br",null,null,-1),ya=e("h3",null,"Pause or cancel anytime",-1),wa=["href"],Aa={class:"plan-features"},fa={class:"plan-feature-row"},_a={class:"check"},Za=e("div",{class:"plan-feature"},"1 request at a time",-1),Ha={class:"plan-feature-row"},La={class:"check"},ka=e("div",{class:"plan-feature"},"2 week $50 trial",-1),Ma={class:"plan-feature-row"},Va={class:"check"},ba=e("div",{class:"plan-feature"},"2-3 business day delivery",-1),xa={class:"plan-feature-row"},Ca={class:"check"},Sa=e("div",{class:"plan-feature"},"Unlimited users",-1),Ba={class:"plan-feature-row"},Pa={class:"check"},za=e("div",{class:"plan-feature"},"No contracts, pause or cancel anytime",-1),qa={class:"booking-wrapper"},Da=e("div",{class:"booking-text"},"Curious how QAComet will work for you?",-1),Fa=["href"],Na=e("span",null,"Book a call",-1),Ra=[Na];function Wa(s,o,n,h,u,p){const t=sa,r=H("ph-check");return a(),l("div",ra,[e("div",ia,[ca,e("div",ha,[v(t,{setOption:s.setOption},null,8,["setOption"])]),e("div",da,[e("div",ua,[e("div",pa,[e("h1",null,[ga,$("$"+b(s.price),1),ma,va]),e("h2",null,[$("Billed "+b(s.option),1),$a,$("no contracts, no commitments")]),ya,e("a",{class:"payment",href:s.signupLink},"Signup",8,wa)]),e("div",Aa,[e("div",fa,[e("div",_a,[v(r,{weight:"bold"})]),Za]),e("div",Ha,[e("div",La,[v(r,{weight:"bold"})]),ka]),e("div",Ma,[e("div",Va,[v(r,{weight:"bold"})]),ba]),e("div",xa,[e("div",Ca,[v(r,{weight:"bold"})]),Sa]),e("div",Ba,[e("div",Pa,[v(r,{weight:"bold"})]),za])])])]),e("div",qa,[Da,e("a",{href:s.bookLink,class:"booking-cta"},Ra,8,Fa)])])])}const ja=L(na,[["render",Wa]]),Qa=k({name:"Accordion",components:{PhMinus:K6,PhPlus:h8},data(){return{expanded:!1}},methods:{handleExpanded(){this.expanded=!this.expanded}}},"$Y0yju32yn3"),Ta={class:"accordion-wrapper"},Ea={class:"accordion-header-text"},Ua={class:"accordion-header-icon","aria-label":"Expand accordion"},Xa={key:0,class:"icon"},Ga={key:1,class:"icon"},Ja={class:"accordion-text"};function Ya(s,o,n,h,u,p){const t=H("PhMinus"),r=H("PhPlus");return a(),l("div",Ta,[e("div",{class:"accordion-header",onClick:o[0]||(o[0]=(...g)=>s.handleExpanded&&s.handleExpanded(...g))},[e("div",Ea,[e("span",null,[A(s.$slots,"header")])]),e("button",Ua,[s.expanded?(a(),l("div",Xa,[v(t,{weight:"bold"})])):(a(),l("div",Ga,[v(r,{weight:"bold"})]))])]),e("div",{class:j(["accordion-text-wrapper",{"accordion-text-hidden":!s.expanded,"accordion-text-expanded":s.expanded}])},[e("div",Ja,[A(s.$slots,"text")])],2)])}const Ia=L(Qa,[["render",Ya]]),Oa=k({},"$Wb7gDotc3K"),Ka={class:"faqs-outer",id:"faqs"},e3={class:"page-wrapper"},t3=e("div",{class:"section-header"},[e("h1",null,"FAQ's")],-1),a3={class:"faqs-body"},l3=e("a",{href:"https://playwright.dev/"},"Playwright",-1);function o3(s,o,n,h,u,p){const t=Ia;return a(),l("div",Ka,[e("div",e3,[t3,e("div",a3,[v(t,null,{header:y(()=>[$("Why wouldn't I just hire a full-time QA engineer?")]),text:y(()=>[$("Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.")]),_:1}),v(t,null,{header:y(()=>[$("Which frameworks do you use for testing?")]),text:y(()=>[$("We mainly write tests in javascript using "),l3,$(". We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.")]),_:1}),v(t,null,{header:y(()=>[$("What kind of platforms do you offer testing on?")]),text:y(()=>[$("We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.")]),_:1}),v(t,null,{header:y(()=>[$("How can I run these tests?")]),text:y(()=>[$("Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.")]),_:1}),v(t,null,{header:y(()=>[$("How quickly will tests be ready?")]),text:y(()=>[$("We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.")]),_:1}),v(t,null,{header:y(()=>[$("Can we use another project management tool?")]),text:y(()=>[$("We can, but that's an add on cost since it slows down our workflow.")]),_:1}),v(t,null,{header:y(()=>[$("How are projects split up?")]),text:y(()=>[$("You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.")]),_:1}),v(t,null,{header:y(()=>[$("How can I get started?")]),text:y(()=>[$('You can click on the "Start Today" button in the navbar and it will take you to the registration section.')]),_:1}),v(t,null,{header:y(()=>[$("Do you offer yearly pricing?")]),text:y(()=>[$("Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!")]),_:1}),v(t,null,{header:y(()=>[$("Can I get a refund if I'm not satisfied?")]),text:y(()=>[$("We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.")]),_:1})])])])}const s3=L(Oa,[["render",o3]]),n3=k({name:"Plan",components:{PhPhone:S},computed:{bookLink(){const s=new Date,o=s.getMonth()<9?"0"+(s.getMonth()+1):s.getMonth()+1;return"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month="+(s.getFullYear()+"-"+o)}}},"$lLdJQFVJ7l"),r3={class:"end-outer"},i3={class:"page-wrapper end-wrapper"},c3=e("h2",null,"Book a call and see if QAComet works for you",-1),h3=e("h3",null,"Receive a guided tour through our QA process and find out how your company can benefit from QAComet.",-1),d3=["href"],u3=e("span",null,"Book a call",-1);function p3(s,o,n,h,u,p){const t=H("PhPhone");return a(),l("div",r3,[e("div",i3,[c3,h3,e("a",{href:s.bookLink,class:"end-cta"},[u3,v(t)],8,d3)])])}const g3=L(n3,[["render",p3]]),f3=f({__name:"index",setup(s){const o=T(),n=new URL(o.public.baseUrl);n.pathname=J,n.searchParams.set("utm_source","ab5");const h=n.toString();return C({title:"QAComet - QA as a service for only $5k/month",meta:[{name:"description",content:"QAComet is built for testing your SaaS or webapp. We effectively find bugs and hard to reach edge cases and quickly write robust tests using playwright. If you try us today, we have a $50 14 day trial available for new customers, limited to the first 5 customers. Start today!"},{property:"og:image",content:h},{property:"og:image:width",content:"1500"},{property:"og:image:height",content:"1500"},{property:"og:title",content:"QAComet - $5k/month unlimited QA"},{property:"og:url",content:"https://qacomet.com"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"E2E tests, integration testing, quality reviews, and more. Make unlimited requests 24/7 and receive work back within 3 business days."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:image",content:h}],link:[{rel:"canonical",href:"https://qacomet.com"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"Organization",image:["https://qacomet.com/img/qacomet-logo.png","https://qacomet.com/img/open-graph-banner.jpg"],url:"https://qacomet.com",logo:"https://qacomet.com/img/qacomet-logo.png",sameAs:["https://github.com/QAComet","https://mastodon.social/@qacomet","https://bsky.app/profile/qacomet.bsky.social","https://twitter.com/QACometOfficial"],name:"QAComet",legalName:"QAComet LLC",description:"QAComet is a subscription service for unlimited QA work. For $5k/month you get unlimited requests to write end-to-end tests, integration tests, unit tests, do QA and usability reviews, and work on finding and reporting bugs.",email:"hello@qacomet.com",contactPoint:{"@type":"ContactPoint",email:"hello@qacomet.com"}})}]}),(u,p)=>{const t=je,r=Ye,g=gt,m=_t,d=Kt,w=ja,B=s3,P=g3;return a(),l(Q,null,[v(t),v(r),v(g),v(m),v(d),v(w),v(B),v(P)],64)}}});export{f3 as default}; diff --git a/_nuxt/DSPAbem3.js b/_nuxt/DSPAbem3.js new file mode 100644 index 0000000..f06aade --- /dev/null +++ b/_nuxt/DSPAbem3.js @@ -0,0 +1 @@ +import{_ as h}from"./Djecwb_v.js";import{u as p}from"./BqUvtMHT.js";import{q as u}from"./DEZhdWR8.js";import{f as m,h as f,c as o,a as t,F as w,r as y,i as g,o as r,t as s,b as d,w as l,d as n}from"./DiyP6pou.js";import"./BpUWW4O-.js";const v={class:"blog-outer"},k={class:"blog-wrapper"},x=t("div",{class:"blog-header"},[t("h1",null,"Playwright Internals"),t("h2",{class:"subheader"},"A series on the inner workings of Microsoft's Playwright framework")],-1),b={class:"content-wrapper"},C={class:"blog-post-wrapper"},D={class:"date-wrapper"},N={class:"month"},A={class:"day"},B={class:"year"},V={class:"description-wrapper"},S=m({__name:"index",async setup(q){let a,i;const{data:_}=([a,i]=f(()=>p("playwright-posts",()=>u("/playwright").only(["title","link","created","shortDescription"]).sort({"created.number":-1,$numeric:!0}).find())),a=await a,i(),a);return(F,L)=>{const c=h;return r(),o("div",v,[t("div",k,[x,t("div",b,[(r(!0),o(w,null,y(g(_),e=>(r(),o("div",C,[t("div",D,[t("div",N,s(e.created.month),1),t("div",A,s(e.created.day),1),t("div",B,s(e.created.year),1)]),t("div",V,[t("h3",null,[d(c,{to:e.link},{default:l(()=>[n(s(e.title),1)]),_:2},1032,["to"])]),t("p",null,[n(s(e.shortDescription)+" ",1),d(c,{class:"read",to:e.link},{default:l(()=>[n("Continue Reading")]),_:2},1032,["to"])])])]))),256))])])])}}});export{S as default}; diff --git a/_nuxt/DcjfjkQm.js b/_nuxt/DcjfjkQm.js new file mode 100644 index 0000000..3e2674f --- /dev/null +++ b/_nuxt/DcjfjkQm.js @@ -0,0 +1 @@ +import s from"./_ufwR5o8.js";import{f as a,c,a as o,b as i,u as m,o as n}from"./DiyP6pou.js";import{_ as p}from"./e4iyi0z6.js";import"./ChQXwC9l.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./Cb50__Mb.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const _={class:"page-wrapper"},f={class:"legal-outer"},l=o("h1",{class:"page-header"},"Terms of Service",-1),R=a({__name:"terms-of-service",setup(d){const t=m(),e=new URL(t.public.baseUrl);return e.pathname=p,e.toString(),(g,u)=>{const r=s;return n(),c("div",_,[o("div",f,[l,i(r,{path:"/terms-of-service"})])])}}});export{R as default}; diff --git a/_nuxt/DdJ-Ewyp.js b/_nuxt/DdJ-Ewyp.js new file mode 100644 index 0000000..9f485a1 --- /dev/null +++ b/_nuxt/DdJ-Ewyp.js @@ -0,0 +1 @@ +import r from"./_ufwR5o8.js";import{f as c,c as s,a as e,b as i,u as p,o as n}from"./DiyP6pou.js";import{_ as m}from"./e4iyi0z6.js";import"./ChQXwC9l.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./Cb50__Mb.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const _={class:"page-wrapper"},l={class:"legal-outer"},d=e("h1",{class:"page-header"},"Privacy Policy",-1),N=c({__name:"privacy-policy",setup(f){const t=p(),o=new URL(t.public.baseUrl);return o.pathname=m,o.toString(),(g,u)=>{const a=r;return n(),s("div",_,[e("div",l,[d,i(a,{path:"/privacy-policy"})])])}}});export{N as default}; diff --git a/_nuxt/Dhont5qJ.js b/_nuxt/Dhont5qJ.js deleted file mode 100644 index ec88d29..0000000 --- a/_nuxt/Dhont5qJ.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as V}from"./CFzORWKb.js";import{u as $}from"./maW11VfC.js";import{f as H,j as i,k as r,o as a,c as t,l as _,m as Z,n as k,a as e,x,b as n,w as v,D as A,i as w,F as L,B as y,d as u}from"./BlS8upJP.js";const b=["width","height","fill","transform"],B={key:0},S=e("path",{d:"M224,44H32A12,12,0,0,0,20,56V192a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A12,12,0,0,0,224,44Zm-96,83.72L62.85,68h130.3ZM92.79,128,44,172.72V83.28Zm17.76,16.28,9.34,8.57a12,12,0,0,0,16.22,0l9.34-8.57L193.15,188H62.85ZM163.21,128,212,83.28v89.44Z"},null,-1),z=[S],F={key:1},N=e("path",{d:"M224,56l-96,88L32,56Z",opacity:"0.2"},null,-1),T=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),P=[N,T],q={key:2},D=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),E=[D],j={key:3},W=e("path",{d:"M224,50H32a6,6,0,0,0-6,6V192a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A6,6,0,0,0,224,50Zm-96,85.86L47.42,62H208.58ZM101.67,128,38,186.36V69.64Zm8.88,8.14L124,148.42a6,6,0,0,0,8.1,0l13.4-12.28L208.58,194H47.43ZM154.33,128,218,69.64V186.36Z"},null,-1),G=[W],Q={key:4},I=e("path",{d:"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"},null,-1),O=[I],U={key:5},R=e("path",{d:"M224,52H32a4,4,0,0,0-4,4V192a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A4,4,0,0,0,224,52Zm-96,86.57L42.28,60H213.72ZM104.63,128,36,190.91V65.09Zm5.92,5.43L125.3,147a4,4,0,0,0,5.4,0l14.75-13.52L213.72,196H42.28ZM151.37,128,220,65.09V190.91Z"},null,-1),Y=[R],J={name:"PhEnvelope"},K=H({...J,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",B,z)):l.value==="duotone"?(a(),t("g",F,P)):l.value==="fill"?(a(),t("g",q,E)):l.value==="light"?(a(),t("g",j,G)):l.value==="regular"?(a(),t("g",Q,O)):l.value==="thin"?(a(),t("g",U,Y)):Z("",!0)],16,b))}}),X=["width","height","fill","transform"],e1={key:0},a1=e("path",{d:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM40,76H216a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24ZM216,180H40a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Z"},null,-1),t1=[a1],o1={key:1},l1=e("path",{d:"M216,64V192H40V64Z",opacity:"0.2"},null,-1),s1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),i1=[l1,s1],r1={key:2},n1=e("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM192,184H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Zm0-48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z"},null,-1),c1=[n1],h1={key:3},d1=e("path",{d:"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM40,70H216a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12ZM216,186H40a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Z"},null,-1),m1=[d1],p1={key:4},g1=e("path",{d:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},null,-1),v1=[g1],u1={key:5},f1=e("path",{d:"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM40,68H216a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8ZM216,188H40a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Z"},null,-1),C1=[f1],w1={name:"PhList"},H1=H({...w1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",e1,t1)):l.value==="duotone"?(a(),t("g",o1,i1)):l.value==="fill"?(a(),t("g",r1,c1)):l.value==="light"?(a(),t("g",h1,m1)):l.value==="regular"?(a(),t("g",p1,v1)):l.value==="thin"?(a(),t("g",u1,C1)):Z("",!0)],16,X))}}),_1=["width","height","fill","transform"],Z1={key:0},k1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-56,0a16,16,0,1,1,16,16A16,16,0,0,1,112,104Zm112,92H140v-8.87a84,84,0,1,0-24,0V196H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM68,104a60,60,0,1,1,60,60A60.07,60.07,0,0,1,68,104Z"},null,-1),M1=[k1],y1={key:1},V1=e("path",{d:"M128,32a72,72,0,1,0,72,72A72,72,0,0,0,128,32Zm0,104a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z",opacity:"0.2"},null,-1),$1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),x1=[V1,$1],A1={key:2},L1=e("path",{d:"M160,104a32,32,0,1,1-32-32A32,32,0,0,1,160,104Zm72,104a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h88V183.6a80,80,0,1,1,16,0V200h88A8,8,0,0,1,232,208ZM128,152a48,48,0,1,0-48-48A48.05,48.05,0,0,0,128,152Z"},null,-1),b1=[L1],B1={key:3},S1=e("path",{d:"M166,104a38,38,0,1,0-38,38A38,38,0,0,0,166,104Zm-64,0a26,26,0,1,1,26,26A26,26,0,0,1,102,104Zm122,98H134V181.75a78,78,0,1,0-12,0V202H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM62,104a66,66,0,1,1,66,66A66.08,66.08,0,0,1,62,104Z"},null,-1),z1=[S1],F1={key:4},N1=e("path",{d:"M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"},null,-1),T1=[N1],P1={key:5},q1=e("path",{d:"M164,104a36,36,0,1,0-36,36A36,36,0,0,0,164,104Zm-64,0a28,28,0,1,1,28,28A28,28,0,0,1,100,104ZM224,204H132V179.89a76,76,0,1,0-8,0V204H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM60,104a68,68,0,1,1,68,68A68.07,68.07,0,0,1,60,104Z"},null,-1),D1=[q1],E1={name:"PhWebcam"},j1=H({...E1,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(p){const o=p,d=i("weight","regular"),m=i("size","1em"),g=i("color","currentColor"),s=i("mirrored",!1),l=r(()=>o.weight??d),c=r(()=>o.size??m),f=r(()=>o.color??g),C=r(()=>o.mirrored!==void 0?o.mirrored?"scale(-1, 1)":void 0:s?"scale(-1, 1)":void 0);return(h,M)=>(a(),t("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:c.value,height:c.value,fill:f.value,transform:C.value},h.$attrs),[_(h.$slots,"default"),l.value==="bold"?(a(),t("g",Z1,M1)):l.value==="duotone"?(a(),t("g",y1,x1)):l.value==="fill"?(a(),t("g",A1,b1)):l.value==="light"?(a(),t("g",B1,z1)):l.value==="regular"?(a(),t("g",F1,T1)):l.value==="thin"?(a(),t("g",P1,D1)):Z("",!0)],16,_1))}}),W1="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%2027%2027'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;'%3e%3cg%20transform='matrix(1,0,0,1,-2.69278,-2.69278)'%3e%3cg%20transform='matrix(0.707107,0.707107,-0.707107,0.707107,15.9609,-5.3514)'%3e%3cg%20transform='matrix(-1,5.72459e-17,-1.78677e-16,1.16352,31.1254,-2.7646)'%3e%3cpath%20d='M16,30.287C17.302,27.607%2018.843,23.262%2019.905,22.248C20.664,21.523%2022.019,25.187%2022.374,24.2C23.063,22.286%2024.039,16.218%2024.039,10.763C24.039,5.307%2018.68,2.723%2016,2.723C13.32,2.723%207.961,5.307%207.961,10.763C7.961,16.218%208.937,22.286%209.626,24.2C9.981,25.187%2011.336,21.523%2012.095,22.248C13.157,23.262%2014.698,27.607%2016,30.287'%20style='fill:rgb(245,245,241);stroke:rgb(245,245,241);stroke-width:1.84px;'/%3e%3c/g%3e%3cg%20transform='matrix(0.61912,-0.61912,0.554112,0.554112,-6.10261,3.31527)'%3e%3cellipse%20cx='13.502'%20cy='23.224'%20rx='5.14'%20ry='5.742'%20style='fill:rgb(16,12,10);'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",G1="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1800'%20height='1200'%3e%3cpath%20fill='%23002868'%20d='M0%200h1800v1200H0'/%3e%3cpath%20fill='%23fff'%20d='M0%20400h1800v400H0'/%3e%3cpath%20d='M1130.81,750A400,400%200%201,1%201130.81,450L760,600'%20fill='%23BF0A30'/%3e%3ccircle%20cx='760'%20cy='600'%20r='200'%20fill='gold'/%3e%3c/svg%3e",Q1={class:"navbar"},I1={class:"nav-main"},O1=e("img",{src:W1,alt:"QAComet Logo"},null,-1),U1=e("span",null,"QAComet",-1),R1=y('Why QAComet?Recent WorkTasksFAQsStart Today',5),Y1=[R1],J1=e("a",{href:"/#plan",class:"nav-cta"},"Start Today",-1),K1={class:"main"},X1={class:"page-footer"},e0={class:"page-wrapper footer-wrapper"},a0={class:"footer-sections"},t0={class:"footer-section"},o0=e("div",{class:"footer-logo"},null,-1),l0=e("div",{class:"footer-section-title"},"Contact",-1),s0={class:"footer-links"},i0={class:"link-wrapper"},r0={class:"link-icon"},n0=e("div",{class:"link-text"},[e("a",{href:"mailto:hello@qacomet.com"},"Email us")],-1),c0={class:"link-wrapper"},h0={class:"link-icon"},d0=e("div",{class:"link-text"},[e("a",{href:"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call?month=2024-03"},"Book a free call")],-1),m0=y('',2),p0={class:"footer-section"},g0=e("div",{class:"footer-section-title"},"Blog",-1),v0={class:"footer-links"},u0={class:"footer-section"},f0=e("div",{class:"footer-section-title"},"Links",-1),C0={class:"footer-links"},w0=e("a",{href:"mailto:hello@qacomet.com"},"Contact",-1),H0=e("div",{class:"footer-end"},[e("span",{class:"copy"},[e("img",{src:G1,alt:"Colorado Flag"}),u(" © 2024 QAComet LLC")])],-1),M0=H({__name:"default",setup(p){const o=x({menu:!1});function d(){o.menu=!o.menu}return $({meta:[{name:"msapplication-TileColor",content:"#F5F6F1"},{name:"theme-color",content:"#F5F6F1"}],link:[{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"},{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"},{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"},{rel:"icon",href:"/favicon.ico"},{rel:"manifest",href:"/site.webmanifest"},{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:"#100c09"}]}),(m,g)=>{const s=V;return a(),t(L,null,[e("nav",Q1,[e("div",I1,[n(s,{to:"/",class:"nav-logo"},{default:v(()=>[O1,U1]),_:1}),e("div",{class:A(["nav-links",{"display-nav-links":w(o).menu}])},Y1,2),J1,e("button",{class:"menu",onClick:d,"aria-label":"Toggle mobile menu"},[n(w(H1),{color:"#F5F6F1",weight:"bold"})])])]),e("div",K1,[_(m.$slots,"default"),e("footer",X1,[e("div",e0,[e("div",a0,[e("div",t0,[o0,l0,e("div",s0,[e("div",i0,[e("div",r0,[n(w(K))]),n0]),e("div",c0,[e("div",h0,[n(w(j1))]),d0])]),m0]),e("div",p0,[g0,e("div",v0,[n(s,{to:"/case-studies/",prefetch:""},{default:v(()=>[u("Case Studies")]),_:1}),n(s,{to:"/playwright/",prefetch:""},{default:v(()=>[u("Playwright Internals")]),_:1})])]),e("div",u0,[f0,e("div",C0,[n(s,{to:"/terms-of-service/",prefetch:""},{default:v(()=>[u("Terms of Service")]),_:1}),n(s,{to:"/terms-and-conditions/",prefetch:""},{default:v(()=>[u("Terms & Conditions")]),_:1}),n(s,{to:"/privacy-policy/",prefetch:""},{default:v(()=>[u("Privacy Policy")]),_:1}),w0])])]),H0])])])],64)}}});export{M0 as default}; diff --git a/_nuxt/DiyP6pou.js b/_nuxt/DiyP6pou.js new file mode 100644 index 0000000..b613851 --- /dev/null +++ b/_nuxt/DiyP6pou.js @@ -0,0 +1,24 @@ +const __vite__fileDeps=["./BQDZ21oy.js","./BamxlSPu.js","./Djecwb_v.js","./Testimonial.B-jLyaoL.css","./Du8iVdrZ.js","./DMFARuCF.js","./aHVSc_rA.js","./C-v3KzvZ.js","./BpUWW4O-.js","./BqUvtMHT.js","./DEZhdWR8.js","./BASUvlMQ.js","./BQoE-4GE.js","./ChQXwC9l.js","./e4iyi0z6.js","./index.DrXF56mq.css","./DNJ0aMK4.js","./DzaeZ-yb.js","./DSPAbem3.js","./DdJ-Ewyp.js","./_ufwR5o8.js","./Cb50__Mb.js","./C5ITgUyT.js","./DcjfjkQm.js","./Ck9OydBO.js","./BXBBK3p1.js","./BOU-aCie.js","./Bh_R0szF.js","./ProseCode.C53feiBF.css","./FwdM-4d8.js","./Quote.DvdHt3k9.css","./CZxlAbJ7.js","./YcXSTn_u.js","./3fa5i0ew.js","./eKBtyYuL.js","./C5JBqY-4.js","./DsFcf1tA.js","./ProsePre.CchFRBtv.css","./DvvkLF7V.js","./Ci9wJC62.js","./default.C6rz2lqQ.css","./Cw0Mq-1J.js","./error-404.JekaaCis.css","./C4g8nH2O.js","./error-500.CNP9nqm1.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +/** +* @vue/shared v3.4.27 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function $o(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const pe={},Wt=[],De=()=>{},Ya=()=>!1,Ln=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),jo=e=>e.startsWith("onUpdate:"),ye=Object.assign,Do=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Za=Object.prototype.hasOwnProperty,ne=(e,t)=>Za.call(e,t),G=Array.isArray,Kt=e=>On(e)==="[object Map]",Ki=e=>On(e)==="[object Set]",ec=e=>On(e)==="[object RegExp]",X=e=>typeof e=="function",me=e=>typeof e=="string",Nt=e=>typeof e=="symbol",ce=e=>e!==null&&typeof e=="object",Fo=e=>(ce(e)||X(e))&&X(e.then)&&X(e.catch),qi=Object.prototype.toString,On=e=>qi.call(e),tc=e=>On(e).slice(8,-1),zi=e=>On(e)==="[object Object]",Bo=e=>me(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qt=$o(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),pr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},nc=/-(\w)/g,Ze=pr(e=>e.replace(nc,(t,n)=>n?n.toUpperCase():"")),rc=/\B([A-Z])/g,rn=pr(e=>e.replace(rc,"-$1").toLowerCase()),gr=pr(e=>e.charAt(0).toUpperCase()+e.slice(1)),xr=pr(e=>e?`on${gr(e)}`:""),Et=(e,t)=>!Object.is(e,t),dn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},oc=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ji=e=>{const t=me(e)?Number(e):NaN;return isNaN(t)?e:t};let Ts;const Qi=()=>Ts||(Ts=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function mr(e){if(G(e)){const t={};for(let n=0;n{if(n){const r=n.split(ic);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function yr(e){let t="";if(me(e))t=e;else if(G(e))for(let n=0;nme(e)?e:e==null?"":G(e)||ce(e)&&(e.toString===qi||!X(e.toString))?JSON.stringify(e,Yi,2):String(e),Yi=(e,t)=>t&&t.__v_isRef?Yi(e,t.value):Kt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[kr(r,s)+" =>"]=o,n),{})}:Ki(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>kr(n))}:Nt(t)?kr(t):ce(t)&&!G(t)&&!zi(t)?String(t):t,kr=(e,t="")=>{var n;return Nt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.27 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ne;class Zi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ne,!t&&Ne&&(this.index=(Ne.scopes||(Ne.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ne;try{return Ne=this,t()}finally{Ne=n}}}on(){Ne=this}off(){Ne=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Rt()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=vt,n=Lt;try{return vt=!0,Lt=this,this._runnings++,Ps(this),this.fn()}finally{Cs(this),this._runnings--,Lt=n,vt=t}}stop(){this.active&&(Ps(this),Cs(this),this.onStop&&this.onStop(),this.active=!1)}}function gc(e){return e.value}function Ps(e){e._trackId++,e._depsLength=0}function Cs(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},tr=new WeakMap,Ot=Symbol(""),io=Symbol("");function Ie(e,t,n){if(vt&&Lt){let r=tr.get(e);r||tr.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=sl(()=>r.delete(n))),rl(Lt,o)}}function nt(e,t,n,r,o,s){const i=tr.get(e);if(!i)return;let l=[];if(t==="clear")l=[...i.values()];else if(n==="length"&&G(e)){const a=Number(r);i.forEach((u,c)=>{(c==="length"||!Nt(c)&&c>=a)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":G(e)?Bo(n)&&l.push(i.get("length")):(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(io)));break;case"delete":G(e)||(l.push(i.get(Ot)),Kt(e)&&l.push(i.get(io)));break;case"set":Kt(e)&&l.push(i.get(Ot));break}Uo();for(const a of l)a&&ol(a,4);Wo()}function mc(e,t){const n=tr.get(e);return n&&n.get(t)}const yc=$o("__proto__,__v_isRef,__isVue"),il=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Nt)),As=_c();function _c(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=re(this);for(let s=0,i=this.length;s{e[t]=function(...n){wt(),Uo();const r=re(this)[t].apply(this,n);return Wo(),Rt(),r}}),e}function vc(e){Nt(e)||(e=String(e));const t=re(this);return Ie(t,"has",e),t.hasOwnProperty(e)}class ll{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?Oc:fl:s?ul:cl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=G(t);if(!o){if(i&&ne(As,n))return Reflect.get(As,n,r);if(n==="hasOwnProperty")return vc}const l=Reflect.get(t,n,r);return(Nt(n)?il.has(n):yc(n))||(o||Ie(t,"get",n),s)?l:Pe(l)?i&&Bo(n)?l:l.value:ce(l)?o?dl(l):Tt(l):l}}class al extends ll{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const a=Xt(s);if(!nr(r)&&!Xt(r)&&(s=re(s),r=re(r)),!G(t)&&Pe(s)&&!Pe(r))return a?!1:(s.value=r,!0)}const i=G(t)&&Bo(n)?Number(n)e,_r=e=>Reflect.getPrototypeOf(e);function Dn(e,t,n=!1,r=!1){e=e.__v_raw;const o=re(e),s=re(t);n||(Et(t,s)&&Ie(o,"get",t),Ie(o,"get",s));const{has:i}=_r(o),l=r?Ko:n?Go:wn;if(i.call(o,t))return l(e.get(t));if(i.call(o,s))return l(e.get(s));e!==o&&e.get(t)}function Fn(e,t=!1){const n=this.__v_raw,r=re(n),o=re(e);return t||(Et(e,o)&&Ie(r,"has",e),Ie(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Bn(e,t=!1){return e=e.__v_raw,!t&&Ie(re(e),"iterate",Ot),Reflect.get(e,"size",e)}function Ss(e){e=re(e);const t=re(this);return _r(t).has.call(t,e)||(t.add(e),nt(t,"add",e,e)),this}function xs(e,t){t=re(t);const n=re(this),{has:r,get:o}=_r(n);let s=r.call(n,e);s||(e=re(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?Et(t,i)&&nt(n,"set",e,t):nt(n,"add",e,t),this}function ks(e){const t=re(this),{has:n,get:r}=_r(t);let o=n.call(t,e);o||(e=re(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&nt(t,"delete",e,void 0),s}function Ls(){const e=re(this),t=e.size!==0,n=e.clear();return t&&nt(e,"clear",void 0,void 0),n}function Vn(e,t){return function(r,o){const s=this,i=s.__v_raw,l=re(i),a=t?Ko:e?Go:wn;return!e&&Ie(l,"iterate",Ot),i.forEach((u,c)=>r.call(o,a(u),a(c),s))}}function Un(e,t,n){return function(...r){const o=this.__v_raw,s=re(o),i=Kt(s),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,u=o[e](...r),c=n?Ko:t?Go:wn;return!t&&Ie(s,"iterate",a?io:Ot),{next(){const{value:f,done:d}=u.next();return d?{value:f,done:d}:{value:l?[c(f[0]),c(f[1])]:c(f),done:d}},[Symbol.iterator](){return this}}}}function lt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Tc(){const e={get(s){return Dn(this,s)},get size(){return Bn(this)},has:Fn,add:Ss,set:xs,delete:ks,clear:Ls,forEach:Vn(!1,!1)},t={get(s){return Dn(this,s,!1,!0)},get size(){return Bn(this)},has:Fn,add:Ss,set:xs,delete:ks,clear:Ls,forEach:Vn(!1,!0)},n={get(s){return Dn(this,s,!0)},get size(){return Bn(this,!0)},has(s){return Fn.call(this,s,!0)},add:lt("add"),set:lt("set"),delete:lt("delete"),clear:lt("clear"),forEach:Vn(!0,!1)},r={get(s){return Dn(this,s,!0,!0)},get size(){return Bn(this,!0)},has(s){return Fn.call(this,s,!0)},add:lt("add"),set:lt("set"),delete:lt("delete"),clear:lt("clear"),forEach:Vn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Un(s,!1,!1),n[s]=Un(s,!0,!1),t[s]=Un(s,!1,!0),r[s]=Un(s,!0,!0)}),[e,n,t,r]}const[Pc,Cc,Ac,Sc]=Tc();function qo(e,t){const n=t?e?Sc:Ac:e?Cc:Pc;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ne(n,o)&&o in r?n:r,o,s)}const xc={get:qo(!1,!1)},kc={get:qo(!1,!0)},Lc={get:qo(!0,!1)};const cl=new WeakMap,ul=new WeakMap,fl=new WeakMap,Oc=new WeakMap;function Ic(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Hc(e){return e.__v_skip||!Object.isExtensible(e)?0:Ic(tc(e))}function Tt(e){return Xt(e)?e:zo(e,!1,Ec,xc,cl)}function In(e){return zo(e,!1,Rc,kc,ul)}function dl(e){return zo(e,!0,wc,Lc,fl)}function zo(e,t,n,r,o){if(!ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=Hc(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return o.set(e,l),l}function hn(e){return Xt(e)?hn(e.__v_raw):!!(e&&e.__v_isReactive)}function Xt(e){return!!(e&&e.__v_isReadonly)}function nr(e){return!!(e&&e.__v_isShallow)}function hl(e){return e?!!e.__v_raw:!1}function re(e){const t=e&&e.__v_raw;return t?re(t):e}function Mc(e){return Object.isExtensible(e)&&Gi(e,"__v_skip",!0),e}const wn=e=>ce(e)?Tt(e):e,Go=e=>ce(e)?dl(e):e;class pl{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Vo(()=>t(this._value),()=>pn(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=re(this);return(!t._cacheable||t.effect.dirty)&&Et(t._value,t._value=t.effect.run())&&pn(t,4),Jo(t),t.effect._dirtyLevel>=2&&pn(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function Nc(e,t,n=!1){let r,o;const s=X(e);return s?(r=e,o=De):(r=e.get,o=e.set),new pl(r,o,s||!o,n)}function Jo(e){var t;vt&&Lt&&(e=re(e),rl(Lt,(t=e.dep)!=null?t:e.dep=sl(()=>e.dep=void 0,e instanceof pl?e:void 0)))}function pn(e,t=4,n){e=re(e);const r=e.dep;r&&ol(r,t)}function Pe(e){return!!(e&&e.__v_isRef===!0)}function qe(e){return gl(e,!1)}function Rn(e){return gl(e,!0)}function gl(e,t){return Pe(e)?e:new $c(e,t)}class $c{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:re(t),this._value=n?t:wn(t)}get value(){return Jo(this),this._value}set value(t){const n=this.__v_isShallow||nr(t)||Xt(t);t=n?t:re(t),Et(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:wn(t),pn(this,4))}}function ue(e){return Pe(e)?e.value:e}const jc={get:(e,t,n)=>ue(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Pe(o)&&!Pe(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ml(e){return hn(e)?e:new Proxy(e,jc)}class Dc{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Jo(this),()=>pn(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Em(e){return new Dc(e)}function wm(e){const t=G(e)?new Array(e.length):{};for(const n in e)t[n]=yl(e,n);return t}class Fc{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return mc(re(this._object),this._key)}}class Bc{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Vc(e,t,n){return Pe(e)?e:X(e)?new Bc(e):ce(e)&&arguments.length>1?yl(e,t,n):qe(e)}function yl(e,t,n){const r=e[t];return Pe(r)?r:new Fc(e,t,n)}/** +* @vue/runtime-core v3.4.27 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function bt(e,t,n,r){try{return r?e(...r):e()}catch(o){on(o,t,n)}}function Be(e,t,n,r){if(X(e)){const o=bt(e,t,n,r);return o&&Fo(o)&&o.catch(s=>{on(s,t,n)}),o}if(G(e)){const o=[];for(let s=0;s>>1,o=Re[r],s=Pn(o);sXe&&Re.splice(t,1)}function ao(e){G(e)?zt.push(...e):(!dt||!dt.includes(e,e.allowRecurse?kt+1:kt))&&zt.push(e),vl()}function Os(e,t,n=Tn?Xe+1:0){for(;nPn(n)-Pn(r));if(zt.length=0,dt){dt.push(...t);return}for(dt=t,kt=0;kte.id==null?1/0:e.id,qc=(e,t)=>{const n=Pn(e)-Pn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function bl(e){lo=!1,Tn=!0,Re.sort(qc);try{for(Xe=0;Xeme(g)?g.trim():g)),f&&(o=n.map(oc))}let l,a=r[l=xr(t)]||r[l=xr(Ze(t))];!a&&s&&(a=r[l=xr(rn(t))]),a&&Be(a,e,6,o);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Be(u,e,6,o)}}function El(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},l=!1;if(!X(e)){const a=u=>{const c=El(u,t,!0);c&&(l=!0,ye(i,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(ce(e)&&r.set(e,null),null):(G(s)?s.forEach(a=>i[a]=null):ye(i,s),ce(e)&&r.set(e,i),i)}function br(e,t){return!e||!Ln(t)?!1:(t=t.slice(2).replace(/Once$/,""),ne(e,t[0].toLowerCase()+t.slice(1))||ne(e,rn(t))||ne(e,t))}let Ee=null,Er=null;function or(e){const t=Ee;return Ee=e,Er=e&&e.type.__scopeId||null,t}function Rm(e){Er=e}function Tm(){Er=null}function Xo(e,t=Ee,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&Ks(-1);const s=or(t);let i;try{i=e(...o)}finally{or(s),r._d&&Ks(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Lr(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:l,emit:a,render:u,renderCache:c,props:f,data:d,setupState:g,ctx:v,inheritAttrs:T}=e,L=or(e);let S,y;try{if(n.shapeFlag&4){const _=o||r,w=_;S=je(u.call(w,_,c,f,g,d,v)),y=l}else{const _=t;S=je(_.length>1?_(f,{attrs:l,slots:i,emit:a}):_(f,null)),y=t.props?l:Jc(l)}}catch(_){yn.length=0,on(_,e,1),S=fe(Te)}let m=S;if(y&&T!==!1){const _=Object.keys(y),{shapeFlag:w}=m;_.length&&w&7&&(s&&_.some(jo)&&(y=Qc(y,s)),m=rt(m,y,!1,!0))}return n.dirs&&(m=rt(m,null,!1,!0),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),S=m,or(L),S}function Gc(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Ln(n))&&((t||(t={}))[n]=e[n]);return t},Qc=(e,t)=>{const n={};for(const r in e)(!jo(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Xc(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:l,patchFlag:a}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?Is(r,i,u):!!i;if(a&8){const c=t.dynamicProps;for(let f=0;fe.__isSuspense;let co=0;const Zc={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,l,a,u){if(e==null)eu(t,n,r,o,s,i,l,a,u);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}tu(e,t,n,r,o,i,l,a,u)}},hydrate:nu,create:es,normalize:ru},Zo=Zc;function Cn(e,t){const n=e.props&&e.props[t];X(n)&&n()}function eu(e,t,n,r,o,s,i,l,a){const{p:u,o:{createElement:c}}=a,f=c("div"),d=e.suspense=es(e,o,r,t,f,n,s,i,l,a);u(null,d.pendingBranch=e.ssContent,f,null,r,d,s,i),d.deps>0?(Cn(e,"onPending"),Cn(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,s,i),Gt(d,e.ssFallback)):d.resolve(!1,!0)}function tu(e,t,n,r,o,s,i,l,{p:a,um:u,o:{createElement:c}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,g=t.ssFallback,{activeBranch:v,pendingBranch:T,isInFallback:L,isHydrating:S}=f;if(T)f.pendingBranch=d,Ke(d,T)?(a(T,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0?f.resolve():L&&(S||(a(v,g,n,r,o,null,s,i,l),Gt(f,g)))):(f.pendingId=co++,S?(f.isHydrating=!1,f.activeBranch=T):u(T,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),L?(a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0?f.resolve():(a(v,g,n,r,o,null,s,i,l),Gt(f,g))):v&&Ke(d,v)?(a(v,d,n,r,o,f,s,i,l),f.resolve(!0)):(a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0&&f.resolve()));else if(v&&Ke(d,v))a(v,d,n,r,o,f,s,i,l),Gt(f,d);else if(Cn(t,"onPending"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=co++,a(null,d,f.hiddenContainer,null,o,f,s,i,l),f.deps<=0)f.resolve();else{const{timeout:y,pendingId:m}=f;y>0?setTimeout(()=>{f.pendingId===m&&f.fallback(g)},y):y===0&&f.fallback(g)}}function es(e,t,n,r,o,s,i,l,a,u,c=!1){const{p:f,m:d,um:g,n:v,o:{parentNode:T,remove:L}}=u;let S;const y=ou(e);y&&t&&t.pendingBranch&&(S=t.pendingId,t.deps++);const m=e.props?Ji(e.props.timeout):void 0,_=s,w={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:co++,timeout:typeof m=="number"?m:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(E=!1,k=!1){const{vnode:A,activeBranch:$,pendingBranch:N,pendingId:Q,effects:H,parentComponent:J,container:le}=w;let ae=!1;w.isHydrating?w.isHydrating=!1:E||(ae=$&&N.transition&&N.transition.mode==="out-in",ae&&($.transition.afterLeave=()=>{Q===w.pendingId&&(d(N,le,s===_?v($):s,0),ao(H))}),$&&(T($.el)!==w.hiddenContainer&&(s=v($)),g($,J,w,!0)),ae||d(N,le,s,0)),Gt(w,N),w.pendingBranch=null,w.isInFallback=!1;let V=w.parent,Z=!1;for(;V;){if(V.pendingBranch){V.effects.push(...H),Z=!0;break}V=V.parent}!Z&&!ae&&ao(H),w.effects=[],y&&t&&t.pendingBranch&&S===t.pendingId&&(t.deps--,t.deps===0&&!k&&t.resolve()),Cn(A,"onResolve")},fallback(E){if(!w.pendingBranch)return;const{vnode:k,activeBranch:A,parentComponent:$,container:N,namespace:Q}=w;Cn(k,"onFallback");const H=v(A),J=()=>{w.isInFallback&&(f(null,E,N,H,$,null,Q,l,a),Gt(w,E))},le=E.transition&&E.transition.mode==="out-in";le&&(A.transition.afterLeave=J),w.isInFallback=!0,g(A,$,null,!0),le||J()},move(E,k,A){w.activeBranch&&d(w.activeBranch,E,k,A),w.container=E},next(){return w.activeBranch&&v(w.activeBranch)},registerDep(E,k){const A=!!w.pendingBranch;A&&w.deps++;const $=E.vnode.el;E.asyncDep.catch(N=>{on(N,E,0)}).then(N=>{if(E.isUnmounted||w.isUnmounted||w.pendingId!==E.suspenseId)return;E.asyncResolved=!0;const{vnode:Q}=E;_o(E,N,!1),$&&(Q.el=$);const H=!$&&E.subTree.el;k(E,Q,T($||E.subTree.el),$?null:v(E.subTree),w,i,a),H&&L(H),Yo(E,Q.el),A&&--w.deps===0&&w.resolve()})},unmount(E,k){w.isUnmounted=!0,w.activeBranch&&g(w.activeBranch,n,E,k),w.pendingBranch&&g(w.pendingBranch,n,E,k)}};return w}function nu(e,t,n,r,o,s,i,l,a){const u=t.suspense=es(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,l,!0),c=a(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(!1,!0),c}function ru(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Ms(r?n.default:n),e.ssFallback=r?Ms(n.fallback):fe(Te)}function Ms(e){let t;if(X(e)){const n=Zt&&e._c;n&&(e._d=!1,Ye()),e=e(),n&&(e._d=!0,t=Fe,Xl())}return G(e)&&(e=Gc(e)),e=je(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Cl(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):ao(e)}function Gt(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Yo(r,o))}function ou(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const su=Symbol.for("v-scx"),iu=()=>Se(su);function Cm(e,t){return ts(e,null,t)}const Wn={};function Jt(e,t,n){return ts(e,t,n)}function ts(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:l}=pe){if(t&&s){const E=t;t=(...k)=>{E(...k),w()}}const a=_e,u=E=>r===!0?E:Vt(E,r===!1?1:void 0);let c,f=!1,d=!1;if(Pe(e)?(c=()=>e.value,f=nr(e)):hn(e)?(c=()=>u(e),f=!0):G(e)?(d=!0,f=e.some(E=>hn(E)||nr(E)),c=()=>e.map(E=>{if(Pe(E))return E.value;if(hn(E))return u(E);if(X(E))return bt(E,a,2)})):X(e)?t?c=()=>bt(e,a,2):c=()=>(g&&g(),Be(e,a,3,[v])):c=De,t&&r){const E=c;c=()=>Vt(E())}let g,v=E=>{g=m.onStop=()=>{bt(E,a,4),g=m.onStop=void 0}},T;if(Nn)if(v=De,t?n&&Be(t,a,3,[c(),d?[]:void 0,v]):c(),o==="sync"){const E=iu();T=E.__watcherHandles||(E.__watcherHandles=[])}else return De;let L=d?new Array(e.length).fill(Wn):Wn;const S=()=>{if(!(!m.active||!m.dirty))if(t){const E=m.run();(r||f||(d?E.some((k,A)=>Et(k,L[A])):Et(E,L)))&&(g&&g(),Be(t,a,3,[E,L===Wn?void 0:d&&L[0]===Wn?[]:L,v]),L=E)}else m.run()};S.allowRecurse=!!t;let y;o==="sync"?y=S:o==="post"?y=()=>be(S,a&&a.suspense):(S.pre=!0,a&&(S.id=a.uid),y=()=>vr(S));const m=new Vo(c,De,y),_=el(),w=()=>{m.stop(),_&&Do(_.effects,m)};return t?n?S():L=m.run():o==="post"?be(m.run.bind(m),a&&a.suspense):m.run(),T&&T.push(w),w}function lu(e,t,n){const r=this.proxy,o=me(e)?e.includes(".")?Al(r,e):()=>r[e]:e.bind(r,r);let s;X(t)?s=t:(s=t.handler,n=t);const i=Mt(this),l=ts(o,s.bind(r),n);return i(),l}function Al(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{Vt(r,t,n)});else if(zi(e))for(const r in e)Vt(e[r],t,n);return e}function Qe(e,t,n,r){const o=e.dirs,s=t&&t.dirs;for(let i=0;i{e.isMounted=!0}),rs(()=>{e.isUnmounting=!0}),e}const $e=[Function,Array],Sl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$e,onEnter:$e,onAfterEnter:$e,onEnterCancelled:$e,onBeforeLeave:$e,onLeave:$e,onAfterLeave:$e,onLeaveCancelled:$e,onBeforeAppear:$e,onAppear:$e,onAfterAppear:$e,onAppearCancelled:$e},cu={name:"BaseTransition",props:Sl,setup(e,{slots:t}){const n=Mn(),r=au();return()=>{const o=t.default&&kl(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const d of o)if(d.type!==Te){s=d;break}}const i=re(e),{mode:l}=i;if(r.isLeaving)return Or(s);const a=Ns(s);if(!a)return Or(s);const u=uo(a,i,r,n);sr(a,u);const c=n.subTree,f=c&&Ns(c);if(f&&f.type!==Te&&!Ke(a,f)){const d=uo(f,i,r,n);if(sr(f,d),l==="out-in"&&a.type!==Te)return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Or(s);l==="in-out"&&a.type!==Te&&(d.delayLeave=(g,v,T)=>{const L=xl(r,f);L[String(f.key)]=f,g[ht]=()=>{v(),g[ht]=void 0,delete u.delayedLeave},u.delayedLeave=T})}return s}}},uu=cu;function xl(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function uo(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:f,onLeave:d,onAfterLeave:g,onLeaveCancelled:v,onBeforeAppear:T,onAppear:L,onAfterAppear:S,onAppearCancelled:y}=t,m=String(e.key),_=xl(n,e),w=(A,$)=>{A&&Be(A,r,9,$)},E=(A,$)=>{const N=$[1];w(A,$),G(A)?A.every(Q=>Q.length<=1)&&N():A.length<=1&&N()},k={mode:s,persisted:i,beforeEnter(A){let $=l;if(!n.isMounted)if(o)$=T||l;else return;A[ht]&&A[ht](!0);const N=_[m];N&&Ke(e,N)&&N.el[ht]&&N.el[ht](),w($,[A])},enter(A){let $=a,N=u,Q=c;if(!n.isMounted)if(o)$=L||a,N=S||u,Q=y||c;else return;let H=!1;const J=A[Kn]=le=>{H||(H=!0,le?w(Q,[A]):w(N,[A]),k.delayedLeave&&k.delayedLeave(),A[Kn]=void 0)};$?E($,[A,J]):J()},leave(A,$){const N=String(e.key);if(A[Kn]&&A[Kn](!0),n.isUnmounting)return $();w(f,[A]);let Q=!1;const H=A[ht]=J=>{Q||(Q=!0,$(),J?w(v,[A]):w(g,[A]),A[ht]=void 0,_[N]===e&&delete _[N])};_[N]=e,d?E(d,[A,H]):H()},clone(A){return uo(A,t,n,r)}};return k}function Or(e){if(Hn(e))return e=rt(e),e.children=null,e}function Ns(e){if(!Hn(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&X(n.default))return n.default()}}function sr(e,t){e.shapeFlag&6&&e.component?sr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function kl(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function ee(e){X(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:l}=e;let a=null,u,c=0;const f=()=>(c++,a=null,d()),d=()=>{let g;return a||(g=a=t().catch(v=>{if(v=v instanceof Error?v:new Error(String(v)),l)return new Promise((T,L)=>{l(v,()=>T(f()),()=>L(v),c+1)});throw v}).then(v=>g!==a&&a?a:(v&&(v.__esModule||v[Symbol.toStringTag]==="Module")&&(v=v.default),u=v,v)))};return ot({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return u},setup(){const g=_e;if(u)return()=>Ir(u,g);const v=y=>{a=null,on(y,g,13,!r)};if(i&&g.suspense||Nn)return d().then(y=>()=>Ir(y,g)).catch(y=>(v(y),()=>r?fe(r,{error:y}):null));const T=qe(!1),L=qe(),S=qe(!!o);return o&&setTimeout(()=>{S.value=!1},o),s!=null&&setTimeout(()=>{if(!T.value&&!L.value){const y=new Error(`Async component timed out after ${s}ms.`);v(y),L.value=y}},s),d().then(()=>{T.value=!0,g.parent&&Hn(g.parent.vnode)&&(g.parent.effect.dirty=!0,vr(g.parent.update))}).catch(y=>{v(y),L.value=y}),()=>{if(T.value&&u)return Ir(u,g);if(L.value&&r)return fe(r,{error:L.value});if(n&&!S.value)return fe(n)}}})}function Ir(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=fe(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Hn=e=>e.type.__isKeepAlive,fu={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Mn(),r=n.ctx;if(!r.renderer)return()=>{const y=t.default&&t.default();return y&&y.length===1?y[0]:y};const o=new Map,s=new Set;let i=null;const l=n.suspense,{renderer:{p:a,m:u,um:c,o:{createElement:f}}}=r,d=f("div");r.activate=(y,m,_,w,E)=>{const k=y.component;u(y,m,_,0,l),a(k.vnode,y,m,_,k,l,w,y.slotScopeIds,E),be(()=>{k.isDeactivated=!1,k.a&&dn(k.a);const A=y.props&&y.props.onVnodeMounted;A&&ke(A,k.parent,y)},l)},r.deactivate=y=>{const m=y.component;u(y,d,null,1,l),be(()=>{m.da&&dn(m.da);const _=y.props&&y.props.onVnodeUnmounted;_&&ke(_,m.parent,y),m.isDeactivated=!0},l)};function g(y){Hr(y),c(y,n,l,!0)}function v(y){o.forEach((m,_)=>{const w=vo(m.type);w&&(!y||!y(w))&&T(_)})}function T(y){const m=o.get(y);!i||!Ke(m,i)?g(m):i&&Hr(i),o.delete(y),s.delete(y)}Jt(()=>[e.include,e.exclude],([y,m])=>{y&&v(_=>un(y,_)),m&&v(_=>!un(m,_))},{flush:"post",deep:!0});let L=null;const S=()=>{L!=null&&o.set(L,Mr(n.subTree))};return ns(S),Ol(S),rs(()=>{o.forEach(y=>{const{subTree:m,suspense:_}=n,w=Mr(m);if(y.type===w.type&&y.key===w.key){Hr(w);const E=w.component.da;E&&be(E,_);return}g(y)})}),()=>{if(L=null,!t.default)return null;const y=t.default(),m=y[0];if(y.length>1)return i=null,y;if(!en(m)||!(m.shapeFlag&4)&&!(m.shapeFlag&128))return i=null,m;let _=Mr(m);const w=_.type,E=vo(It(_)?_.type.__asyncResolved||{}:w),{include:k,exclude:A,max:$}=e;if(k&&(!E||!un(k,E))||A&&E&&un(A,E))return i=_,m;const N=_.key==null?w:_.key,Q=o.get(N);return _.el&&(_=rt(_),m.shapeFlag&128&&(m.ssContent=_)),L=N,Q?(_.el=Q.el,_.component=Q.component,_.transition&&sr(_,_.transition),_.shapeFlag|=512,s.delete(N),s.add(N)):(s.add(N),$&&s.size>parseInt($,10)&&T(s.values().next().value)),_.shapeFlag|=256,i=_,Pl(m.type)?m:_}}},du=fu;function un(e,t){return G(e)?e.some(n=>un(n,t)):me(e)?e.split(",").includes(t):ec(e)?e.test(t):!1}function hu(e,t){Ll(e,"a",t)}function pu(e,t){Ll(e,"da",t)}function Ll(e,t,n=_e){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(wr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Hn(o.parent.vnode)&&gu(r,t,n,o),o=o.parent}}function gu(e,t,n,r){const o=wr(t,e,r,!0);Il(()=>{Do(r[t],o)},n)}function Hr(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Mr(e){return e.shapeFlag&128?e.ssContent:e}function wr(e,t,n=_e,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;wt();const l=Mt(n),a=Be(t,n,e,i);return l(),Rt(),a});return r?o.unshift(s):o.push(s),s}}const st=e=>(t,n=_e)=>(!Nn||e==="sp")&&wr(e,(...r)=>t(...r),n),mu=st("bm"),ns=st("m"),yu=st("bu"),Ol=st("u"),rs=st("bum"),Il=st("um"),_u=st("sp"),vu=st("rtg"),bu=st("rtc");function Hl(e,t=_e){wr("ec",e,t)}function Am(e,t,n,r){let o;const s=n;if(G(e)||me(e)){o=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,s));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;len(t)?!(t.type===Te||t.type===Ae&&!Ml(t.children)):!0)?e:null}const fo=e=>e?oa(e)?ls(e)||e.proxy:fo(e.parent):null,gn=ye(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>fo(e.parent),$root:e=>fo(e.root),$emit:e=>e.emit,$options:e=>os(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,vr(e.update)}),$nextTick:e=>e.n||(e.n=sn.bind(e.proxy)),$watch:e=>lu.bind(e)}),Nr=(e,t)=>e!==pe&&!e.__isScriptSetup&&ne(e,t),Eu={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:l,appContext:a}=e;let u;if(t[0]!=="$"){const g=i[t];if(g!==void 0)switch(g){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Nr(r,t))return i[t]=1,r[t];if(o!==pe&&ne(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&ne(u,t))return i[t]=3,s[t];if(n!==pe&&ne(n,t))return i[t]=4,n[t];ho&&(i[t]=0)}}const c=gn[t];let f,d;if(c)return t==="$attrs"&&Ie(e.attrs,"get",""),c(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==pe&&ne(n,t))return i[t]=4,n[t];if(d=a.config.globalProperties,ne(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return Nr(o,t)?(o[t]=n,!0):r!==pe&&ne(r,t)?(r[t]=n,!0):ne(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let l;return!!n[i]||e!==pe&&ne(e,i)||Nr(t,i)||(l=s[0])&&ne(l,i)||ne(r,i)||ne(gn,i)||ne(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ne(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function xm(){return wu().slots}function wu(){const e=Mn();return e.setupContext||(e.setupContext=ia(e))}function $s(e){return G(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function km(e){const t=Mn();let n=e();return yo(),Fo(n)&&(n=n.catch(r=>{throw Mt(t),r})),[n,()=>Mt(t)]}let ho=!0;function Ru(e){const t=os(e),n=e.proxy,r=e.ctx;ho=!1,t.beforeCreate&&js(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:u,created:c,beforeMount:f,mounted:d,beforeUpdate:g,updated:v,activated:T,deactivated:L,beforeDestroy:S,beforeUnmount:y,destroyed:m,unmounted:_,render:w,renderTracked:E,renderTriggered:k,errorCaptured:A,serverPrefetch:$,expose:N,inheritAttrs:Q,components:H,directives:J,filters:le}=t;if(u&&Tu(u,r,null),i)for(const Z in i){const W=i[Z];X(W)&&(r[Z]=W.bind(n))}if(o){const Z=o.call(n,n);ce(Z)&&(e.data=Tt(Z))}if(ho=!0,s)for(const Z in s){const W=s[Z],Ve=X(W)?W.bind(n,n):X(W.get)?W.get.bind(n,n):De,it=!X(W)&&X(W.set)?W.set.bind(n):De,Ge=Le({get:Ve,set:it});Object.defineProperty(r,Z,{enumerable:!0,configurable:!0,get:()=>Ge.value,set:xe=>Ge.value=xe})}if(l)for(const Z in l)Nl(l[Z],r,n,Z);if(a){const Z=X(a)?a.call(n):a;Reflect.ownKeys(Z).forEach(W=>{Ht(W,Z[W])})}c&&js(c,e,"c");function V(Z,W){G(W)?W.forEach(Ve=>Z(Ve.bind(n))):W&&Z(W.bind(n))}if(V(mu,f),V(ns,d),V(yu,g),V(Ol,v),V(hu,T),V(pu,L),V(Hl,A),V(bu,E),V(vu,k),V(rs,y),V(Il,_),V(_u,$),G(N))if(N.length){const Z=e.exposed||(e.exposed={});N.forEach(W=>{Object.defineProperty(Z,W,{get:()=>n[W],set:Ve=>n[W]=Ve})})}else e.exposed||(e.exposed={});w&&e.render===De&&(e.render=w),Q!=null&&(e.inheritAttrs=Q),H&&(e.components=H),J&&(e.directives=J)}function Tu(e,t,n=De){G(e)&&(e=po(e));for(const r in e){const o=e[r];let s;ce(o)?"default"in o?s=Se(o.from||r,o.default,!0):s=Se(o.from||r):s=Se(o),Pe(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function js(e,t,n){Be(G(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Nl(e,t,n,r){const o=r.includes(".")?Al(n,r):()=>n[r];if(me(e)){const s=t[e];X(s)&&Jt(o,s)}else if(X(e))Jt(o,e.bind(n));else if(ce(e))if(G(e))e.forEach(s=>Nl(s,t,n,r));else{const s=X(e.handler)?e.handler.bind(n):t[e.handler];X(s)&&Jt(o,s,e)}}function os(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,l=s.get(t);let a;return l?a=l:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(u=>ir(a,u,i,!0)),ir(a,t,i)),ce(t)&&s.set(t,a),a}function ir(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&ir(e,s,n,!0),o&&o.forEach(i=>ir(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Pu[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Pu={data:Ds,props:Fs,emits:Fs,methods:fn,computed:fn,beforeCreate:Ce,created:Ce,beforeMount:Ce,mounted:Ce,beforeUpdate:Ce,updated:Ce,beforeDestroy:Ce,beforeUnmount:Ce,destroyed:Ce,unmounted:Ce,activated:Ce,deactivated:Ce,errorCaptured:Ce,serverPrefetch:Ce,components:fn,directives:fn,watch:Au,provide:Ds,inject:Cu};function Ds(e,t){return t?e?function(){return ye(X(e)?e.call(this,this):e,X(t)?t.call(this,this):t)}:t:e}function Cu(e,t){return fn(po(e),po(t))}function po(e){if(G(e)){const t={};for(let n=0;n1)return n&&X(t)?t.call(r&&r.proxy):t}}function jl(){return!!(_e||Ee||Qt)}const Dl={},Fl=()=>Object.create(Dl),Bl=e=>Object.getPrototypeOf(e)===Dl;function ku(e,t,n,r=!1){const o={},s=Fl();e.propsDefaults=Object.create(null),Vl(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:In(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Lu(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,l=re(o),[a]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[d,g]=Ul(f,t,!0);ye(i,d),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!a)return ce(e)&&r.set(e,Wt),Wt;if(G(s))for(let c=0;c-1,g[1]=T<0||v-1||ne(g,"default"))&&l.push(f)}}}const u=[i,l];return ce(e)&&r.set(e,u),u}function Bs(e){return e[0]!=="$"&&!qt(e)}function Vs(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Us(e,t){return Vs(e)===Vs(t)}function Ws(e,t){return G(t)?t.findIndex(n=>Us(n,e)):X(t)&&Us(t,e)?0:-1}const Wl=e=>e[0]==="_"||e==="$stable",ss=e=>G(e)?e.map(je):[je(e)],Ou=(e,t,n)=>{if(t._n)return t;const r=Xo((...o)=>ss(t(...o)),n);return r._c=!1,r},Kl=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Wl(o))continue;const s=e[o];if(X(s))t[o]=Ou(o,s,r);else if(s!=null){const i=ss(s);t[o]=()=>i}}},ql=(e,t)=>{const n=ss(t);e.slots.default=()=>n},Iu=(e,t)=>{const n=e.slots=Fl();if(e.vnode.shapeFlag&32){const r=t._;r?(ye(n,t),Gi(n,"_",r,!0)):Kl(t,n)}else t&&ql(e,t)},Hu=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=pe;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(ye(o,t),!n&&l===1&&delete o._):(s=!t.$stable,Kl(t,o)),i=t}else t&&(ql(e,t),i={default:1});if(s)for(const l in o)!Wl(l)&&i[l]==null&&delete o[l]};function lr(e,t,n,r,o=!1){if(G(e)){e.forEach((d,g)=>lr(d,t&&(G(t)?t[g]:t),n,r,o));return}if(It(r)&&!o)return;const s=r.shapeFlag&4?ls(r.component)||r.component.proxy:r.el,i=o?null:s,{i:l,r:a}=e,u=t&&t.r,c=l.refs===pe?l.refs={}:l.refs,f=l.setupState;if(u!=null&&u!==a&&(me(u)?(c[u]=null,ne(f,u)&&(f[u]=null)):Pe(u)&&(u.value=null)),X(a))bt(a,l,12,[i,c]);else{const d=me(a),g=Pe(a);if(d||g){const v=()=>{if(e.f){const T=d?ne(f,a)?f[a]:c[a]:a.value;o?G(T)&&Do(T,s):G(T)?T.includes(s)||T.push(s):d?(c[a]=[s],ne(f,a)&&(f[a]=c[a])):(a.value=[s],e.k&&(c[e.k]=a.value))}else d?(c[a]=i,ne(f,a)&&(f[a]=i)):g&&(a.value=i,e.k&&(c[e.k]=i))};i?(v.id=-1,be(v,n)):v()}}}let at=!1;const Mu=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Nu=e=>e.namespaceURI.includes("MathML"),qn=e=>{if(Mu(e))return"svg";if(Nu(e))return"mathml"},zn=e=>e.nodeType===8;function $u(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:l,insert:a,createComment:u}}=e,c=(m,_)=>{if(!_.hasChildNodes()){n(null,m,_),rr(),_._vnode=m;return}at=!1,f(_.firstChild,m,null,null,null),rr(),_._vnode=m,at&&console.error("Hydration completed but contains mismatches.")},f=(m,_,w,E,k,A=!1)=>{A=A||!!_.dynamicChildren;const $=zn(m)&&m.data==="[",N=()=>T(m,_,w,E,k,$),{type:Q,ref:H,shapeFlag:J,patchFlag:le}=_;let ae=m.nodeType;_.el=m,le===-2&&(A=!1,_.dynamicChildren=null);let V=null;switch(Q){case Yt:ae!==3?_.children===""?(a(_.el=o(""),i(m),m),V=m):V=N():(m.data!==_.children&&(at=!0,m.data=_.children),V=s(m));break;case Te:y(m)?(V=s(m),S(_.el=m.content.firstChild,m,w)):ae!==8||$?V=N():V=s(m);break;case mn:if($&&(m=s(m),ae=m.nodeType),ae===1||ae===3){V=m;const Z=!_.children.length;for(let W=0;W<_.staticCount;W++)Z&&(_.children+=V.nodeType===1?V.outerHTML:V.data),W===_.staticCount-1&&(_.anchor=V),V=s(V);return $?s(V):V}else N();break;case Ae:$?V=v(m,_,w,E,k,A):V=N();break;default:if(J&1)(ae!==1||_.type.toLowerCase()!==m.tagName.toLowerCase())&&!y(m)?V=N():V=d(m,_,w,E,k,A);else if(J&6){_.slotScopeIds=k;const Z=i(m);if($?V=L(m):zn(m)&&m.data==="teleport start"?V=L(m,m.data,"teleport end"):V=s(m),t(_,Z,null,w,E,qn(Z),A),It(_)){let W;$?(W=fe(Ae),W.anchor=V?V.previousSibling:Z.lastChild):W=m.nodeType===3?na(""):fe("div"),W.el=m,_.component.subTree=W}}else J&64?ae!==8?V=N():V=_.type.hydrate(m,_,w,E,k,A,e,g):J&128&&(V=_.type.hydrate(m,_,w,E,qn(i(m)),k,A,e,f))}return H!=null&&lr(H,null,E,_),V},d=(m,_,w,E,k,A)=>{A=A||!!_.dynamicChildren;const{type:$,props:N,patchFlag:Q,shapeFlag:H,dirs:J,transition:le}=_,ae=$==="input"||$==="option";if(ae||Q!==-1){J&&Qe(_,null,w,"created");let V=!1;if(y(m)){V=Gl(E,le)&&w&&w.vnode.props&&w.vnode.props.appear;const W=m.content.firstChild;V&&le.beforeEnter(W),S(W,m,w),_.el=m=W}if(H&16&&!(N&&(N.innerHTML||N.textContent))){let W=g(m.firstChild,_,m,w,E,k,A);for(;W;){at=!0;const Ve=W;W=W.nextSibling,l(Ve)}}else H&8&&m.textContent!==_.children&&(at=!0,m.textContent=_.children);if(N)if(ae||!A||Q&48)for(const W in N)(ae&&(W.endsWith("value")||W==="indeterminate")||Ln(W)&&!qt(W)||W[0]===".")&&r(m,W,null,N[W],void 0,void 0,w);else N.onClick&&r(m,"onClick",null,N.onClick,void 0,void 0,w);let Z;(Z=N&&N.onVnodeBeforeMount)&&ke(Z,w,_),J&&Qe(_,null,w,"beforeMount"),((Z=N&&N.onVnodeMounted)||J||V)&&Cl(()=>{Z&&ke(Z,w,_),V&&le.enter(m),J&&Qe(_,null,w,"mounted")},E)}return m.nextSibling},g=(m,_,w,E,k,A,$)=>{$=$||!!_.dynamicChildren;const N=_.children,Q=N.length;for(let H=0;H{const{slotScopeIds:$}=_;$&&(k=k?k.concat($):$);const N=i(m),Q=g(s(m),_,N,w,E,k,A);return Q&&zn(Q)&&Q.data==="]"?s(_.anchor=Q):(at=!0,a(_.anchor=u("]"),N,Q),Q)},T=(m,_,w,E,k,A)=>{if(at=!0,_.el=null,A){const Q=L(m);for(;;){const H=s(m);if(H&&H!==Q)l(H);else break}}const $=s(m),N=i(m);return l(m),n(null,_,N,$,w,E,qn(N),k),$},L=(m,_="[",w="]")=>{let E=0;for(;m;)if(m=s(m),m&&zn(m)&&(m.data===_&&E++,m.data===w)){if(E===0)return s(m);E--}return m},S=(m,_,w)=>{const E=_.parentNode;E&&E.replaceChild(m,_);let k=w;for(;k;)k.vnode.el===_&&(k.vnode.el=k.subTree.el=m),k=k.parent},y=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[c,f]}const be=Cl;function ju(e){return zl(e)}function Du(e){return zl(e,$u)}function zl(e,t){const n=Qi();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:l,createComment:a,setText:u,setElementText:c,parentNode:f,nextSibling:d,setScopeId:g=De,insertStaticContent:v}=e,T=(h,p,b,C=null,R=null,I=null,D=void 0,O=null,M=!!p.dynamicChildren)=>{if(h===p)return;h&&!Ke(h,p)&&(C=P(h),xe(h,R,I,!0),h=null),p.patchFlag===-2&&(M=!1,p.dynamicChildren=null);const{type:x,ref:B,shapeFlag:q}=p;switch(x){case Yt:L(h,p,b,C);break;case Te:S(h,p,b,C);break;case mn:h==null&&y(p,b,C,D);break;case Ae:H(h,p,b,C,R,I,D,O,M);break;default:q&1?w(h,p,b,C,R,I,D,O,M):q&6?J(h,p,b,C,R,I,D,O,M):(q&64||q&128)&&x.process(h,p,b,C,R,I,D,O,M,U)}B!=null&&R&&lr(B,h&&h.ref,I,p||h,!p)},L=(h,p,b,C)=>{if(h==null)r(p.el=l(p.children),b,C);else{const R=p.el=h.el;p.children!==h.children&&u(R,p.children)}},S=(h,p,b,C)=>{h==null?r(p.el=a(p.children||""),b,C):p.el=h.el},y=(h,p,b,C)=>{[h.el,h.anchor]=v(h.children,p,b,C,h.el,h.anchor)},m=({el:h,anchor:p},b,C)=>{let R;for(;h&&h!==p;)R=d(h),r(h,b,C),h=R;r(p,b,C)},_=({el:h,anchor:p})=>{let b;for(;h&&h!==p;)b=d(h),o(h),h=b;o(p)},w=(h,p,b,C,R,I,D,O,M)=>{p.type==="svg"?D="svg":p.type==="math"&&(D="mathml"),h==null?E(p,b,C,R,I,D,O,M):$(h,p,R,I,D,O,M)},E=(h,p,b,C,R,I,D,O)=>{let M,x;const{props:B,shapeFlag:q,transition:K,dirs:Y}=h;if(M=h.el=i(h.type,I,B&&B.is,B),q&8?c(M,h.children):q&16&&A(h.children,M,null,C,R,$r(h,I),D,O),Y&&Qe(h,null,C,"created"),k(M,h,h.scopeId,D,C),B){for(const ie in B)ie!=="value"&&!qt(ie)&&s(M,ie,null,B[ie],I,h.children,C,R,we);"value"in B&&s(M,"value",null,B.value,I),(x=B.onVnodeBeforeMount)&&ke(x,C,h)}Y&&Qe(h,null,C,"beforeMount");const te=Gl(R,K);te&&K.beforeEnter(M),r(M,p,b),((x=B&&B.onVnodeMounted)||te||Y)&&be(()=>{x&&ke(x,C,h),te&&K.enter(M),Y&&Qe(h,null,C,"mounted")},R)},k=(h,p,b,C,R)=>{if(b&&g(h,b),C)for(let I=0;I{for(let x=M;x{const O=p.el=h.el;let{patchFlag:M,dynamicChildren:x,dirs:B}=p;M|=h.patchFlag&16;const q=h.props||pe,K=p.props||pe;let Y;if(b&&Ct(b,!1),(Y=K.onVnodeBeforeUpdate)&&ke(Y,b,p,h),B&&Qe(p,h,b,"beforeUpdate"),b&&Ct(b,!0),x?N(h.dynamicChildren,x,O,b,C,$r(p,R),I):D||W(h,p,O,null,b,C,$r(p,R),I,!1),M>0){if(M&16)Q(O,p,q,K,b,C,R);else if(M&2&&q.class!==K.class&&s(O,"class",null,K.class,R),M&4&&s(O,"style",q.style,K.style,R),M&8){const te=p.dynamicProps;for(let ie=0;ie{Y&&ke(Y,b,p,h),B&&Qe(p,h,b,"updated")},C)},N=(h,p,b,C,R,I,D)=>{for(let O=0;O{if(b!==C){if(b!==pe)for(const O in b)!qt(O)&&!(O in C)&&s(h,O,b[O],null,D,p.children,R,I,we);for(const O in C){if(qt(O))continue;const M=C[O],x=b[O];M!==x&&O!=="value"&&s(h,O,x,M,D,p.children,R,I,we)}"value"in C&&s(h,"value",b.value,C.value,D)}},H=(h,p,b,C,R,I,D,O,M)=>{const x=p.el=h?h.el:l(""),B=p.anchor=h?h.anchor:l("");let{patchFlag:q,dynamicChildren:K,slotScopeIds:Y}=p;Y&&(O=O?O.concat(Y):Y),h==null?(r(x,b,C),r(B,b,C),A(p.children||[],b,B,R,I,D,O,M)):q>0&&q&64&&K&&h.dynamicChildren?(N(h.dynamicChildren,K,b,R,I,D,O),(p.key!=null||R&&p===R.subTree)&&Jl(h,p,!0)):W(h,p,b,B,R,I,D,O,M)},J=(h,p,b,C,R,I,D,O,M)=>{p.slotScopeIds=O,h==null?p.shapeFlag&512?R.ctx.activate(p,b,C,D,M):le(p,b,C,R,I,D,M):ae(h,p,M)},le=(h,p,b,C,R,I,D)=>{const O=h.component=qu(h,C,R);if(Hn(h)&&(O.ctx.renderer=U),zu(O),O.asyncDep){if(R&&R.registerDep(O,V),!h.el){const M=O.subTree=fe(Te);S(null,M,p,b)}}else V(O,h,p,b,R,I,D)},ae=(h,p,b)=>{const C=p.component=h.component;if(Xc(h,p,b))if(C.asyncDep&&!C.asyncResolved){Z(C,p,b);return}else C.next=p,Kc(C.update),C.effect.dirty=!0,C.update();else p.el=h.el,C.vnode=p},V=(h,p,b,C,R,I,D)=>{const O=()=>{if(h.isMounted){let{next:B,bu:q,u:K,parent:Y,vnode:te}=h;{const Ft=Ql(h);if(Ft){B&&(B.el=te.el,Z(h,B,D)),Ft.asyncDep.then(()=>{h.isUnmounted||O()});return}}let ie=B,he;Ct(h,!1),B?(B.el=te.el,Z(h,B,D)):B=te,q&&dn(q),(he=B.props&&B.props.onVnodeBeforeUpdate)&&ke(he,Y,B,te),Ct(h,!0);const ve=Lr(h),Ue=h.subTree;h.subTree=ve,T(Ue,ve,f(Ue.el),P(Ue),h,R,I),B.el=ve.el,ie===null&&Yo(h,ve.el),K&&be(K,R),(he=B.props&&B.props.onVnodeUpdated)&&be(()=>ke(he,Y,B,te),R)}else{let B;const{el:q,props:K}=p,{bm:Y,m:te,parent:ie}=h,he=It(p);if(Ct(h,!1),Y&&dn(Y),!he&&(B=K&&K.onVnodeBeforeMount)&&ke(B,ie,p),Ct(h,!0),q&&de){const ve=()=>{h.subTree=Lr(h),de(q,h.subTree,h,R,null)};he?p.type.__asyncLoader().then(()=>!h.isUnmounted&&ve()):ve()}else{const ve=h.subTree=Lr(h);T(null,ve,b,C,h,R,I),p.el=ve.el}if(te&&be(te,R),!he&&(B=K&&K.onVnodeMounted)){const ve=p;be(()=>ke(B,ie,ve),R)}(p.shapeFlag&256||ie&&It(ie.vnode)&&ie.vnode.shapeFlag&256)&&h.a&&be(h.a,R),h.isMounted=!0,p=b=C=null}},M=h.effect=new Vo(O,De,()=>vr(x),h.scope),x=h.update=()=>{M.dirty&&M.run()};x.id=h.uid,Ct(h,!0),x()},Z=(h,p,b)=>{p.component=h;const C=h.vnode.props;h.vnode=p,h.next=null,Lu(h,p.props,C,b),Hu(h,p.children,b),wt(),Os(h),Rt()},W=(h,p,b,C,R,I,D,O,M=!1)=>{const x=h&&h.children,B=h?h.shapeFlag:0,q=p.children,{patchFlag:K,shapeFlag:Y}=p;if(K>0){if(K&128){it(x,q,b,C,R,I,D,O,M);return}else if(K&256){Ve(x,q,b,C,R,I,D,O,M);return}}Y&8?(B&16&&we(x,R,I),q!==x&&c(b,q)):B&16?Y&16?it(x,q,b,C,R,I,D,O,M):we(x,R,I,!0):(B&8&&c(b,""),Y&16&&A(q,b,C,R,I,D,O,M))},Ve=(h,p,b,C,R,I,D,O,M)=>{h=h||Wt,p=p||Wt;const x=h.length,B=p.length,q=Math.min(x,B);let K;for(K=0;KB?we(h,R,I,!0,!1,q):A(p,b,C,R,I,D,O,M,q)},it=(h,p,b,C,R,I,D,O,M)=>{let x=0;const B=p.length;let q=h.length-1,K=B-1;for(;x<=q&&x<=K;){const Y=h[x],te=p[x]=M?pt(p[x]):je(p[x]);if(Ke(Y,te))T(Y,te,b,null,R,I,D,O,M);else break;x++}for(;x<=q&&x<=K;){const Y=h[q],te=p[K]=M?pt(p[K]):je(p[K]);if(Ke(Y,te))T(Y,te,b,null,R,I,D,O,M);else break;q--,K--}if(x>q){if(x<=K){const Y=K+1,te=YK)for(;x<=q;)xe(h[x],R,I,!0),x++;else{const Y=x,te=x,ie=new Map;for(x=te;x<=K;x++){const He=p[x]=M?pt(p[x]):je(p[x]);He.key!=null&&ie.set(He.key,x)}let he,ve=0;const Ue=K-te+1;let Ft=!1,Es=0;const ln=new Array(Ue);for(x=0;x=Ue){xe(He,R,I,!0);continue}let Je;if(He.key!=null)Je=ie.get(He.key);else for(he=te;he<=K;he++)if(ln[he-te]===0&&Ke(He,p[he])){Je=he;break}Je===void 0?xe(He,R,I,!0):(ln[Je-te]=x+1,Je>=Es?Es=Je:Ft=!0,T(He,p[Je],b,null,R,I,D,O,M),ve++)}const ws=Ft?Fu(ln):Wt;for(he=ws.length-1,x=Ue-1;x>=0;x--){const He=te+x,Je=p[He],Rs=He+1{const{el:I,type:D,transition:O,children:M,shapeFlag:x}=h;if(x&6){Ge(h.component.subTree,p,b,C);return}if(x&128){h.suspense.move(p,b,C);return}if(x&64){D.move(h,p,b,U);return}if(D===Ae){r(I,p,b);for(let q=0;qO.enter(I),R);else{const{leave:q,delayLeave:K,afterLeave:Y}=O,te=()=>r(I,p,b),ie=()=>{q(I,()=>{te(),Y&&Y()})};K?K(I,te,ie):ie()}else r(I,p,b)},xe=(h,p,b,C=!1,R=!1)=>{const{type:I,props:D,ref:O,children:M,dynamicChildren:x,shapeFlag:B,patchFlag:q,dirs:K}=h;if(O!=null&&lr(O,null,b,h,!0),B&256){p.ctx.deactivate(h);return}const Y=B&1&&K,te=!It(h);let ie;if(te&&(ie=D&&D.onVnodeBeforeUnmount)&&ke(ie,p,h),B&6)jn(h.component,b,C);else{if(B&128){h.suspense.unmount(b,C);return}Y&&Qe(h,null,p,"beforeUnmount"),B&64?h.type.remove(h,p,b,R,U,C):x&&(I!==Ae||q>0&&q&64)?we(x,p,b,!1,!0):(I===Ae&&q&384||!R&&B&16)&&we(M,p,b),C&&jt(h)}(te&&(ie=D&&D.onVnodeUnmounted)||Y)&&be(()=>{ie&&ke(ie,p,h),Y&&Qe(h,null,p,"unmounted")},b)},jt=h=>{const{type:p,el:b,anchor:C,transition:R}=h;if(p===Ae){Dt(b,C);return}if(p===mn){_(h);return}const I=()=>{o(b),R&&!R.persisted&&R.afterLeave&&R.afterLeave()};if(h.shapeFlag&1&&R&&!R.persisted){const{leave:D,delayLeave:O}=R,M=()=>D(b,I);O?O(h.el,I,M):M()}else I()},Dt=(h,p)=>{let b;for(;h!==p;)b=d(h),o(h),h=b;o(p)},jn=(h,p,b)=>{const{bum:C,scope:R,update:I,subTree:D,um:O}=h;C&&dn(C),R.stop(),I&&(I.active=!1,xe(D,h,p,b)),O&&be(O,p),be(()=>{h.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},we=(h,p,b,C=!1,R=!1,I=0)=>{for(let D=I;Dh.shapeFlag&6?P(h.component.subTree):h.shapeFlag&128?h.suspense.next():d(h.anchor||h.el);let F=!1;const j=(h,p,b)=>{h==null?p._vnode&&xe(p._vnode,null,null,!0):T(p._vnode||null,h,p,null,null,null,b),F||(F=!0,Os(),rr(),F=!1),p._vnode=h},U={p:T,um:xe,m:Ge,r:jt,mt:le,mc:A,pc:W,pbc:N,n:P,o:e};let oe,de;return t&&([oe,de]=t(U)),{render:j,hydrate:oe,createApp:xu(j,oe)}}function $r({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Ct({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Gl(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Jl(e,t,n=!1){const r=e.children,o=t.children;if(G(r)&&G(o))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}function Ql(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ql(t)}const Bu=e=>e.__isTeleport,Ae=Symbol.for("v-fgt"),Yt=Symbol.for("v-txt"),Te=Symbol.for("v-cmt"),mn=Symbol.for("v-stc"),yn=[];let Fe=null;function Ye(e=!1){yn.push(Fe=e?null:[])}function Xl(){yn.pop(),Fe=yn[yn.length-1]||null}let Zt=1;function Ks(e){Zt+=e}function Yl(e){return e.dynamicChildren=Zt>0?Fe||Wt:null,Xl(),Zt>0&&Fe&&Fe.push(e),e}function Vu(e,t,n,r,o,s){return Yl(ea(e,t,n,r,o,s,!0))}function yt(e,t,n,r,o){return Yl(fe(e,t,n,r,o,!0))}function en(e){return e?e.__v_isVNode===!0:!1}function Ke(e,t){return e.type===t.type&&e.key===t.key}const Zl=({key:e})=>e??null,Qn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?me(e)||Pe(e)||X(e)?{i:Ee,r:e,k:t,f:!!n}:e:null);function ea(e,t=null,n=null,r=0,o=null,s=e===Ae?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Zl(t),ref:t&&Qn(t),scopeId:Er,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ee};return l?(is(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=me(n)?8:16),Zt>0&&!i&&Fe&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&Fe.push(a),a}const fe=Uu;function Uu(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Rl)&&(e=Te),en(e)){const l=rt(e,t,!0);return n&&is(l,n),Zt>0&&!s&&Fe&&(l.shapeFlag&6?Fe[Fe.indexOf(e)]=l:Fe.push(l)),l.patchFlag|=-2,l}if(Qu(e)&&(e=e.__vccOpts),t){t=ta(t);let{class:l,style:a}=t;l&&!me(l)&&(t.class=yr(l)),ce(a)&&(hl(a)&&!G(a)&&(a=ye({},a)),t.style=mr(a))}const i=me(e)?1:Pl(e)?128:Bu(e)?64:ce(e)?4:X(e)?2:0;return ea(e,t,n,r,o,i,s,!0)}function ta(e){return e?hl(e)||Bl(e)?ye({},e):e:null}function rt(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:l,transition:a}=e,u=t?ra(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Zl(u),ref:t&&t.ref?n&&s?G(s)?s.concat(Qn(t)):[s,Qn(t)]:Qn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ae?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&rt(e.ssContent),ssFallback:e.ssFallback&&rt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&r&&(c.transition=a.clone(c)),c}function na(e=" ",t=0){return fe(Yt,null,e,t)}function Lm(e,t){const n=fe(mn,null,e);return n.staticCount=t,n}function Om(e="",t=!1){return t?(Ye(),yt(Te,null,e)):fe(Te,null,e)}function je(e){return e==null||typeof e=="boolean"?fe(Te):G(e)?fe(Ae,null,e.slice()):typeof e=="object"?pt(e):fe(Yt,null,String(e))}function pt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:rt(e)}function is(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),is(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!Bl(t)?t._ctx=Ee:o===3&&Ee&&(Ee.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else X(t)?(t={default:t,_ctx:Ee},n=32):(t=String(t),r&64?(n=16,t=[na(t)]):n=8);e.children=t,e.shapeFlag|=n}function ra(...e){const t={};for(let n=0;n_e||Ee;let ar,mo;{const e=Qi(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};ar=t("__VUE_INSTANCE_SETTERS__",n=>_e=n),mo=t("__VUE_SSR_SETTERS__",n=>Nn=n)}const Mt=e=>{const t=_e;return ar(e),e.scope.on(),()=>{e.scope.off(),ar(t)}},yo=()=>{_e&&_e.scope.off(),ar(null)};function oa(e){return e.vnode.shapeFlag&4}let Nn=!1;function zu(e,t=!1){t&&mo(t);const{props:n,children:r}=e.vnode,o=oa(e);ku(e,n,o,t),Iu(e,r);const s=o?Gu(e,t):void 0;return t&&mo(!1),s}function Gu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Eu);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?ia(e):null,s=Mt(e);wt();const i=bt(r,e,0,[e.props,o]);if(Rt(),s(),Fo(i)){if(i.then(yo,yo),t)return i.then(l=>{_o(e,l,t)}).catch(l=>{on(l,e,0)});e.asyncDep=i}else _o(e,i,t)}else sa(e,t)}function _o(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ce(t)&&(e.setupState=ml(t)),sa(e,n)}let qs;function sa(e,t,n){const r=e.type;if(!e.render){if(!t&&qs&&!r.render){const o=r.template||os(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,u=ye(ye({isCustomElement:s,delimiters:l},i),a);r.render=qs(o,u)}}e.render=r.render||De}{const o=Mt(e);wt();try{Ru(e)}finally{Rt(),o()}}}const Ju={get(e,t){return Ie(e,"get",""),e[t]}};function ia(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Ju),slots:e.slots,emit:e.emit,expose:t}}function ls(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ml(Mc(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in gn)return gn[n](e)},has(t,n){return n in t||n in gn}}))}function vo(e,t=!0){return X(e)?e.displayName||e.name:e.name||t&&e.__name}function Qu(e){return X(e)&&"__vccOpts"in e}const Le=(e,t)=>Nc(e,t,Nn);function Oe(e,t,n){const r=arguments.length;return r===2?ce(t)&&!G(t)?en(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&en(n)&&(n=[n]),fe(e,t,n))}const la="3.4.27";/** +* @vue/runtime-dom v3.4.27 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Xu="http://www.w3.org/2000/svg",Yu="http://www.w3.org/1998/Math/MathML",gt=typeof document<"u"?document:null,zs=gt&>.createElement("template"),Zu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?gt.createElementNS(Xu,e):t==="mathml"?gt.createElementNS(Yu,e):gt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>gt.createTextNode(e),createComment:e=>gt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>gt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{zs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=zs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ct="transition",an="animation",An=Symbol("_vtc"),Rr=(e,{slots:t})=>Oe(uu,ef(e),t);Rr.displayName="Transition";const aa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Rr.props=ye({},Sl,aa);const At=(e,t=[])=>{G(e)?e.forEach(n=>n(...t)):e&&e(...t)},Gs=e=>e?G(e)?e.some(t=>t.length>1):e.length>1:!1;function ef(e){const t={};for(const H in e)H in aa||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=tf(o),T=v&&v[0],L=v&&v[1],{onBeforeEnter:S,onEnter:y,onEnterCancelled:m,onLeave:_,onLeaveCancelled:w,onBeforeAppear:E=S,onAppear:k=y,onAppearCancelled:A=m}=t,$=(H,J,le)=>{St(H,J?c:l),St(H,J?u:i),le&&le()},N=(H,J)=>{H._isLeaving=!1,St(H,f),St(H,g),St(H,d),J&&J()},Q=H=>(J,le)=>{const ae=H?k:y,V=()=>$(J,H,le);At(ae,[J,V]),Js(()=>{St(J,H?a:s),ut(J,H?c:l),Gs(ae)||Qs(J,r,T,V)})};return ye(t,{onBeforeEnter(H){At(S,[H]),ut(H,s),ut(H,i)},onBeforeAppear(H){At(E,[H]),ut(H,a),ut(H,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(H,J){H._isLeaving=!0;const le=()=>N(H,J);ut(H,f),ut(H,d),of(),Js(()=>{H._isLeaving&&(St(H,f),ut(H,g),Gs(_)||Qs(H,r,L,le))}),At(_,[H,le])},onEnterCancelled(H){$(H,!1),At(m,[H])},onAppearCancelled(H){$(H,!0),At(A,[H])},onLeaveCancelled(H){N(H),At(w,[H])}})}function tf(e){if(e==null)return null;if(ce(e))return[jr(e.enter),jr(e.leave)];{const t=jr(e);return[t,t]}}function jr(e){return Ji(e)}function ut(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[An]||(e[An]=new Set)).add(t)}function St(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[An];n&&(n.delete(t),n.size||(e[An]=void 0))}function Js(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let nf=0;function Qs(e,t,n,r){const o=e._endId=++nf,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=rf(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,d),s()},d=g=>{g.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[v]||"").split(", "),o=r(`${ct}Delay`),s=r(`${ct}Duration`),i=Xs(o,s),l=r(`${an}Delay`),a=r(`${an}Duration`),u=Xs(l,a);let c=null,f=0,d=0;t===ct?i>0&&(c=ct,f=i,d=s.length):t===an?u>0&&(c=an,f=u,d=a.length):(f=Math.max(i,u),c=f>0?i>u?ct:an:null,d=c?c===ct?s.length:a.length:0);const g=c===ct&&/\b(transform|all)(,|$)/.test(r(`${ct}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:g}}function Xs(e,t){for(;e.lengthYs(n)+Ys(e[r])))}function Ys(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function of(){return document.body.offsetHeight}function sf(e,t,n){const r=e[An];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Zs=Symbol("_vod"),lf=Symbol("_vsh"),af=Symbol(""),cf=/(^|;)\s*display\s*:/;function uf(e,t,n){const r=e.style,o=me(n);let s=!1;if(n&&!o){if(t)if(me(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Xn(r,l,"")}else for(const i in t)n[i]==null&&Xn(r,i,"");for(const i in n)i==="display"&&(s=!0),Xn(r,i,n[i])}else if(o){if(t!==n){const i=r[af];i&&(n+=";"+i),r.cssText=n,s=cf.test(n)}}else t&&e.removeAttribute("style");Zs in e&&(e[Zs]=s?r.display:"",e[lf]&&(r.display="none"))}const ei=/\s*!important$/;function Xn(e,t,n){if(G(n))n.forEach(r=>Xn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=ff(e,t);ei.test(n)?e.setProperty(rn(r),n.replace(ei,""),"important"):e[r]=n}}const ti=["Webkit","Moz","ms"],Dr={};function ff(e,t){const n=Dr[t];if(n)return n;let r=Ze(t);if(r!=="filter"&&r in e)return Dr[t]=r;r=gr(r);for(let o=0;oFr||(_f.then(()=>Fr=0),Fr=Date.now());function bf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Be(Ef(r,n.value),t,5,[r])};return n.value=e,n.attached=vf(),n}function Ef(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const si=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,wf=(e,t,n,r,o,s,i,l,a)=>{const u=o==="svg";t==="class"?sf(e,r,u):t==="style"?uf(e,n,r):Ln(t)?jo(t)||mf(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Rf(e,t,r,u))?hf(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),df(e,t,r,u))};function Rf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&si(t)&&X(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return si(t)&&me(n)?!1:t in e}const ca=ye({patchProp:wf},Zu);let _n,ii=!1;function Tf(){return _n||(_n=ju(ca))}function Pf(){return _n=ii?_n:Du(ca),ii=!0,_n}const Cf=(...e)=>{const t=Tf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=fa(r);if(!o)return;const s=t._component;!X(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,ua(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},Af=(...e)=>{const t=Pf().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=fa(r);if(o)return n(o,!0,ua(o))},t};function ua(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function fa(e){return me(e)?document.querySelector(e):e}const Sf=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,xf=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,kf=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Lf(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){Of(e);return}return t}function Of(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function cr(e,t={}){if(typeof e!="string")return e;const n=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!kf.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(Sf.test(e)||xf.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Lf)}return JSON.parse(e)}catch(r){if(t.strict)throw r;return e}}const If=/#/g,Hf=/&/g,Mf=/\//g,Nf=/=/g,as=/\+/g,$f=/%5e/gi,jf=/%60/gi,Df=/%7c/gi,Ff=/%20/gi;function Bf(e){return encodeURI(""+e).replace(Df,"|")}function bo(e){return Bf(typeof e=="string"?e:JSON.stringify(e)).replace(as,"%2B").replace(Ff,"+").replace(If,"%23").replace(Hf,"%26").replace(jf,"`").replace($f,"^").replace(Mf,"%2F")}function Br(e){return bo(e).replace(Nf,"%3D")}function ur(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function Vf(e){return ur(e.replace(as," "))}function Uf(e){return ur(e.replace(as," "))}function Wf(e=""){const t={};e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const r=n.match(/([^=]+)=?(.*)/)||[];if(r.length<2)continue;const o=Vf(r[1]);if(o==="__proto__"||o==="constructor")continue;const s=Uf(r[2]||"");t[o]===void 0?t[o]=s:Array.isArray(t[o])?t[o].push(s):t[o]=[t[o],s]}return t}function Kf(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${Br(e)}=${bo(n)}`).join("&"):`${Br(e)}=${bo(t)}`:Br(e)}function qf(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>Kf(t,e[t])).filter(Boolean).join("&")}const zf=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,Gf=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,Jf=/^([/\\]\s*){2,}[^/\\]/,Qf=/^[\s\0]*(blob|data|javascript|vbscript):$/i,Xf=/\/$|\/\?|\/#/,Yf=/^\.?\//;function $t(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?zf.test(e):Gf.test(e)||(t.acceptRelative?Jf.test(e):!1)}function Zf(e){return!!e&&Qf.test(e)}function Eo(e="",t){return t?Xf.test(e):e.endsWith("/")}function cs(e="",t){if(!t)return(Eo(e)?e.slice(0,-1):e)||"/";if(!Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");o>=0&&(n=e.slice(0,o),r=e.slice(o));const[s,...i]=n.split("?");return((s.endsWith("/")?s.slice(0,-1):s)||"/")+(i.length>0?`?${i.join("?")}`:"")+r}function wo(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(Eo(e,!0))return e||"/";let n=e,r="";const o=e.indexOf("#");if(o>=0&&(n=e.slice(0,o),r=e.slice(o),!n))return r;const[s,...i]=n.split("?");return s+"/"+(i.length>0?`?${i.join("?")}`:"")+r}function ed(e=""){return e.startsWith("/")}function li(e=""){return ed(e)?e:"/"+e}function td(e,t){if(ha(t)||$t(e))return e;const n=cs(t);return e.startsWith(n)?e:us(n,e)}function ai(e,t){if(ha(t))return e;const n=cs(t);if(!e.startsWith(n))return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function da(e,t){const n=Tr(e),r={...Wf(n.search),...t};return n.search=qf(r),od(n)}function ha(e){return!e||e==="/"}function nd(e){return e&&e!=="/"}function us(e,...t){let n=e||"";for(const r of t.filter(o=>nd(o)))if(n){const o=r.replace(Yf,"");n=wo(n)+o}else n=r;return n}function pa(...e){var i,l,a,u;const t=/\/(?!\/)/,n=e.filter(Boolean),r=[];let o=0;for(const c of n)if(!(!c||c==="/")){for(const[f,d]of c.split(t).entries())if(!(!d||d===".")){if(d===".."){if(r.length===1&&$t(r[0]))continue;r.pop(),o--;continue}if(f===1&&((i=r[r.length-1])!=null&&i.endsWith(":/"))){r[r.length-1]+="/"+d;continue}r.push(d),o++}}let s=r.join("/");return o>=0?(l=n[0])!=null&&l.startsWith("/")&&!s.startsWith("/")?s="/"+s:(a=n[0])!=null&&a.startsWith("./")&&!s.startsWith("./")&&(s="./"+s):s="../".repeat(-1*o)+s,(u=n[n.length-1])!=null&&u.endsWith("/")&&!s.endsWith("/")&&(s+="/"),s}function rd(e,t,n={}){return n.trailingSlash||(e=wo(e),t=wo(t)),n.leadingSlash||(e=li(e),t=li(t)),n.encoding||(e=ur(e),t=ur(t)),e===t}const ga=Symbol.for("ufo:protocolRelative");function Tr(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,f,d=""]=n;return{protocol:f.toLowerCase(),pathname:d,href:f+d,auth:"",host:"",search:"",hash:""}}if(!$t(e,{acceptRelative:!0}))return t?Tr(t+e):ci(e);const[,r="",o,s=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",l=""]=s.match(/([^#/?]*)(.*)?/)||[],{pathname:a,search:u,hash:c}=ci(l.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:r.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:a,search:u,hash:c,[ga]:!r}}function ci(e=""){const[t="",n="",r=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function od(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",r=e.hash||"",o=e.auth?e.auth+"@":"",s=e.host||"";return(e.protocol||e[ga]?(e.protocol||"")+"//":"")+o+s+t+n+r}class sd extends Error{constructor(t,n){super(t,n),this.name="FetchError",n!=null&&n.cause&&!this.cause&&(this.cause=n.cause)}}function id(e){var a,u,c,f,d;const t=((a=e.error)==null?void 0:a.message)||((u=e.error)==null?void 0:u.toString())||"",n=((c=e.request)==null?void 0:c.method)||((f=e.options)==null?void 0:f.method)||"GET",r=((d=e.request)==null?void 0:d.url)||String(e.request)||"/",o=`[${n}] ${JSON.stringify(r)}`,s=e.response?`${e.response.status} ${e.response.statusText}`:"",i=`${o}: ${s}${t?` ${t}`:""}`,l=new sd(i,e.error?{cause:e.error}:void 0);for(const g of["request","options","response"])Object.defineProperty(l,g,{get(){return e[g]}});for(const[g,v]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(l,g,{get(){return e.response&&e.response[v]}});return l}const ld=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function ui(e="GET"){return ld.has(e.toUpperCase())}function ad(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const cd=new Set(["image/svg","application/xml","application/xhtml","application/html"]),ud=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function fd(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return ud.test(t)?"json":cd.has(t)||t.startsWith("text/")?"text":"blob"}function dd(e,t,n=globalThis.Headers){const r={...t,...e};if(t!=null&&t.params&&(e!=null&&e.params)&&(r.params={...t==null?void 0:t.params,...e==null?void 0:e.params}),t!=null&&t.query&&(e!=null&&e.query)&&(r.query={...t==null?void 0:t.query,...e==null?void 0:e.query}),t!=null&&t.headers&&(e!=null&&e.headers)){r.headers=new n((t==null?void 0:t.headers)||{});for(const[o,s]of new n((e==null?void 0:e.headers)||{}))r.headers.set(o,s)}return r}const hd=new Set([408,409,425,429,500,502,503,504]),pd=new Set([101,204,205,304]);function ma(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function o(l){const a=l.error&&l.error.name==="AbortError"&&!l.options.timeout||!1;if(l.options.retry!==!1&&!a){let c;typeof l.options.retry=="number"?c=l.options.retry:c=ui(l.options.method)?0:1;const f=l.response&&l.response.status||500;if(c>0&&(Array.isArray(l.options.retryStatusCodes)?l.options.retryStatusCodes.includes(f):hd.has(f))){const d=l.options.retryDelay||0;return d>0&&await new Promise(g=>setTimeout(g,d)),s(l.request,{...l.options,retry:c-1})}}const u=id(l);throw Error.captureStackTrace&&Error.captureStackTrace(u,s),u}const s=async function(a,u={}){var g;const c={request:a,options:dd(u,e.defaults,n),response:void 0,error:void 0};c.options.method=(g=c.options.method)==null?void 0:g.toUpperCase(),c.options.onRequest&&await c.options.onRequest(c),typeof c.request=="string"&&(c.options.baseURL&&(c.request=td(c.request,c.options.baseURL)),(c.options.query||c.options.params)&&(c.request=da(c.request,{...c.options.params,...c.options.query}))),c.options.body&&ui(c.options.method)&&(ad(c.options.body)?(c.options.body=typeof c.options.body=="string"?c.options.body:JSON.stringify(c.options.body),c.options.headers=new n(c.options.headers||{}),c.options.headers.has("content-type")||c.options.headers.set("content-type","application/json"),c.options.headers.has("accept")||c.options.headers.set("accept","application/json")):("pipeTo"in c.options.body&&typeof c.options.body.pipeTo=="function"||typeof c.options.body.pipe=="function")&&("duplex"in c.options||(c.options.duplex="half")));let f;if(!c.options.signal&&c.options.timeout){const v=new r;f=setTimeout(()=>v.abort(),c.options.timeout),c.options.signal=v.signal}try{c.response=await t(c.request,c.options)}catch(v){return c.error=v,c.options.onRequestError&&await c.options.onRequestError(c),await o(c)}finally{f&&clearTimeout(f)}if(c.response.body&&!pd.has(c.response.status)&&c.options.method!=="HEAD"){const v=(c.options.parseResponse?"json":c.options.responseType)||fd(c.response.headers.get("content-type")||"");switch(v){case"json":{const T=await c.response.text(),L=c.options.parseResponse||cr;c.response._data=L(T);break}case"stream":{c.response._data=c.response.body;break}default:c.response._data=await c.response[v]()}}return c.options.onResponse&&await c.options.onResponse(c),!c.options.ignoreResponseError&&c.response.status>=400&&c.response.status<600?(c.options.onResponseError&&await c.options.onResponseError(c),await o(c)):c.response},i=async function(a,u){return(await s(a,u))._data};return i.raw=s,i.native=(...l)=>t(...l),i.create=(l={})=>ma({...e,defaults:{...e.defaults,...l}}),i}const fs=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),gd=fs.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),md=fs.Headers,yd=fs.AbortController,_d=ma({fetch:gd,Headers:md,AbortController:yd}),vd=_d,bd=()=>{var e;return((e=window==null?void 0:window.__NUXT__)==null?void 0:e.config)||{}},fr=bd().app,Ed=()=>fr.baseURL,wd=()=>fr.buildAssetsDir,ds=(...e)=>pa(ya(),wd(),...e),ya=(...e)=>{const t=fr.cdnURL||fr.baseURL;return e.length?pa(t,...e):t};globalThis.__buildAssetsURL=ds,globalThis.__publicAssetsURL=ya;globalThis.$fetch||(globalThis.$fetch=vd.create({baseURL:Ed()}));function Ro(e,t={},n){for(const r in e){const o=e[r],s=n?`${n}:${r}`:r;typeof o=="object"&&o!==null?Ro(o,t,s):typeof o=="function"&&(t[s]=o)}return t}const Rd={run:e=>e()},Td=()=>Rd,_a=typeof console.createTask<"u"?console.createTask:Td;function Pd(e,t){const n=t.shift(),r=_a(n);return e.reduce((o,s)=>o.then(()=>r.run(()=>s(...t))),Promise.resolve())}function Cd(e,t){const n=t.shift(),r=_a(n);return Promise.all(e.map(o=>r.run(()=>o(...t))))}function Vr(e,t){for(const n of[...e])n(t)}class Ad{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const o=t;let s;for(;this._deprecatedHooks[t];)s=this._deprecatedHooks[t],t=s.to;if(s&&!r.allowDeprecated){let i=s.message;i||(i=`${o} hook has been deprecated`+(s.to?`, please use ${s.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(i)||(console.warn(i),this._deprecatedMessages.add(i))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,o=(...s)=>(typeof r=="function"&&r(),r=void 0,o=void 0,n(...s));return r=this.hook(t,o),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const o of r)this.hook(t,o)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Ro(t),r=Object.keys(n).map(o=>this.hook(o,n[o]));return()=>{for(const o of r.splice(0,r.length))o()}}removeHooks(t){const n=Ro(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith(Pd,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(Cd,t,...n)}callHookWith(t,n,...r){const o=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&Vr(this._before,o);const s=t(n in this._hooks?[...this._hooks[n]]:[],r);return s instanceof Promise?s.finally(()=>{this._after&&o&&Vr(this._after,o)}):(this._after&&o&&Vr(this._after,o),s)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function va(){return new Ad}function Sd(e={}){let t,n=!1;const r=i=>{if(t&&t!==i)throw new Error("Context conflict")};let o;if(e.asyncContext){const i=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;i?o=new i:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const s=()=>{if(o&&t===void 0){const i=o.getStore();if(i!==void 0)return i}return t};return{use:()=>{const i=s();if(i===void 0)throw new Error("Context is not available");return i},tryUse:()=>s(),set:(i,l)=>{l||r(i),t=i,n=!0},unset:()=>{t=void 0,n=!1},call:(i,l)=>{r(i),t=i;try{return o?o.run(i,l):l()}finally{n||(t=void 0)}},async callAsync(i,l){t=i;const a=()=>{t=i},u=()=>t===i?a:void 0;To.add(u);try{const c=o?o.run(i,l):l();return n||(t=void 0),await c}finally{To.delete(u)}}}}function xd(e={}){const t={};return{get(n,r={}){return t[n]||(t[n]=Sd({...e,...r})),t[n],t[n]}}}const dr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},fi="__unctx__",kd=dr[fi]||(dr[fi]=xd()),Ld=(e,t={})=>kd.get(e,t),di="__unctx_async_handlers__",To=dr[di]||(dr[di]=new Set);function Sn(e){const t=[];for(const o of To){const s=o();s&&t.push(s)}const n=()=>{for(const o of t)o()};let r=e();return r&&typeof r=="object"&&"catch"in r&&(r=r.catch(o=>{throw n(),o})),[r,n]}const ba=Ld("nuxt-app",{asyncContext:!1}),Od="__nuxt_plugin";function Id(e){let t=0;const n={_scope:dc(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return n.vueApp.version}},payload:Tt({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:o=>n._scope.run(()=>Nd(n,o)),isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let o=!1;return()=>{if(!o&&(o=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...e};n.hooks=va(),n.hook=n.hooks.hook,n.callHook=n.hooks.callHook,n.provide=(o,s)=>{const i="$"+o;Gn(n,i,s),Gn(n.vueApp.config.globalProperties,i,s)},Gn(n.vueApp,"$nuxt",n),Gn(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener("nuxt.preloadError",s=>{n.callHook("app:chunkError",{error:s.payload})}),window.useNuxtApp=window.useNuxtApp||ge;const o=n.hook("app:error",(...s)=>{console.error("[nuxt] error caught during app initialization",...s)});n.hook("app:mounted",o)}const r=n.payload.config;return n.provide("config",r),n}async function Hd(e,t){if(t.hooks&&e.hooks.addHooks(t.hooks),typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const r in n)e.provide(r,n[r])}}async function Md(e,t){const n=[],r=[],o=[],s=[];let i=0;async function l(a){var c;const u=((c=a.dependsOn)==null?void 0:c.filter(f=>t.some(d=>d._name===f)&&!n.includes(f)))??[];if(u.length>0)r.push([new Set(u),a]);else{const f=Hd(e,a).then(async()=>{a._name&&(n.push(a._name),await Promise.all(r.map(async([d,g])=>{d.has(a._name)&&(d.delete(a._name),d.size===0&&(i++,await l(g)))})))});a.parallel?o.push(f.catch(d=>s.push(d))):await f}}for(const a of t)await l(a);if(await Promise.all(o),i)for(let a=0;a{}),e,{[Od]:!0,_name:t})}function Nd(e,t,n){const r=()=>t();return ba.set(e),e.vueApp.runWithContext(r)}function $d(){var t;let e;return jl()&&(e=(t=Mn())==null?void 0:t.appContext.app.$nuxt),e=e||ba.tryUse(),e||null}function ge(){const e=$d();if(!e)throw new Error("[nuxt] instance unavailable");return e}function hs(e){return ge().$config}function Gn(e,t,n){Object.defineProperty(e,t,{get:()=>n})}function jd(e,t){return{ctx:{table:e},matchAll:n=>wa(n,e)}}function Ea(e){const t={};for(const n in e)t[n]=n==="dynamic"?new Map(Object.entries(e[n]).map(([r,o])=>[r,Ea(o)])):new Map(Object.entries(e[n]));return t}function Dd(e){return jd(Ea(e))}function wa(e,t,n){e.endsWith("/")&&(e=e.slice(0,-1)||"/");const r=[];for(const[s,i]of hi(t.wildcard))(e===s||e.startsWith(s+"/"))&&r.push(i);for(const[s,i]of hi(t.dynamic))if(e.startsWith(s+"/")){const l="/"+e.slice(s.length).split("/").splice(2).join("/");r.push(...wa(l,i))}const o=t.static.get(e);return o&&r.push(o),r.filter(Boolean)}function hi(e){return[...e.entries()].sort((t,n)=>t[0].length-n[0].length)}function Ur(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function Po(e,t,n=".",r){if(!Ur(t))return Po(e,{},n,r);const o=Object.assign({},t);for(const s in e){if(s==="__proto__"||s==="constructor")continue;const i=e[s];i!=null&&(r&&r(o,s,i,n)||(Array.isArray(i)&&Array.isArray(o[s])?o[s]=[...i,...o[s]]:Ur(i)&&Ur(o[s])?o[s]=Po(i,o[s],(n?`${n}.`:"")+s.toString(),r):o[s]=i))}return o}function Ra(e){return(...t)=>t.reduce((n,r)=>Po(n,r,"",e),{})}const Ta=Ra(),Fd=Ra((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function Bd(e,t){try{return t in e}catch{return!1}}var Vd=Object.defineProperty,Ud=(e,t,n)=>t in e?Vd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xt=(e,t,n)=>(Ud(e,typeof t!="symbol"?t+"":t,n),n);class Co extends Error{constructor(t,n={}){super(t,n),xt(this,"statusCode",500),xt(this,"fatal",!1),xt(this,"unhandled",!1),xt(this,"statusMessage"),xt(this,"data"),xt(this,"cause"),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:So(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=Pa(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}xt(Co,"__h3_error__",!0);function Ao(e){if(typeof e=="string")return new Co(e);if(Wd(e))return e;const t=new Co(e.message??e.statusMessage??"",{cause:e.cause||e});if(Bd(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=So(e.statusCode,t.statusCode):e.status&&(t.statusCode=So(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;Pa(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function Wd(e){var t;return((t=e==null?void 0:e.constructor)==null?void 0:t.__h3_error__)===!0}const Kd=/[^\u0009\u0020-\u007E]/g;function Pa(e=""){return e.replace(Kd,"")}function So(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Ca=Symbol("layout-meta"),$n=Symbol("route"),et=()=>{var e;return(e=ge())==null?void 0:e.$router},ps=()=>jl()?Se($n,ge()._route):ge()._route;const qd=()=>{try{if(ge()._processingMiddleware)return!0}catch{return!1}return!1},Im=(e,t)=>{e||(e="/");const n=typeof e=="string"?e:da(e.path||"/",e.query||{})+(e.hash||"");if(t!=null&&t.open){const{target:l="_blank",windowFeatures:a={}}=t.open,u=Object.entries(a).filter(([c,f])=>f!==void 0).map(([c,f])=>`${c.toLowerCase()}=${f}`).join(", ");return open(n,l,u),Promise.resolve()}const r=(t==null?void 0:t.external)||$t(n,{acceptRelative:!0});if(r){if(!(t!=null&&t.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const l=Tr(n).protocol;if(l&&Zf(l))throw new Error(`Cannot navigate to a URL with '${l}' protocol.`)}const o=qd();if(!r&&o)return e;const s=et(),i=ge();return r?(i._scope.stop(),t!=null&&t.replace?location.replace(n):location.href=n,o?i.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):t!=null&&t.replace?s.replace(e):s.push(e)},Aa="__nuxt_error",Pr=()=>Vc(ge().payload,"error"),Ut=e=>{const t=Cr(e);try{const n=ge(),r=Pr();n.hooks.callHook("app:error",t),r.value=r.value||t}catch{throw t}return t},zd=async(e={})=>{const t=ge(),n=Pr();t.callHook("app:error:cleared",e),e.redirect&&await et().replace(e.redirect),n.value=null},Gd=e=>!!e&&typeof e=="object"&&Aa in e,Cr=e=>{const t=Ao(e);return Object.defineProperty(t,Aa,{value:!0,configurable:!1,writable:!1}),t},Jd=-1,Qd=-2,Xd=-3,Yd=-4,Zd=-5,eh=-6;function th(e,t){return nh(JSON.parse(e),t)}function nh(e,t){if(typeof e=="number")return o(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function o(s,i=!1){if(s===Jd)return;if(s===Xd)return NaN;if(s===Yd)return 1/0;if(s===Zd)return-1/0;if(s===eh)return-0;if(i)throw new Error("Invalid input");if(s in r)return r[s];const l=n[s];if(!l||typeof l!="object")r[s]=l;else if(Array.isArray(l))if(typeof l[0]=="string"){const a=l[0],u=t==null?void 0:t[a];if(u)return r[s]=u(o(l[1]));switch(a){case"Date":r[s]=new Date(l[1]);break;case"Set":const c=new Set;r[s]=c;for(let g=1;g>>9)+65536).toString(16).substring(1,8).toLowerCase()}function pi(e){return e._h||gs(e._d?e._d:`${e.tag}:${e.textContent||e.innerHTML||""}:${Object.entries(e.props).map(([t,n])=>`${t}:${String(n)}`).join(",")}`)}function xa(e,t){const{props:n,tag:r}=e;if(ih.includes(r))return r;if(r==="link"&&n.rel==="canonical")return"canonical";if(n.charset)return"charset";const o=["id"];r==="meta"&&o.push("name","property","http-equiv");for(const s of o)if(typeof n[s]<"u"){const i=String(n[s]);return`${r}:${s}:${i}`}return!1}function gi(e,t){return e==null?t||null:typeof e=="function"?e(t):e}async function ah(e,t,n){const r={tag:e,props:await ka(typeof t=="object"&&typeof t!="function"&&!(t instanceof Promise)?{...t}:{[["script","noscript","style"].includes(e)?"innerHTML":"textContent"]:t},["templateParams","titleTemplate"].includes(e))};return Sa.forEach(o=>{const s=typeof r.props[o]<"u"?r.props[o]:n[o];typeof s<"u"&&((!["innerHTML","textContent","children"].includes(o)||oh.includes(r.tag))&&(r[o==="children"?"innerHTML":o]=s),delete r.props[o])}),r.props.body&&(r.tagPosition="bodyClose",delete r.props.body),r.tag==="script"&&typeof r.innerHTML=="object"&&(r.innerHTML=JSON.stringify(r.innerHTML),r.props.type=r.props.type||"application/json"),Array.isArray(r.props.content)?r.props.content.map(o=>({...r,props:{...r.props,content:o}})):r}function ch(e,t){var r;const n=e==="class"?" ":";";return typeof t=="object"&&!Array.isArray(t)&&(t=Object.entries(t).filter(([,o])=>o).map(([o,s])=>e==="style"?`${o}:${s}`:o)),(r=Array.isArray(t)?t.join(n):t)==null?void 0:r.split(n).filter(o=>o.trim()).filter(Boolean).join(n)}async function ka(e,t){for(const n of Object.keys(e)){if(["class","style"].includes(n)){e[n]=ch(n,e[n]);continue}if(e[n]instanceof Promise&&(e[n]=await e[n]),!t&&!Sa.includes(n)){const r=String(e[n]),o=n.startsWith("data-");r==="true"||r===""?e[n]=o?"true":!0:e[n]||(o&&r==="false"?e[n]="false":delete e[n])}}return e}const uh=10;async function fh(e){const t=[];return Object.entries(e.resolvedInput).filter(([n,r])=>typeof r<"u"&&sh.includes(n)).forEach(([n,r])=>{const o=rh(r);t.push(...o.map(s=>ah(n,s,e)).flat())}),(await Promise.all(t)).flat().filter(Boolean).map((n,r)=>(n._e=e._i,e.mode&&(n._m=e.mode),n._p=(e._i<a&&a[u]||void 0,t):l=t[i],typeof l<"u"?(l||"").replace(/"/g,'\\"'):!1}let o=e;try{o=decodeURI(e)}catch{}return(o.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(i=>{const l=r(i.slice(1));typeof l=="string"&&(e=e.replace(new RegExp(`\\${i}(\\W|$)`,"g"),(a,u)=>`${l}${u}`).trim())}),e.includes(ft)&&(e.endsWith(ft)&&(e=e.slice(0,-ft.length).trim()),e.startsWith(ft)&&(e=e.slice(ft.length).trim()),e=e.replace(new RegExp(`\\${ft}\\s*\\${ft}`,"g"),ft),e=Zn(e,{separator:n},n)),e}async function La(e,t={}){var c;const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const r={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",r),!r.shouldRender)return;const o=(await e.resolveTags()).map(f=>({tag:f,id:Yn.includes(f.tag)?pi(f):f.tag,shouldRender:!0}));let s=e._dom;if(!s){s={elMap:{htmlAttrs:n.documentElement,bodyAttrs:n.body}};for(const f of["body","head"]){const d=(c=n[f])==null?void 0:c.children,g=[];for(const v of[...d].filter(T=>Yn.includes(T.tagName.toLowerCase()))){const T={tag:v.tagName.toLowerCase(),props:await ka(v.getAttributeNames().reduce((y,m)=>({...y,[m]:v.getAttribute(m)}),{})),innerHTML:v.innerHTML};let L=1,S=xa(T);for(;S&&g.find(y=>y._d===S);)S=`${S}:${L++}`;T._d=S||void 0,g.push(T),s.elMap[v.getAttribute("data-hid")||pi(T)]=v}}}s.pendingSideEffects={...s.sideEffects||{}},s.sideEffects={};function i(f,d,g){const v=`${f}:${d}`;s.sideEffects[v]=g,delete s.pendingSideEffects[v]}function l({id:f,$el:d,tag:g}){const v=g.tag.endsWith("Attrs");s.elMap[f]=d,v||(["textContent","innerHTML"].forEach(T=>{g[T]&&g[T]!==d[T]&&(d[T]=g[T])}),i(f,"el",()=>{var T;(T=s.elMap[f])==null||T.remove(),delete s.elMap[f]}));for(const[T,L]of Object.entries(g._eventHandlers||{}))d.getAttribute(`data-${T}`)!==""&&((g.tag==="bodyAttrs"?n.defaultView:d).addEventListener(T.replace("on",""),L.bind(d)),d.setAttribute(`data-${T}`,""));Object.entries(g.props).forEach(([T,L])=>{const S=`attr:${T}`;if(T==="class")for(const y of(L||"").split(" ").filter(Boolean))v&&i(f,`${S}:${y}`,()=>d.classList.remove(y)),!d.classList.contains(y)&&d.classList.add(y);else if(T==="style")for(const y of(L||"").split(";").filter(Boolean)){const[m,..._]=y.split(":").map(w=>w.trim());i(f,`${S}:${y}:${m}`,()=>{d.style.removeProperty(m)}),d.style.setProperty(m,_.join(":"))}else d.getAttribute(T)!==L&&d.setAttribute(T,L===!0?"":String(L)),v&&i(f,S,()=>d.removeAttribute(T))})}const a=[],u={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const f of o){const{tag:d,shouldRender:g,id:v}=f;if(g){if(d.tag==="title"){n.title=d.textContent;continue}f.$el=f.$el||s.elMap[v],f.$el?l(f):Yn.includes(d.tag)&&a.push(f)}}for(const f of a){const d=f.tag.tagPosition||"head";f.$el=n.createElement(f.tag.tag),l(f),u[d]=u[d]||n.createDocumentFragment(),u[d].appendChild(f.$el)}for(const f of o)await e.hooks.callHook("dom:renderTag",f,n,i);u.head&&n.head.appendChild(u.head),u.bodyOpen&&n.body.insertBefore(u.bodyOpen,n.body.firstChild),u.bodyClose&&n.body.appendChild(u.bodyClose),Object.values(s.pendingSideEffects).forEach(f=>f()),e._dom=s,e.dirty=!1,await e.hooks.callHook("dom:rendered",{renders:o})}async function hh(e,t={}){const n=t.delayFn||(r=>setTimeout(r,10));return e._domUpdatePromise=e._domUpdatePromise||new Promise(r=>n(async()=>{await La(e,t),delete e._domUpdatePromise,r()}))}function ph(e){return t=>{var r,o;const n=((o=(r=t.resolvedOptions.document)==null?void 0:r.head.querySelector('script[id="unhead:payload"]'))==null?void 0:o.innerHTML)||!1;return n&&t.push(JSON.parse(n)),{mode:"client",hooks:{"entries:updated":function(s){hh(s,e)}}}}}const gh=["templateParams","htmlAttrs","bodyAttrs"],mh={hooks:{"tag:normalise":function({tag:e}){["hid","vmid","key"].forEach(r=>{e.props[r]&&(e.key=e.props[r],delete e.props[r])});const n=xa(e)||(e.key?`${e.tag}:${e.key}`:!1);n&&(e._d=n)},"tags:resolve":function(e){const t={};e.tags.forEach(r=>{const o=(r.key?`${r.tag}:${r.key}`:r._d)||r._p,s=t[o];if(s){let l=r==null?void 0:r.tagDuplicateStrategy;if(!l&&gh.includes(r.tag)&&(l="merge"),l==="merge"){const a=s.props;["class","style"].forEach(u=>{a[u]&&(r.props[u]?(u==="style"&&!a[u].endsWith(";")&&(a[u]+=";"),r.props[u]=`${a[u]} ${r.props[u]}`):r.props[u]=a[u])}),t[o].props={...a,...r.props};return}else if(r._e===s._e){s._duped=s._duped||[],r._d=`${s._d}:${s._duped.length+1}`,s._duped.push(r);return}else if(hr(r)>hr(s))return}const i=Object.keys(r.props).length+(r.innerHTML?1:0)+(r.textContent?1:0);if(Yn.includes(r.tag)&&i===0){delete t[o];return}t[o]=r});const n=[];Object.values(t).forEach(r=>{const o=r._duped;delete r._duped,n.push(r),o&&n.push(...o)}),e.tags=n,e.tags=e.tags.filter(r=>!(r.tag==="meta"&&(r.props.name||r.props.property)&&!r.props.content))}}},yh={mode:"server",hooks:{"tags:resolve":function(e){const t={};e.tags.filter(n=>["titleTemplate","templateParams","title"].includes(n.tag)&&n._m==="server").forEach(n=>{t[n.tag]=n.tag.startsWith("title")?n.textContent:n.props}),Object.keys(t).length&&e.tags.push({tag:"script",innerHTML:JSON.stringify(t),props:{id:"unhead:payload",type:"application/json"}})}}},_h=["script","link","bodyAttrs"],vh=e=>({hooks:{"tags:resolve":function(t){for(const n of t.tags.filter(r=>_h.includes(r.tag)))Object.entries(n.props).forEach(([r,o])=>{r.startsWith("on")&&typeof o=="function"&&(e.ssr&&_i.includes(r)?n.props[r]=`this.dataset.${r}fired = true`:delete n.props[r],n._eventHandlers=n._eventHandlers||{},n._eventHandlers[r]=o)}),e.ssr&&n._eventHandlers&&(n.props.src||n.props.href)&&(n.key=n.key||gs(n.props.src||n.props.href))},"dom:renderTag":function({$el:t,tag:n}){var r,o;for(const s of Object.keys((t==null?void 0:t.dataset)||{}).filter(i=>_i.some(l=>`${l}fired`===i))){const i=s.replace("fired","");(o=(r=n._eventHandlers)==null?void 0:r[i])==null||o.call(t,new Event(i.replace("on","")))}}}}),bh=["link","style","script","noscript"],Eh={hooks:{"tag:normalise":({tag:e})=>{e.key&&bh.includes(e.tag)&&(e.props["data-hid"]=e._h=gs(e.key))}}},wh={hooks:{"tags:resolve":e=>{const t=n=>{var r;return(r=e.tags.find(o=>o._d===n))==null?void 0:r._p};for(const{prefix:n,offset:r}of dh)for(const o of e.tags.filter(s=>typeof s.tagPriority=="string"&&s.tagPriority.startsWith(n))){const s=t(o.tagPriority.replace(n,""));typeof s<"u"&&(o._p=s+r)}e.tags.sort((n,r)=>n._p-r._p).sort((n,r)=>hr(n)-hr(r))}}},Rh={meta:"content",link:"href",htmlAttrs:"lang"},Th=e=>({hooks:{"tags:resolve":t=>{var l;const{tags:n}=t,r=(l=n.find(a=>a.tag==="title"))==null?void 0:l.textContent,o=n.findIndex(a=>a.tag==="templateParams"),s=o!==-1?n[o].props:{},i=s.separator||"|";delete s.separator,s.pageTitle=Zn(s.pageTitle||r||"",s,i);for(const a of n.filter(u=>u.processTemplateParams!==!1)){const u=Rh[a.tag];u&&typeof a.props[u]=="string"?a.props[u]=Zn(a.props[u],s,i):(a.processTemplateParams===!0||["titleTemplate","title"].includes(a.tag))&&["innerHTML","textContent"].forEach(c=>{typeof a[c]=="string"&&(a[c]=Zn(a[c],s,i))})}e._templateParams=s,e._separator=i,t.tags=n.filter(a=>a.tag!=="templateParams")}}}),Ph={hooks:{"tags:resolve":e=>{const{tags:t}=e;let n=t.findIndex(o=>o.tag==="titleTemplate");const r=t.findIndex(o=>o.tag==="title");if(r!==-1&&n!==-1){const o=gi(t[n].textContent,t[r].textContent);o!==null?t[r].textContent=o||t[r].textContent:delete t[r]}else if(n!==-1){const o=gi(t[n].textContent);o!==null&&(t[n].textContent=o,t[n].tag="title",n=-1)}n!==-1&&delete t[n],e.tags=t.filter(Boolean)}}},Ch={hooks:{"tags:afterResolve":function(e){for(const t of e.tags)typeof t.innerHTML=="string"&&(t.innerHTML&&["application/ld+json","application/json"].includes(t.props.type)?t.innerHTML=t.innerHTML.replace(/{l.dirty=!0,t.callHook("entries:updated",l)};let o=0,s=[];const i=[],l={plugins:i,dirty:!1,resolvedOptions:e,hooks:t,headEntries(){return s},use(a){const u=typeof a=="function"?a(l):a;(!u.key||!i.some(c=>c.key===u.key))&&(i.push(u),vi(u.mode,n)&&t.addHooks(u.hooks||{}))},push(a,u){u==null||delete u.head;const c={_i:o++,input:a,...u};return vi(c.mode,n)&&(s.push(c),r()),{dispose(){s=s.filter(f=>f._i!==c._i),t.callHook("entries:updated",l),r()},patch(f){s=s.map(d=>(d._i===c._i&&(d.input=c.input=f),d)),r()}}},async resolveTags(){const a={tags:[],entries:[...s]};await t.callHook("entries:resolve",a);for(const u of a.entries){const c=u.resolvedInput||u.input;if(u.resolvedInput=await(u.transform?u.transform(c):c),u.resolvedInput)for(const f of await fh(u)){const d={tag:f,entry:u,resolvedOptions:l.resolvedOptions};await t.callHook("tag:normalise",d),a.tags.push(d.tag)}}return await t.callHook("tags:beforeResolve",a),await t.callHook("tags:resolve",a),await t.callHook("tags:afterResolve",a),a.tags},ssr:n};return[mh,yh,vh,Eh,wh,Th,Ph,Ch,...(e==null?void 0:e.plugins)||[]].forEach(a=>l.use(a)),l.hooks.callHook("init",l),l}function xh(){return Oa}const kh=la.startsWith("3");function Lh(e){return typeof e=="function"?e():ue(e)}function xo(e,t=""){if(e instanceof Promise)return e;const n=Lh(e);return!e||!n?n:Array.isArray(n)?n.map(r=>xo(r,t)):typeof n=="object"?Object.fromEntries(Object.entries(n).map(([r,o])=>r==="titleTemplate"||r.startsWith("on")?[r,ue(o)]:[r,xo(o,r)])):n}const Oh={hooks:{"entries:resolve":function(e){for(const t of e.entries)t.resolvedInput=xo(t.input)}}},Ia="usehead";function Ih(e){return{install(n){kh&&(n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(Ia,e))}}.install}function Hh(e={}){e.domDelayFn=e.domDelayFn||(n=>sn(()=>setTimeout(()=>n(),0)));const t=Ah(e);return t.use(Oh),t.install=Ih(t),t}const ko=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Lo="__unhead_injection_handler__";function Mh(e){ko[Lo]=e}function Hm(){if(Lo in ko)return ko[Lo]();const e=Se(Ia);return e||xh()}const Nh={nuxt:{buildId:"c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621"}},$h=Fd(Nh);function Ha(){const e=ge();return e._appConfig||(e._appConfig=Tt($h)),e._appConfig}const jh=!1,Oo=!1,Dh=!1,Mm={trailingSlash:"append",componentName:"NuxtLink"},Nm={deep:!0},Fh="#__nuxt";let er,Ma;function Bh(){var t;const e=(t=Ha().nuxt)==null?void 0:t.buildId;return er=$fetch(ds(`builds/meta/${e}.json`)),er.then(n=>{Ma=Dd(n.matcher)}),er}function Ar(){return er||Bh()}async function ms(e){return await Ar(),Ta({},...Ma.matchAll(e).reverse())}function bi(e,t={}){const n=Uh(e,t),r=ge(),o=r._payloadCache=r._payloadCache||{};return n in o||(o[n]=Wh(e).then(s=>s?Na(n).then(i=>i||(delete o[n],null)):(o[n]=null,null))),o[n]}const Vh="_payload.json";function Uh(e,t={}){var o;const n=new URL(e,"http://localhost");if(n.host!=="localhost"||$t(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const r=t.hash||(t.fresh?Date.now():(o=Ha().nuxt)==null?void 0:o.buildId);return us(hs().app.baseURL,n.pathname,Vh+(r?`?${r}`:""))}async function Na(e){const t=fetch(e).then(n=>n.text().then($a));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}async function Wh(e=ps().path){if(e=cs(e),(await Ar()).prerendered.includes(e))return!0;const n=await ms(e);return!!n.prerender&&!n.redirect}let Jn=null;async function Kh(){if(Jn)return Jn;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await $a(e.textContent||""),n=e.dataset.src?await Na(e.dataset.src):void 0;return Jn={...t,...n,...window.__NUXT__},Jn}async function $a(e){return await th(e,ge()._payloadRevivers)}function qh(e,t){ge()._payloadRevivers[e]=t}const Ei={NuxtError:e=>Cr(e),EmptyShallowRef:e=>Rn(e==="_"?void 0:e==="0n"?BigInt(0):cr(e)),EmptyRef:e=>qe(e==="_"?void 0:e==="0n"?BigInt(0):cr(e)),ShallowRef:e=>Rn(e),ShallowReactive:e=>In(e),Ref:e=>qe(e),Reactive:e=>Tt(e)},zh=Pt({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const r in Ei)qh(r,Ei[r]);Object.assign(e.payload,([t,n]=Sn(()=>e.runWithContext(Kh)),t=await t,n(),t)),window.__NUXT__=e.payload}}),Gh=[],Jh=Pt({name:"nuxt:head",enforce:"pre",setup(e){const t=Hh({plugins:Gh});Mh(()=>ge().vueApp._context.provides.usehead),e.vueApp.use(t);{let n=!0;const r=async()=>{n=!1,await La(t)};t.hooks.hook("dom:beforeRender",o=>{o.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||r()}),e.hooks.hook("app:error",r),e.hooks.hook("app:suspense:resolve",r)}}});/*! + * vue-router v4.3.2 + * (c) 2024 Eduardo San Martin Morote + * @license MIT + */const Bt=typeof document<"u";function Qh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const se=Object.assign;function Wr(e,t){const n={};for(const r in t){const o=t[r];n[r]=ze(o)?o.map(e):e(o)}return n}const vn=()=>{},ze=Array.isArray,ja=/#/g,Xh=/&/g,Yh=/\//g,Zh=/=/g,ep=/\?/g,Da=/\+/g,tp=/%5B/g,np=/%5D/g,Fa=/%5E/g,rp=/%60/g,Ba=/%7B/g,op=/%7C/g,Va=/%7D/g,sp=/%20/g;function ys(e){return encodeURI(""+e).replace(op,"|").replace(tp,"[").replace(np,"]")}function ip(e){return ys(e).replace(Ba,"{").replace(Va,"}").replace(Fa,"^")}function Io(e){return ys(e).replace(Da,"%2B").replace(sp,"+").replace(ja,"%23").replace(Xh,"%26").replace(rp,"`").replace(Ba,"{").replace(Va,"}").replace(Fa,"^")}function lp(e){return Io(e).replace(Zh,"%3D")}function ap(e){return ys(e).replace(ja,"%23").replace(ep,"%3F")}function cp(e){return e==null?"":ap(e).replace(Yh,"%2F")}function xn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const up=/\/$/,fp=e=>e.replace(up,"");function Kr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=gp(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:xn(i)}}function dp(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function wi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function hp(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&tn(t.matched[r],n.matched[o])&&Ua(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function tn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ua(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!pp(e[n],t[n]))return!1;return!0}function pp(e,t){return ze(e)?Ri(e,t):ze(t)?Ri(t,e):e===t}function Ri(e,t){return ze(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function gp(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,l;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}var kn;(function(e){e.pop="pop",e.push="push"})(kn||(kn={}));var bn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(bn||(bn={}));function mp(e){if(!e)if(Bt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),fp(e)}const yp=/^[^#]+#/;function _p(e,t){return e.replace(yp,"#")+t}function vp(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Sr=()=>({left:window.scrollX,top:window.scrollY});function bp(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=vp(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Ti(e,t){return(history.state?history.state.position-t:-1)+e}const Ho=new Map;function Ep(e,t){Ho.set(e,t)}function wp(e){const t=Ho.get(e);return Ho.delete(e),t}let Rp=()=>location.protocol+"//"+location.host;function Wa(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),wi(a,"")}return wi(n,e)+r+o}function Tp(e,t,n,r){let o=[],s=[],i=null;const l=({state:d})=>{const g=Wa(e,location),v=n.value,T=t.value;let L=0;if(d){if(n.value=g,t.value=d,i&&i===v){i=null;return}L=T?d.position-T.position:0}else r(g);o.forEach(S=>{S(n.value,v,{delta:L,type:kn.pop,direction:L?L>0?bn.forward:bn.back:bn.unknown})})};function a(){i=n.value}function u(d){o.push(d);const g=()=>{const v=o.indexOf(d);v>-1&&o.splice(v,1)};return s.push(g),g}function c(){const{history:d}=window;d.state&&d.replaceState(se({},d.state,{scroll:Sr()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:a,listen:u,destroy:f}}function Pi(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Sr():null}}function Pp(e){const{history:t,location:n}=window,r={value:Wa(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,u,c){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:Rp()+e+a;try{t[c?"replaceState":"pushState"](u,"",d),o.value=u}catch(g){console.error(g),n[c?"replace":"assign"](d)}}function i(a,u){const c=se({},t.state,Pi(o.value.back,a,o.value.forward,!0),u,{position:o.value.position});s(a,c,!0),r.value=a}function l(a,u){const c=se({},o.value,t.state,{forward:a,scroll:Sr()});s(c.current,c,!0);const f=se({},Pi(r.value,a,null),{position:c.position+1},u);s(a,f,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function Ka(e){e=mp(e);const t=Pp(e),n=Tp(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=se({location:"",base:e,go:r,createHref:_p.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Cp(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Ka(e)}function Ap(e){return typeof e=="string"||e&&typeof e=="object"}function qa(e){return typeof e=="string"||typeof e=="symbol"}const We={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},za=Symbol("");var Ci;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ci||(Ci={}));function nn(e,t){return se(new Error,{type:e,[za]:!0},t)}function tt(e,t){return e instanceof Error&&za in e&&(t==null||!!(e.type&t))}const Ai="[^/]+?",Sp={sensitive:!1,strict:!1,start:!0,end:!0},xp=/[.+*?^${}()[\]/\\]/g;function kp(e,t){const n=se({},Sp,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function Op(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Ip={type:0,value:""},Hp=/[a-zA-Z0-9_]/;function Mp(e){if(!e)return[[]];if(e==="/")return[[Ip]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${u}": ${g}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function d(){u+=a}for(;l{i(y)}:vn}function i(c){if(qa(c)){const f=r.get(c);f&&(r.delete(c),n.splice(n.indexOf(f),1),f.children.forEach(i),f.alias.forEach(i))}else{const f=n.indexOf(c);f>-1&&(n.splice(f,1),c.record.name&&r.delete(c.record.name),c.children.forEach(i),c.alias.forEach(i))}}function l(){return n}function a(c){let f=0;for(;f=0&&(c.record.path!==n[f].record.path||!Ga(c,n[f]));)f++;n.splice(f,0,c),c.record.name&&!ki(c)&&r.set(c.record.name,c)}function u(c,f){let d,g={},v,T;if("name"in c&&c.name){if(d=r.get(c.name),!d)throw nn(1,{location:c});T=d.record.name,g=se(xi(f.params,d.keys.filter(y=>!y.optional).concat(d.parent?d.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),c.params&&xi(c.params,d.keys.map(y=>y.name))),v=d.stringify(g)}else if(c.path!=null)v=c.path,d=n.find(y=>y.re.test(v)),d&&(g=d.parse(v),T=d.record.name);else{if(d=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!d)throw nn(1,{location:c,currentLocation:f});T=d.record.name,g=se({},f.params,c.params),v=d.stringify(g)}const L=[];let S=d;for(;S;)L.unshift(S.record),S=S.parent;return{name:T,path:v,params:g,matched:L,meta:Fp(L)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function xi(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function jp(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Dp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Dp(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function ki(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Fp(e){return e.reduce((t,n)=>se(t,n.meta),{})}function Li(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Ga(e,t){return t.children.some(n=>n===e||Ga(e,n))}function Bp(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Io(s)):[r&&Io(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Vp(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ze(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Up=Symbol(""),Ii=Symbol(""),_s=Symbol(""),vs=Symbol(""),Mo=Symbol("");function cn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function mt(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((l,a)=>{const u=d=>{d===!1?a(nn(4,{from:n,to:t})):d instanceof Error?a(d):Ap(d)?a(nn(2,{from:t,to:d})):(i&&r.enterCallbacks[o]===i&&typeof d=="function"&&i.push(d),l())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(d=>a(d))})}function qr(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const l in i.components){let a=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Wp(a)){const c=(a.__vccOpts||a)[t];c&&s.push(mt(c,n,r,i,l,o))}else{let u=a();s.push(()=>u.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${l}" at "${i.path}"`));const f=Qh(c)?c.default:c;i.components[l]=f;const g=(f.__vccOpts||f)[t];return g&&mt(g,n,r,i,l,o)()}))}}return s}function Wp(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Hi(e){const t=Se(_s),n=Se(vs),r=Le(()=>{const a=ue(e.to);return t.resolve(a)}),o=Le(()=>{const{matched:a}=r.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const d=f.findIndex(tn.bind(null,c));if(d>-1)return d;const g=Mi(a[u-2]);return u>1&&Mi(c)===g&&f[f.length-1].path!==g?f.findIndex(tn.bind(null,a[u-2])):d}),s=Le(()=>o.value>-1&&Gp(n.params,r.value.params)),i=Le(()=>o.value>-1&&o.value===n.matched.length-1&&Ua(n.params,r.value.params));function l(a={}){return zp(a)?t[ue(e.replace)?"replace":"push"](ue(e.to)).catch(vn):Promise.resolve()}return{route:r,href:Le(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const Kp=ot({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Hi,setup(e,{slots:t}){const n=Tt(Hi(e)),{options:r}=Se(_s),o=Le(()=>({[Ni(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Ni(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Oe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),qp=Kp;function zp(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Gp(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!ze(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Mi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ni=(e,t,n)=>e??t??n,Jp=ot({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Se(Mo),o=Le(()=>e.route||r.value),s=Se(Ii,0),i=Le(()=>{let u=ue(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=Le(()=>o.value.matched[i.value]);Ht(Ii,Le(()=>i.value+1)),Ht(Up,l),Ht(Mo,o);const a=qe();return Jt(()=>[a.value,l.value,e.name],([u,c,f],[d,g,v])=>{c&&(c.instances[f]=u,g&&g!==c&&u&&u===d&&(c.leaveGuards.size||(c.leaveGuards=g.leaveGuards),c.updateGuards.size||(c.updateGuards=g.updateGuards))),u&&c&&(!g||!tn(c,g)||!d)&&(c.enterCallbacks[f]||[]).forEach(T=>T(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=l.value,d=f&&f.components[c];if(!d)return $i(n.default,{Component:d,route:u});const g=f.props[c],v=g?g===!0?u.params:typeof g=="function"?g(u):g:null,L=Oe(d,se({},v,t,{onVnodeUnmounted:S=>{S.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return $i(n.default,{Component:L,route:u})||L}}});function $i(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Ja=Jp;function Qp(e){const t=$p(e.routes,e),n=e.parseQuery||Bp,r=e.stringifyQuery||Oi,o=e.history,s=cn(),i=cn(),l=cn(),a=Rn(We);let u=We;Bt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Wr.bind(null,P=>""+P),f=Wr.bind(null,cp),d=Wr.bind(null,xn);function g(P,F){let j,U;return qa(P)?(j=t.getRecordMatcher(P),U=F):U=P,t.addRoute(U,j)}function v(P){const F=t.getRecordMatcher(P);F&&t.removeRoute(F)}function T(){return t.getRoutes().map(P=>P.record)}function L(P){return!!t.getRecordMatcher(P)}function S(P,F){if(F=se({},F||a.value),typeof P=="string"){const p=Kr(n,P,F.path),b=t.resolve({path:p.path},F),C=o.createHref(p.fullPath);return se(p,b,{params:d(b.params),hash:xn(p.hash),redirectedFrom:void 0,href:C})}let j;if(P.path!=null)j=se({},P,{path:Kr(n,P.path,F.path).path});else{const p=se({},P.params);for(const b in p)p[b]==null&&delete p[b];j=se({},P,{params:f(p)}),F.params=f(F.params)}const U=t.resolve(j,F),oe=P.hash||"";U.params=c(d(U.params));const de=dp(r,se({},P,{hash:ip(oe),path:U.path})),h=o.createHref(de);return se({fullPath:de,hash:oe,query:r===Oi?Vp(P.query):P.query||{}},U,{redirectedFrom:void 0,href:h})}function y(P){return typeof P=="string"?Kr(n,P,a.value.path):se({},P)}function m(P,F){if(u!==P)return nn(8,{from:F,to:P})}function _(P){return k(P)}function w(P){return _(se(y(P),{replace:!0}))}function E(P){const F=P.matched[P.matched.length-1];if(F&&F.redirect){const{redirect:j}=F;let U=typeof j=="function"?j(P):j;return typeof U=="string"&&(U=U.includes("?")||U.includes("#")?U=y(U):{path:U},U.params={}),se({query:P.query,hash:P.hash,params:U.path!=null?{}:P.params},U)}}function k(P,F){const j=u=S(P),U=a.value,oe=P.state,de=P.force,h=P.replace===!0,p=E(j);if(p)return k(se(y(p),{state:typeof p=="object"?se({},oe,p.state):oe,force:de,replace:h}),F||j);const b=j;b.redirectedFrom=F;let C;return!de&&hp(r,U,j)&&(C=nn(16,{to:b,from:U}),Ge(U,U,!0,!1)),(C?Promise.resolve(C):N(b,U)).catch(R=>tt(R)?tt(R,2)?R:it(R):W(R,b,U)).then(R=>{if(R){if(tt(R,2))return k(se({replace:h},y(R.to),{state:typeof R.to=="object"?se({},oe,R.to.state):oe,force:de}),F||b)}else R=H(b,U,!0,h,oe);return Q(b,U,R),R})}function A(P,F){const j=m(P,F);return j?Promise.reject(j):Promise.resolve()}function $(P){const F=Dt.values().next().value;return F&&typeof F.runWithContext=="function"?F.runWithContext(P):P()}function N(P,F){let j;const[U,oe,de]=Xp(P,F);j=qr(U.reverse(),"beforeRouteLeave",P,F);for(const p of U)p.leaveGuards.forEach(b=>{j.push(mt(b,P,F))});const h=A.bind(null,P,F);return j.push(h),we(j).then(()=>{j=[];for(const p of s.list())j.push(mt(p,P,F));return j.push(h),we(j)}).then(()=>{j=qr(oe,"beforeRouteUpdate",P,F);for(const p of oe)p.updateGuards.forEach(b=>{j.push(mt(b,P,F))});return j.push(h),we(j)}).then(()=>{j=[];for(const p of de)if(p.beforeEnter)if(ze(p.beforeEnter))for(const b of p.beforeEnter)j.push(mt(b,P,F));else j.push(mt(p.beforeEnter,P,F));return j.push(h),we(j)}).then(()=>(P.matched.forEach(p=>p.enterCallbacks={}),j=qr(de,"beforeRouteEnter",P,F,$),j.push(h),we(j))).then(()=>{j=[];for(const p of i.list())j.push(mt(p,P,F));return j.push(h),we(j)}).catch(p=>tt(p,8)?p:Promise.reject(p))}function Q(P,F,j){l.list().forEach(U=>$(()=>U(P,F,j)))}function H(P,F,j,U,oe){const de=m(P,F);if(de)return de;const h=F===We,p=Bt?history.state:{};j&&(U||h?o.replace(P.fullPath,se({scroll:h&&p&&p.scroll},oe)):o.push(P.fullPath,oe)),a.value=P,Ge(P,F,j,h),it()}let J;function le(){J||(J=o.listen((P,F,j)=>{if(!jn.listening)return;const U=S(P),oe=E(U);if(oe){k(se(oe,{replace:!0}),U).catch(vn);return}u=U;const de=a.value;Bt&&Ep(Ti(de.fullPath,j.delta),Sr()),N(U,de).catch(h=>tt(h,12)?h:tt(h,2)?(k(h.to,U).then(p=>{tt(p,20)&&!j.delta&&j.type===kn.pop&&o.go(-1,!1)}).catch(vn),Promise.reject()):(j.delta&&o.go(-j.delta,!1),W(h,U,de))).then(h=>{h=h||H(U,de,!1),h&&(j.delta&&!tt(h,8)?o.go(-j.delta,!1):j.type===kn.pop&&tt(h,20)&&o.go(-1,!1)),Q(U,de,h)}).catch(vn)}))}let ae=cn(),V=cn(),Z;function W(P,F,j){it(P);const U=V.list();return U.length?U.forEach(oe=>oe(P,F,j)):console.error(P),Promise.reject(P)}function Ve(){return Z&&a.value!==We?Promise.resolve():new Promise((P,F)=>{ae.add([P,F])})}function it(P){return Z||(Z=!P,le(),ae.list().forEach(([F,j])=>P?j(P):F()),ae.reset()),P}function Ge(P,F,j,U){const{scrollBehavior:oe}=e;if(!Bt||!oe)return Promise.resolve();const de=!j&&wp(Ti(P.fullPath,0))||(U||!j)&&history.state&&history.state.scroll||null;return sn().then(()=>oe(P,F,de)).then(h=>h&&bp(h)).catch(h=>W(h,P,F))}const xe=P=>o.go(P);let jt;const Dt=new Set,jn={currentRoute:a,listening:!0,addRoute:g,removeRoute:v,hasRoute:L,getRoutes:T,resolve:S,options:e,push:_,replace:w,go:xe,back:()=>xe(-1),forward:()=>xe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:V.add,isReady:Ve,install(P){const F=this;P.component("RouterLink",qp),P.component("RouterView",Ja),P.config.globalProperties.$router=F,Object.defineProperty(P.config.globalProperties,"$route",{enumerable:!0,get:()=>ue(a)}),Bt&&!jt&&a.value===We&&(jt=!0,_(o.location).catch(oe=>{}));const j={};for(const oe in We)Object.defineProperty(j,oe,{get:()=>a.value[oe],enumerable:!0});P.provide(_s,F),P.provide(vs,In(j)),P.provide(Mo,a);const U=P.unmount;Dt.add(P),P.unmount=function(){Dt.delete(P),Dt.size<1&&(u=We,J&&J(),J=null,a.value=We,jt=!1,Z=!1),U()}}};function we(P){return P.reduce((F,j)=>F.then(()=>$(j)),Promise.resolve())}return jn}function Xp(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;itn(u,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(u=>tn(u,a))||o.push(a))}return[n,r,o]}function Yp(){return Se(vs)}const Zp=(e,t)=>t.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""}),No=(e,t)=>{const n=e.route.matched.find(o=>{var s;return((s=o.components)==null?void 0:s.default)===e.Component.type}),r=t??(n==null?void 0:n.meta.key)??(n&&Zp(e.route,n));return typeof r=="function"?r(e.route):r},eg=(e,t)=>({default:()=>e?Oe(du,e===!0?{}:e,t):t});function bs(e){return Array.isArray(e)?e:[e]}const tg="modulepreload",ng=function(e,t){return e[0]==="."?new URL(e,t).href:e},ji={},rg=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),l=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=Promise.all(n.map(a=>{if(a=ng(a,r),a in ji)return;ji[a]=!0;const u=a.endsWith(".css"),c=u?'[rel="stylesheet"]':"";if(!!r)for(let g=s.length-1;g>=0;g--){const v=s[g];if(v.href===a&&(!u||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${c}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":tg,u||(d.as="script",d.crossOrigin=""),d.href=a,l&&d.setAttribute("nonce",l),document.head.appendChild(d),u)return new Promise((g,v)=>{d.addEventListener("load",g),d.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${a}`)))})}))}return o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},z=(...e)=>rg(...e).catch(t=>{const n=new Event("nuxt.preloadError");throw n.payload=t,window.dispatchEvent(n),t}),zr=null,Gr=null,Jr=null,Qr=null,Xr=null,Yr=null,Zr=null,eo=null,to=null,no=null,ro=null,Di=[{name:"case-studies-automatisch",path:"/case-studies/automatisch",meta:{},alias:[],redirect:zr==null?void 0:zr.redirect,component:()=>z(()=>import("./BQDZ21oy.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url).then(e=>e.default||e)},{name:"case-studies",path:"/case-studies",meta:{},alias:[],redirect:Gr==null?void 0:Gr.redirect,component:()=>z(()=>import("./BASUvlMQ.js"),__vite__mapDeps([11,2,9,10,8]),import.meta.url).then(e=>e.default||e)},{name:"index",path:"/",meta:{},alias:[],redirect:Jr==null?void 0:Jr.redirect,component:()=>z(()=>import("./BQoE-4GE.js"),__vite__mapDeps([12,13,9,1,2,3,14,15]),import.meta.url).then(e=>e.default||e)},{name:"playwright-architecture",path:"/playwright/architecture",meta:{},alias:[],redirect:Qr==null?void 0:Qr.redirect,component:()=>z(()=>import("./DNJ0aMK4.js"),__vite__mapDeps([16,4,2,5,6,7,8,9,10]),import.meta.url).then(e=>e.default||e)},{name:"playwright-how-playwright-initializes",path:"/playwright/how-playwright-initializes",meta:{},alias:[],redirect:Xr==null?void 0:Xr.redirect,component:()=>z(()=>import("./DzaeZ-yb.js"),__vite__mapDeps([17,4,2,5,6,7,8,9,10]),import.meta.url).then(e=>e.default||e)},{name:"playwright",path:"/playwright",meta:{},alias:[],redirect:Yr==null?void 0:Yr.redirect,component:()=>z(()=>import("./DSPAbem3.js"),__vite__mapDeps([18,2,9,10,8]),import.meta.url).then(e=>e.default||e)},{name:"privacy-policy",path:"/privacy-policy",meta:{},alias:[],redirect:Zr==null?void 0:Zr.redirect,component:()=>z(()=>import("./DdJ-Ewyp.js"),__vite__mapDeps([19,20,13,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-and-conditions",path:"/terms-and-conditions",meta:{},alias:[],redirect:eo==null?void 0:eo.redirect,component:()=>z(()=>import("./C5ITgUyT.js"),__vite__mapDeps([22,20,13,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"terms-of-service",path:"/terms-of-service",meta:{},alias:[],redirect:to==null?void 0:to.redirect,component:()=>z(()=>import("./DcjfjkQm.js"),__vite__mapDeps([23,20,13,5,6,7,8,21,9,10,14]),import.meta.url).then(e=>e.default||e)},{name:"white-papers-how-qa-factors-into-vc-due-diligence",path:"/white-papers/how-qa-factors-into-vc-due-diligence",meta:{},alias:[],redirect:no==null?void 0:no.redirect,component:()=>z(()=>import("./Ck9OydBO.js"),__vite__mapDeps([24,4,2,5,6,7,8,9,10]),import.meta.url).then(e=>e.default||e)},{name:"white-papers",path:"/white-papers",meta:{},alias:[],redirect:ro==null?void 0:ro.redirect,component:()=>z(()=>import("./BXBBK3p1.js"),__vite__mapDeps([25,2,9,10,8]),import.meta.url).then(e=>e.default||e)}],Qa=(e,t,n)=>(t=t===!0?{}:t,{default:()=>{var r;return t?Oe(e,t,n):(r=n.default)==null?void 0:r.call(n)}});function Fi(e){const t=(e==null?void 0:e.meta.key)??e.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""});return typeof t=="function"?t(e):t}function og(e,t){return e===t||t===We?!1:Fi(e)!==Fi(t)?!0:!e.matched.every((r,o)=>{var s,i;return r.components&&r.components.default===((i=(s=t.matched[o])==null?void 0:s.components)==null?void 0:i.default)})}const sg={scrollBehavior(e,t,n){var u;const r=ge(),o=((u=et().options)==null?void 0:u.scrollBehaviorType)??"auto";let s=n||void 0;const i=typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop;if(!s&&t&&e&&i!==!1&&og(e,t)&&(s={left:0,top:0}),e.path===t.path)return t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:Bi(e.hash),behavior:o}:!1;const l=c=>!!(c.meta.pageTransition??Oo),a=l(t)&&l(e)?"page:transition:finish":"page:finish";return new Promise(c=>{r.hooks.hookOnce(a,async()=>{await new Promise(f=>setTimeout(f,0)),e.hash&&(s={el:e.hash,top:Bi(e.hash),behavior:o}),c(s)})})}};function Bi(e){try{const t=document.querySelector(e);if(t)return parseFloat(getComputedStyle(t).scrollMarginTop)}catch{}return 0}const ig={hashMode:!1,scrollBehaviorType:"auto"},Me={...ig,...sg},lg=async e=>{var a;let t,n;if(!((a=e.meta)!=null&&a.validate))return;const r=ge(),o=et();if(([t,n]=Sn(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t)===!0)return;const i=Cr({statusCode:404,statusMessage:`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}}),l=o.beforeResolve(u=>{if(l(),u===e){const c=o.afterEach(async()=>{c(),await r.runWithContext(()=>Ut(i)),window.history.pushState({},"",e.fullPath)});return!1}})},ag=async e=>{let t,n;const r=([t,n]=Sn(()=>ms(e.path)),t=await t,n(),t);if(r.redirect)return $t(r.redirect,{acceptRelative:!0})?(window.location.href=r.redirect,!1):r.redirect},cg=[lg,ag],En={};function ug(e,t,n){const{pathname:r,search:o,hash:s}=t,i=e.indexOf("#");if(i>-1){const u=s.includes(e.slice(i))?e.slice(i).length:1;let c=s.slice(u);return c[0]!=="/"&&(c="/"+c),ai(c,"")}const l=ai(r,e),a=!n||rd(l,n,{trailingSlash:!0})?l:n;return a+(a.includes("?")?"":o)+s}const fg=Pt({name:"nuxt:router",enforce:"pre",async setup(e){var L,S;let t,n,r=hs().app.baseURL;Me.hashMode&&!r.includes("#")&&(r+="#");const o=((L=Me.history)==null?void 0:L.call(Me,r))??(Me.hashMode?Cp(r):Ka(r)),s=((S=Me.routes)==null?void 0:S.call(Me,Di))??Di;let i;const l=Qp({...Me,scrollBehavior:(y,m,_)=>{if(m===We){i=_;return}if(Me.scrollBehavior){if(l.options.scrollBehavior=Me.scrollBehavior,"scrollRestoration"in window.history){const w=l.beforeEach(()=>{w(),window.history.scrollRestoration="manual"})}return Me.scrollBehavior(y,We,i||_)}},history:o,routes:s});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(l);const a=Rn(l.currentRoute.value);l.afterEach((y,m)=>{a.value=m}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>a.value});const u=ug(r,window.location,e.payload.path),c=Rn(l.currentRoute.value),f=()=>{c.value=l.currentRoute.value};e.hook("page:finish",f),l.afterEach((y,m)=>{var _,w,E,k;((w=(_=y.matched[0])==null?void 0:_.components)==null?void 0:w.default)===((k=(E=m.matched[0])==null?void 0:E.components)==null?void 0:k.default)&&f()});const d={};for(const y in c.value)Object.defineProperty(d,y,{get:()=>c.value[y]});e._route=In(d),e._middleware=e._middleware||{global:[],named:{}};try{[t,n]=Sn(()=>l.isReady()),await t,n()}catch(y){[t,n]=Sn(()=>e.runWithContext(()=>Ut(y))),await t,n()}const g=u!==l.currentRoute.value.fullPath?l.resolve(u):l.currentRoute.value;f();const v=e.payload.state._layout;l.beforeEach(async(y,m)=>{var _;await e.callHook("page:loading:start"),y.meta=Tt(y.meta),e.isHydrating&&v&&!Xt(y.meta.layout)&&(y.meta.layout=v),e._processingMiddleware=!0;{const w=new Set([...cg,...e._middleware.global]);for(const E of y.matched){const k=E.meta.middleware;if(k)for(const A of bs(k))w.add(A)}{const E=await e.runWithContext(()=>ms(y.path));if(E.appMiddleware)for(const k in E.appMiddleware)E.appMiddleware[k]?w.add(k):w.delete(k)}for(const E of w){const k=typeof E=="string"?e._middleware.named[E]||await((_=En[E])==null?void 0:_.call(En).then($=>$.default||$)):E;if(!k)throw new Error(`Unknown route middleware: '${E}'.`);const A=await e.runWithContext(()=>k(y,m));if(!e.payload.serverRendered&&e.isHydrating&&(A===!1||A instanceof Error)){const $=A||Ao({statusCode:404,statusMessage:`Page Not Found: ${u}`});return await e.runWithContext(()=>Ut($)),!1}if(A!==!0&&(A||A===!1))return A}}}),l.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")});const T=Pr();return l.afterEach(async(y,m,_)=>{delete e._processingMiddleware,!e.isHydrating&&T.value&&await e.runWithContext(zd),_&&await e.callHook("page:loading:end"),y.matched.length===0&&await e.runWithContext(()=>Ut(Ao({statusCode:404,fatal:!1,statusMessage:`Page not found: ${y.fullPath}`,data:{path:y.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{"name"in g&&(g.name=void 0),await l.replace({...g,force:!0}),l.options.scrollBehavior=Me.scrollBehavior}catch(y){await e.runWithContext(()=>Ut(y))}}),{provide:{router:l}}}}),Vi=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),$m=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),Xa=e=>{const t=ge();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{Vi(e)}):Vi(e)},dg=Pt({name:"nuxt:payload",setup(e){et().beforeResolve(async(t,n)=>{if(t.path===n.path)return;const r=await bi(t.path);r&&Object.assign(e.static.data,r.data)}),Xa(()=>{var t;e.hooks.hook("link:prefetch",async n=>{Tr(n).protocol||await bi(n)}),((t=navigator.connection)==null?void 0:t.effectiveType)!=="slow-2g"&&setTimeout(Ar,1e3)})}}),hg=Pt(e=>{let t;async function n(){const r=await Ar();t&&clearTimeout(t),t=setTimeout(n,1e3*60*60);try{const o=await $fetch(ds("builds/latest.json")+`?${Date.now()}`);o.id!==r.id&&e.hooks.callHook("app:manifest:update",o)}catch{}}Xa(()=>{t=setTimeout(n,1e3*60*60)})}),pg=ee(()=>z(()=>import("./BOU-aCie.js"),__vite__mapDeps([26,27,28]),import.meta.url).then(e=>e.default||e.default||e)),gg=ee(()=>z(()=>import("./FwdM-4d8.js"),__vite__mapDeps([29,30]),import.meta.url).then(e=>e.default||e.default||e)),mg=ee(()=>z(()=>import("./_ufwR5o8.js"),__vite__mapDeps([20,13,5,6,7,8,21,9,10]),import.meta.url).then(e=>e.default||e.default||e)),yg=ee(()=>z(()=>import("./CZxlAbJ7.js"),__vite__mapDeps([31,21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),_g=ee(()=>z(()=>import("./YcXSTn_u.js"),__vite__mapDeps([32,9,8,10,2]),import.meta.url).then(e=>e.default||e.default||e)),vg=ee(()=>z(()=>import("./Cb50__Mb.js"),__vite__mapDeps([21,9,10,8]),import.meta.url).then(e=>e.default||e.default||e)),bg=ee(()=>z(()=>import("./DMFARuCF.js"),__vite__mapDeps([5,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),Eg=ee(()=>z(()=>import("./3fa5i0ew.js"),__vite__mapDeps([33,6,7,8]),import.meta.url).then(e=>e.default||e.default||e)),wg=ee(()=>z(()=>import("./C5JBqY-4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Rg=ee(()=>z(()=>import("./F9KTxAVD.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Tg=ee(()=>z(()=>import("./mKNKLkDI.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Pg=ee(()=>z(()=>import("./eKBtyYuL.js"),__vite__mapDeps([34,35]),import.meta.url).then(e=>e.default||e.default||e)),Cg=ee(()=>z(()=>import("./Ckubu9hk.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ag=ee(()=>z(()=>import("./DsFcf1tA.js"),__vite__mapDeps([36,27,28,37]),import.meta.url).then(e=>e.default||e.default||e)),Sg=ee(()=>z(()=>import("./DvvkLF7V.js"),__vite__mapDeps([38,2]),import.meta.url).then(e=>e.default||e.default||e)),xg=ee(()=>z(()=>import("./Cw7TSr0H.js"),[],import.meta.url).then(e=>e.default||e.default||e)),kg=ee(()=>z(()=>import("./B54bitx_.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Lg=ee(()=>z(()=>import("./Ya7nsG7s.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Og=ee(()=>z(()=>import("./21sqjsY3.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ig=ee(()=>z(()=>import("./Cfp4urEI.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Hg=ee(()=>z(()=>import("./BTfD_XlD.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Mg=ee(()=>z(()=>import("./CaXXO5HX.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ng=ee(()=>z(()=>import("./CI0Itg7s.js"),[],import.meta.url).then(e=>e.default||e.default||e)),$g=ee(()=>z(()=>import("./DN_H2i4g.js"),[],import.meta.url).then(e=>e.default||e.default||e)),jg=ee(()=>z(()=>import("./CukA5Xl1.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Dg=ee(()=>z(()=>import("./BaQW3ob4.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Fg=ee(()=>z(()=>import("./B8xSpQ_7.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Bg=ee(()=>z(()=>import("./CW_zoPMf.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Vg=ee(()=>z(()=>import("./Ck8lORen.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Ug=ee(()=>z(()=>import("./6Heezgxy.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Wg=ee(()=>z(()=>import("./C3TgqYuk.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Kg=ee(()=>z(()=>import("./WX_X95mj.js"),[],import.meta.url).then(e=>e.default||e.default||e)),qg=ee(()=>z(()=>import("./B-TIRWGp.js"),[],import.meta.url).then(e=>e.default||e.default||e)),zg=ee(()=>z(()=>import("./BasclreZ.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Gg=ee(()=>z(()=>import("./h4BmERJ-.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Jg=ee(()=>z(()=>import("./BNzAhPet.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Qg=ee(()=>z(()=>import("./CGDdIL0g.js"),[],import.meta.url).then(e=>e.default||e.default||e)),Xg=[["ProseCode",pg],["Quote",gg],["ContentDoc",mg],["ContentList",yg],["ContentNavigation",_g],["ContentQuery",vg],["ContentRenderer",bg],["ContentRendererMarkdown",Eg],["MDCSlot",wg],["DocumentDrivenEmpty",Rg],["DocumentDrivenNotFound",Tg],["Markdown",Pg],["ProseCodeInline",Cg],["ProsePre",Ag],["ProseA",Sg],["ProseBlockquote",xg],["ProseEm",kg],["ProseH1",Lg],["ProseH2",Og],["ProseH3",Ig],["ProseH4",Hg],["ProseH5",Mg],["ProseH6",Ng],["ProseHr",$g],["ProseImg",jg],["ProseLi",Dg],["ProseOl",Fg],["ProseP",Bg],["ProseScript",Vg],["ProseStrong",Ug],["ProseTable",Wg],["ProseTbody",Kg],["ProseTd",qg],["ProseTh",zg],["ProseThead",Gg],["ProseTr",Jg],["ProseUl",Qg]],Yg=Pt({name:"nuxt:global-components",setup(e){for(const[t,n]of Xg)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),_t={default:()=>z(()=>import("./Ci9wJC62.js"),__vite__mapDeps([39,2,13,40]),import.meta.url).then(e=>e.default||e)},Zg=Pt({name:"nuxt:prefetch",setup(e){const t=et();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{var o;const r=(o=n==null?void 0:n.meta)==null?void 0:o.layout;r&&typeof _t[r]=="function"&&await _t[r]()})}),e.hooks.hook("link:prefetch",n=>{if($t(n))return;const r=t.resolve(n);if(!r)return;const o=r.meta.layout;let s=bs(r.meta.middleware);s=s.filter(i=>typeof i=="string");for(const i of s)typeof En[i]=="function"&&En[i]();o&&typeof _t[o]=="function"&&_t[o]()})}});function em(e={}){const t=e.path||window.location.pathname;let n={};try{n=cr(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||(n==null?void 0:n.path)!==t||(n==null?void 0:n.expires){r.clear()}),e.hook("app:chunkError",({error:s})=>{r.add(s)});function o(s){const l="href"in s&&s.href[0]==="#"?n.app.baseURL+s.href:us(n.app.baseURL,s.fullPath);em({path:l,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(o)}),t.onError((s,i)=>{r.has(s)&&o(i)})}}),nm=[zh,Jh,fg,dg,hg,Yg,Zg,tm];function rm(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function om(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:r=500,resetDelay:o=400}=e,s=e.estimatedProgress||rm,i=ge(),l=qe(0),a=qe(!1);let u=!1,c,f,d,g;const v=()=>T(0);function T(E=0){if(!i.isHydrating){if(E>=100)return S();m(),l.value=E<0?0:E,n?f=setTimeout(()=>{a.value=!0,_()},n):(a.value=!0,_())}}function L(){d=setTimeout(()=>{a.value=!1,g=setTimeout(()=>{l.value=0},o)},r)}function S(E={}){l.value=100,u=!0,m(),y(),E.force?(l.value=0,a.value=!1):L()}function y(){clearTimeout(d),clearTimeout(g)}function m(){clearTimeout(f),cancelAnimationFrame(c)}function _(){u=!1;let E;function k(A){if(u)return;E??(E=A);const $=A-E;l.value=Math.max(0,Math.min(100,s(t,$))),c=requestAnimationFrame(k)}c=requestAnimationFrame(k)}let w=()=>{};{const E=i.hook("page:loading:start",()=>{v()}),k=i.hook("page:loading:end",()=>{S()}),A=i.hook("vue:error",()=>S());w=()=>{A(),E(),k(),m()}}return{_cleanup:w,progress:Le(()=>l.value),isLoading:Le(()=>a.value),start:v,set:T,finish:S,clear:m}}function sm(e={}){const t=ge(),n=t._loadingIndicator=t._loadingIndicator||om(e);return el()&&(t._loadingIndicatorDeps=t._loadingIndicatorDeps||0,t._loadingIndicatorDeps++,pc(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const im=ot({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:r,isLoading:o,start:s,finish:i,clear:l}=sm({duration:e.duration,throttle:e.throttle,estimatedProgress:e.estimatedProgress});return n({progress:r,isLoading:o,start:s,finish:i,clear:l}),()=>Oe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:o.value?1:0,background:e.color||void 0,backgroundSize:`${100/r.value*100}% auto`,transform:`scaleX(${r.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}}),lm=ot({props:{vnode:{type:Object,required:!0},route:{type:Object,required:!0},vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(e){const t=e.renderKey,n=e.route,r={};for(const o in e.route)Object.defineProperty(r,o,{get:()=>t===e.renderKey?e.route[o]:n[o]});return Ht($n,In(r)),()=>Oe(e.vnode,{ref:e.vnodeRef})}}),am=ot({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(e,{attrs:t,expose:n}){const r=ge(),o=qe(),s=Se($n,null);let i;n({pageRef:o});const l=Se(Ca,null);let a;const u=r.deferHydration();if(r.isHydrating){const c=r.hooks.hookOnce("app:error",u);et().beforeEach(c)}return e.pageKey&&Jt(()=>e.pageKey,(c,f)=>{c!==f&&r.callHook("page:loading:start")}),()=>Oe(Ja,{name:e.name,route:e.route,...t},{default:c=>{const f=um(s,c.route,c.Component),d=s&&s.matched.length===c.route.matched.length;if(!c.Component){if(a&&!d)return a;u();return}if(a&&l&&!l.isCurrent(c.route))return a;if(f&&s&&(!l||l!=null&&l.isCurrent(s)))return d?a:null;const g=No(c,e.pageKey);!r.isHydrating&&!fm(s,c.route,c.Component)&&i===g&&r.callHook("page:loading:end"),i=g;const v=!!(e.transition??c.route.meta.pageTransition??Oo),T=v&&cm([e.transition,c.route.meta.pageTransition,Oo,{onAfterLeave:()=>{r.callHook("page:transition:finish",c.Component)}}].filter(Boolean)),L=e.keepalive??c.route.meta.keepalive??Dh;return a=Qa(Rr,v&&T,eg(L,Oe(Zo,{suspensible:!0,onPending:()=>r.callHook("page:start",c.Component),onResolve:()=>{sn(()=>r.callHook("page:finish",c.Component).then(()=>r.callHook("page:loading:end")).finally(u))}},{default:()=>{const S=Oe(lm,{key:g||void 0,vnode:c.Component,route:c.route,renderKey:g||void 0,trackRootNodes:v,vnodeRef:o});return L&&(S.type.name=c.Component.type.name||c.Component.type.__name||"RouteProvider"),S}}))).default(),a}})}});function cm(e){const t=e.map(n=>({...n,onAfterLeave:n.onAfterLeave?bs(n.onAfterLeave):void 0}));return Ta(...t)}function um(e,t,n){if(!e)return!1;const r=t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)});return!r||r===-1?!1:t.matched.slice(0,r).some((o,s)=>{var i,l,a;return((i=o.components)==null?void 0:i.default)!==((a=(l=e.matched[s])==null?void 0:l.components)==null?void 0:a.default)})||n&&No({route:t,Component:n})!==No({route:e,Component:n})}function fm(e,t,n){return e?t.matched.findIndex(o=>{var s;return((s=o.components)==null?void 0:s.default)===(n==null?void 0:n.type)})r.default||r);return()=>Oe(n,e.layoutProps,t.slots)}}),hm=ot({name:"NuxtLayout",inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(e,t){const n=ge(),r=Se($n),o=r===ps()?Yp():r,s=Le(()=>{let a=ue(e.name)??o.meta.layout??"default";return a&&!(a in _t)&&e.fallback&&(a=ue(e.fallback)),a}),i=qe();t.expose({layoutRef:i});const l=n.deferHydration();if(n.isHydrating){const a=n.hooks.hookOnce("app:error",l);et().beforeEach(a)}return()=>{const a=s.value&&s.value in _t,u=o.meta.layoutTransition??jh;return Qa(Rr,a&&u,{default:()=>Oe(Zo,{suspensible:!0,onResolve:()=>{sn(l)}},{default:()=>Oe(pm,{layoutProps:ra(t.attrs,{ref:i}),key:s.value||void 0,name:s.value,shouldProvide:!e.name,hasTransition:!!u},t.slots)})}).default()}}}),pm=ot({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean}},setup(e,t){const n=e.name;return e.shouldProvide&&Ht(Ca,{isCurrent:r=>n===(r.meta.layout??"default")}),()=>{var r,o;return!n||typeof n=="string"&&!(n in _t)?(o=(r=t.slots).default)==null?void 0:o.call(r):Oe(dm,{key:n,layoutProps:e.layoutProps,name:n},t.slots)}}}),gm=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},mm={};function ym(e,t){const n=im,r=am,o=hm;return Ye(),Vu(Ae,null,[fe(n,{color:"#18caf9",height:2}),fe(o,null,{default:Xo(()=>[fe(r)]),_:1})],64)}const _m=gm(mm,[["render",ym]]),vm={__name:"nuxt-error-page",props:{error:Object},setup(e){const n=e.error;n.stack&&n.stack.split(` +`).splice(1).map(f=>({text:f.replace("webpack:/","").replace(".vue",".js").trim(),internal:f.includes("node_modules")&&!f.includes(".cache")||f.includes("internal")||f.includes("new Promise")})).map(f=>`${f.text}`).join(` +`);const r=Number(n.statusCode||500),o=r===404,s=n.statusMessage??(o?"Page Not Found":"Internal Server Error"),i=n.message||n.toString(),l=void 0,c=o?ee(()=>z(()=>import("./Cw0Mq-1J.js"),__vite__mapDeps([41,2,13,42]),import.meta.url).then(f=>f.default||f)):ee(()=>z(()=>import("./C4g8nH2O.js"),__vite__mapDeps([43,13,44]),import.meta.url).then(f=>f.default||f));return(f,d)=>(Ye(),yt(ue(c),cc(ta({statusCode:ue(r),statusMessage:ue(s),description:ue(i),stack:ue(l)})),null,16))}},Ui={__name:"nuxt-root",setup(e){const t=()=>null,n=ge(),r=n.deferHydration();if(n.isHydrating){const l=n.hooks.hookOnce("app:error",r);et().beforeEach(l)}const o=!1;Ht($n,ps()),n.hooks.callHookWith(l=>l.map(a=>a()),"vue:setup");const s=Pr();Hl((l,a,u)=>{if(n.hooks.callHook("vue:error",l,a,u).catch(c=>console.error("[nuxt] Error in `vue:error` hook",c)),Gd(l)&&(l.fatal||l.unhandled))return n.runWithContext(()=>Ut(l)),!1});const i=!1;return(l,a)=>(Ye(),yt(Zo,{onResolve:ue(r)},{default:Xo(()=>[ue(s)?(Ye(),yt(ue(vm),{key:0,error:ue(s)},null,8,["error"])):ue(i)?(Ye(),yt(ue(t),{key:1,context:ue(i)},null,8,["context"])):ue(o)?(Ye(),yt(Yc(ue(o)),{key:2})):(Ye(),yt(ue(_m),{key:3}))]),_:1},8,["onResolve"]))}};let Wi;{let e;Wi=async function(){var i,l;if(e)return e;const r=!!((i=window.__NUXT__)!=null&&i.serverRendered||((l=document.getElementById("__NUXT_DATA__"))==null?void 0:l.dataset.ssr)==="true")?Af(Ui):Cf(Ui),o=Id({vueApp:r});async function s(a){await o.callHook("app:error",a),o.payload.error=o.payload.error||Cr(a)}r.config.errorHandler=s;try{await Md(o,nm)}catch(a){s(a)}try{await o.hooks.callHook("app:created",r),await o.hooks.callHook("app:beforeMount",r),r.mount(Fh),await o.hooks.callHook("app:mounted",r),await sn()}catch(a){s(a)}return r.config.errorHandler===s&&(r.config.errorHandler=void 0),r},e=Wi().catch(t=>{throw console.error("Error while mounting app:",t),t})}export{Te as $,Lm as A,mr as B,yr as C,Jt as D,sn as E,Ae as F,xm as G,wo as H,Oe as I,z as J,Vc as K,Pe as L,td as M,li as N,us as O,cs as P,Nm as Q,qe as R,Rn as S,mu as T,Il as U,pc as V,el as W,re as X,Pm as Y,Yt as Z,gm as _,ea as a,cr as a0,Em as a1,et as a2,ns as a3,Xa as a4,Vi as a5,rs as a6,$m as a7,Tr as a8,Wf as a9,Mm as aa,Im as ab,$t as ac,Hm as ad,Cm as ae,pu as af,hu as ag,xo as ah,fe as b,Vu as c,na as d,Tm as e,ot as f,yt as g,km as h,ue as i,Se as j,Le as k,Sm as l,Om as m,ra as n,Ye as o,Rm as p,ps as q,Am as r,Cr as s,bm as t,hs as u,wm as v,Xo as w,Tt as x,ge as y,Mn as z}; diff --git a/_nuxt/Djecwb_v.js b/_nuxt/Djecwb_v.js new file mode 100644 index 0000000..1a50d7c --- /dev/null +++ b/_nuxt/Djecwb_v.js @@ -0,0 +1 @@ +import{a2 as _,f as B,k as b,R as P,a3 as w,a4 as L,a5 as N,a6 as T,a7 as I,I as C,Y as O,O as U,a8 as j,a9 as V,aa as D,u as E,y as q,ab as F,ac as R,H,P as z}from"./DiyP6pou.js";async function k(t,r=_()){const{path:s,matched:e}=r.resolve(t);if(!e.length||(r._routePreloaded||(r._routePreloaded=new Set),r._routePreloaded.has(s)))return;const n=r._preloadPromises=r._preloadPromises||[];if(n.length>4)return Promise.all(n).then(()=>k(t,r));r._routePreloaded.add(s);const i=e.map(u=>{var a;return(a=u.components)==null?void 0:a.default}).filter(u=>typeof u=="function");for(const u of i){const a=Promise.resolve(u()).catch(()=>{}).finally(()=>n.splice(n.indexOf(a)));n.push(a)}await Promise.all(n)}const M=(...t)=>t.find(r=>r!==void 0);function $(t){const r=t.componentName||"NuxtLink";function s(e,n){if(!e||t.trailingSlash!=="append"&&t.trailingSlash!=="remove")return e;if(typeof e=="string")return S(e,t.trailingSlash);const i="path"in e&&e.path!==void 0?e.path:n(e).path;return{...e,name:void 0,path:S(i,t.trailingSlash)}}return B({name:r,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(e,{slots:n}){const i=_(),u=E(),a=b(()=>{const l=e.to||e.href||"";return s(l,i.resolve)}),f=b(()=>typeof a.value=="string"&&R(a.value,{acceptRelative:!0})),g=b(()=>e.target&&e.target!=="_self"),p=b(()=>e.external||g.value?!0:typeof a.value=="object"?!1:a.value===""||f.value),x=P(!1),v=P(null),A=l=>{var d;v.value=e.custom?(d=l==null?void 0:l.$el)==null?void 0:d.nextElementSibling:l==null?void 0:l.$el};if(e.prefetch!==!1&&e.noPrefetch!==!0&&e.target!=="_blank"&&!W()){const d=q();let h,o=null;w(()=>{const y=Q();L(()=>{h=N(()=>{var c;(c=v==null?void 0:v.value)!=null&&c.tagName&&(o=y.observe(v.value,async()=>{o==null||o(),o=null;const m=typeof a.value=="string"?a.value:i.resolve(a.value).fullPath;await Promise.all([d.hooks.callHook("link:prefetch",m).catch(()=>{}),!p.value&&k(a.value,i).catch(()=>{})]),x.value=!0}))})})}),T(()=>{h&&I(h),o==null||o(),o=null})}return()=>{var o,y;if(!p.value){const c={ref:A,to:a.value,activeClass:e.activeClass||t.activeClass,exactActiveClass:e.exactActiveClass||t.exactActiveClass,replace:e.replace,ariaCurrentValue:e.ariaCurrentValue,custom:e.custom};return e.custom||(x.value&&(c.class=e.prefetchedClass||t.prefetchedClass),c.rel=e.rel||void 0),C(O("RouterLink"),c,n.default)}const l=typeof a.value=="object"?((o=i.resolve(a.value))==null?void 0:o.href)??null:a.value&&!e.external&&!f.value?s(U(u.app.baseURL,a.value),i.resolve):a.value||null,d=e.target||null,h=M(e.noRel?"":e.rel,t.externalRelAttribute,f.value||g.value?"noopener noreferrer":"")||null;if(e.custom){if(!n.default)return null;const c=()=>F(l,{replace:e.replace,external:e.external});return n.default({href:l,navigate:c,get route(){if(!l)return;const m=j(l);return{path:m.pathname,fullPath:m.pathname,get query(){return V(m.search)},hash:m.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:l}},rel:h,target:d,isExternal:p.value,isActive:!1,isExactActive:!1})}return C("a",{ref:v,href:l,rel:h,target:d},(y=n.default)==null?void 0:y.call(n))}}})}const G=$(D);function S(t,r){const s=r==="append"?H:z;return R(t)&&!t.startsWith("http")?t:s(t,!0)}function Q(){const t=q();if(t._observer)return t._observer;let r=null;const s=new Map,e=(i,u)=>(r||(r=new IntersectionObserver(a=>{for(const f of a){const g=s.get(f.target);(f.isIntersecting||f.intersectionRatio>0)&&g&&g()}})),s.set(i,u),r.observe(i),()=>{s.delete(i),r.unobserve(i),s.size===0&&(r.disconnect(),r=null)});return t._observer={observe:e}}function W(){const t=navigator.connection;return!!(t&&(t.saveData||/2g/.test(t.effectiveType)))}export{G as _}; diff --git a/_nuxt/J2jEMbcE.js b/_nuxt/DsFcf1tA.js similarity index 82% rename from _nuxt/J2jEMbcE.js rename to _nuxt/DsFcf1tA.js index f3618c4..4f73593 100644 --- a/_nuxt/J2jEMbcE.js +++ b/_nuxt/DsFcf1tA.js @@ -1 +1 @@ -import{_ as l}from"./BnI7OW5X.js";import{f as n,o as s,g as i,w as o,a as r,D as g,C as u,l as f}from"./BlS8upJP.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,m)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[f(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; +import{_ as l}from"./Bh_R0szF.js";import{f as n,o as s,g as i,w as o,a as r,C as g,B as u,l as f}from"./DiyP6pou.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,m)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[f(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; diff --git a/_nuxt/Du8iVdrZ.js b/_nuxt/Du8iVdrZ.js new file mode 100644 index 0000000..d039485 --- /dev/null +++ b/_nuxt/Du8iVdrZ.js @@ -0,0 +1 @@ +import{_ as y}from"./Djecwb_v.js";import k from"./DMFARuCF.js";import{u as v}from"./BqUvtMHT.js";import{q}from"./DEZhdWR8.js";import{f as w,h as x,o as s,c as o,i as t,a as n,b as c,w as h,d as p,F as C,r as N,t as r,m as a,l as S}from"./DiyP6pou.js";const B={class:"blog-outer"},V={key:0,class:"blog-wrapper"},I={class:"blog-meta"},$={key:0,class:"blog-breadcrumbs"},A={class:"crumb"},D=n("span",{class:"sep"},"›",-1),F={class:"crumb"},H={key:0,class:"sep"},L={key:1,class:"blog-download"},P={key:0,class:"blog-header"},R={key:0},E=["href"],O={key:1},T={key:2},j={key:3,class:"blog-created-date"},z={key:0},Y=w({__name:"BlogPage",props:{path:{type:String,required:!0},link:{type:String,required:!1},formId:{type:String,require:!1}},async setup(d){let i,l;const{path:_,link:G,formId:J}=d,{data:e}=([i,l]=x(()=>v("blog-post-"+_,()=>q(_).findOne(),"$fqRr3791H4")),i=await i,l(),i);return(b,K)=>{const u=y,f=k;return s(),o("div",B,[t(e)?(s(),o("div",V,[n("div",I,[t(e).breadcrumbs?(s(),o("div",$,[n("div",A,[c(u,{to:"/"},{default:h(()=>[p("Home")]),_:1}),D]),(s(!0),o(C,null,N(t(e).breadcrumbs,(m,g)=>(s(),o("div",F,[c(u,{to:m.path},{default:h(()=>[p(r(m.name),1)]),_:2},1032,["to"]),g!=t(e).breadcrumbs.length-1?(s(),o("span",H,"›")):a("",!0)]))),256))])):a("",!0),t(e).formId?(s(),o("div",L)):a("",!0)]),t(e)&&(t(e).title||t(e).subtitle)?(s(),o("div",P,[t(e).link?(s(),o("h1",R,[n("a",{href:t(e).link},r(t(e).title),9,E)])):(s(),o("h1",O,r(t(e).title),1)),t(e).subtitle?(s(),o("h3",T,r(t(e).subtitle),1)):a("",!0),t(e).created?(s(),o("div",j,r(t(e).created.string),1)):a("",!0)])):a("",!0),n("section",null,[d.path?(s(),o("div",z,[c(f,{value:t(e)},null,8,["value"])])):a("",!0),S(b.$slots,"default")])])):a("",!0)])}}});export{Y as _}; diff --git a/_nuxt/DkuQMAl2.js b/_nuxt/DvvkLF7V.js similarity index 65% rename from _nuxt/DkuQMAl2.js rename to _nuxt/DvvkLF7V.js index 0588705..eb9d2db 100644 --- a/_nuxt/DkuQMAl2.js +++ b/_nuxt/DvvkLF7V.js @@ -1 +1 @@ -import{_ as a}from"./CFzORWKb.js";import{f as o,o as n,g as f,w as s,l}from"./BlS8upJP.js";const i=o({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,u)=>{const r=a;return n(),f(r,{href:e.href,target:e.target},{default:s(()=>[l(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; +import{_ as a}from"./Djecwb_v.js";import{f as o,o as n,g as f,w as s,l}from"./DiyP6pou.js";const i=o({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,u)=>{const r=a;return n(),f(r,{href:e.href,target:e.target},{default:s(()=>[l(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; diff --git a/_nuxt/DzaeZ-yb.js b/_nuxt/DzaeZ-yb.js new file mode 100644 index 0000000..8e91a72 --- /dev/null +++ b/_nuxt/DzaeZ-yb.js @@ -0,0 +1 @@ +import{_ as t}from"./Du8iVdrZ.js";import{f as i,g as r,o as p}from"./DiyP6pou.js";import"./Djecwb_v.js";import"./DMFARuCF.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const u=i({__name:"how-playwright-initializes",setup(a){return(e,m)=>{const o=t;return p(),r(o,{title:"How importing from Playwright works",path:"playwright/how-playwright-initializes"})}}});export{u as default}; diff --git a/_nuxt/N8b39uzv.js b/_nuxt/F9KTxAVD.js similarity index 77% rename from _nuxt/N8b39uzv.js rename to _nuxt/F9KTxAVD.js index ee31f16..150a9ed 100644 --- a/_nuxt/N8b39uzv.js +++ b/_nuxt/F9KTxAVD.js @@ -1 +1 @@ -import{f as n,J as e}from"./BlS8upJP.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; +import{f as n,I as e}from"./DiyP6pou.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; diff --git a/_nuxt/FwdM-4d8.js b/_nuxt/FwdM-4d8.js new file mode 100644 index 0000000..78bbfda --- /dev/null +++ b/_nuxt/FwdM-4d8.js @@ -0,0 +1 @@ +import{f as i,o as s,c as o,a as t,t as a,F as c,r as d,m as u,l as m}from"./DiyP6pou.js";const p={class:"quote-wrapper"},f={key:0,class:"col-left"},g=["src"],h={class:"titles"},y=["href"],_={class:"col-right"},S=i({__name:"Quote",props:{image:{type:String},name:{type:String},titles:{type:Object,default:()=>[],validator:e=>e.every(n=>typeof n.title=="string"&&typeof n.link=="string")}},setup(e){return console.log("props",e),(l,k)=>(s(),o("blockquote",p,[e.image?(s(),o("div",f,[t("img",{src:e.image},null,8,g),t("div",h,[t("span",null,a(e.name),1),(s(!0),o(c,null,d(e.titles.titles,r=>(s(),o("a",{href:r.link,key:r.link},a(r.title),9,y))),128))])])):u("",!0),t("div",_,[t("p",null,[m(l.$slots,"default")])])]))}});export{S as default}; diff --git a/_nuxt/ProseCode.DPIjDHas.css b/_nuxt/ProseCode.C53feiBF.css similarity index 90% rename from _nuxt/ProseCode.DPIjDHas.css rename to _nuxt/ProseCode.C53feiBF.css index bcd1935..ebfe81d 100644 --- a/_nuxt/ProseCode.DPIjDHas.css +++ b/_nuxt/ProseCode.C53feiBF.css @@ -1 +1 @@ -.code-outer{background:#100c09;border:1px solid #a9a8a6;border-radius:.5rem;overflow:hidden}.code-outer .code-title{align-items:center;border-bottom:1px solid #a9a8a6;color:#79b8ff;display:flex;flex-direction:row;padding:.5rem 1rem}.code-outer .code-title .icon-wrapper{display:inline-block;margin-bottom:auto;margin-right:.5rem;margin-top:auto}.code-outer .code-title .icon-wrapper .icon-title path{fill:#79b8ff}.code-outer pre code .line{display:block;min-height:1rem}.code-outer pre.language-console code span{color:#f5f5f3}.code-outer pre.shiki{background:#100c09;overflow-x:auto;padding:1rem;scrollbar-width:thin}.code-outer pre.shiki code{background:none;color:initial;padding:0} +.code-outer{background:#100c09;border:1px solid #a9a8a6;border-radius:.5rem;overflow:hidden}.code-outer .code-title{align-items:center;border-bottom:1px solid #a9a8a6;color:#79b8ff;display:flex;flex-direction:row;padding:.5rem 1rem}.code-outer .code-title .icon-wrapper{display:inline-block;margin-bottom:auto;margin-right:.5rem;margin-top:auto}.code-outer .code-title .icon-wrapper .icon-title path{fill:#79b8ff}.code-outer pre code .line{display:block;min-height:1rem}.code-outer pre.language-console code span{color:#f5f6f1}.code-outer pre.shiki{background:#100c09;overflow-x:auto;padding:1rem;scrollbar-width:thin}.code-outer pre.shiki code{background:none;color:initial;padding:0} diff --git a/_nuxt/Quote.DvdHt3k9.css b/_nuxt/Quote.DvdHt3k9.css new file mode 100644 index 0000000..157982f --- /dev/null +++ b/_nuxt/Quote.DvdHt3k9.css @@ -0,0 +1 @@ +.quote-wrapper{align-items:center;display:flex;flex-direction:row;padding:1rem 1.5rem}.quote-wrapper .col-left{flex-shrink:0;padding-right:1.5rem;width:-moz-fit-content;width:fit-content}.quote-wrapper .col-left img{border-radius:60px;height:120px;width:120px}.quote-wrapper .col-left .titles{display:flex;flex-direction:column;padding-top:.5rem;text-align:center}.quote-wrapper .col-left .titles a{color:var(--main);display:block;font-weight:700;text-decoration:underline}.quote-wrapper .col-right p{padding-bottom:0} diff --git a/_nuxt/Testimonial.B-jLyaoL.css b/_nuxt/Testimonial.B-jLyaoL.css new file mode 100644 index 0000000..46faed6 --- /dev/null +++ b/_nuxt/Testimonial.B-jLyaoL.css @@ -0,0 +1 @@ +.testimonial-wrapper[data-v-88349176]{align-items:center;display:flex;flex-direction:row;width:100%}.testimonial-wrapper .left[data-v-88349176]{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.testimonial-wrapper .left .image-wrapper[data-v-88349176]{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.testimonial-wrapper .left .image-wrapper .image-container[data-v-88349176]{background-position:50%;background-size:cover;height:100%;width:100%}.testimonial-wrapper .left .brand-wrapper[data-v-88349176]{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.testimonial-wrapper .right .text-wrapper[data-v-88349176]{background:#ffffff26;border-radius:.5rem;display:block;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.testimonial-wrapper .right .text-wrapper svg[data-v-88349176]{display:block;flex-shrink:0;float:left;height:64px;margin-right:1rem;width:64px}.testimonial-wrapper .right .text-wrapper .text[data-v-88349176]{margin-bottom:auto;margin-top:auto}.testimonial-wrapper .right .text-wrapper .text a[data-v-88349176]{color:#18caf9}.testimonial-wrapper .right .text-wrapper .text span[data-v-88349176]{display:inline}.testimonial-wrapper .right .text-wrapper .text .name[data-v-88349176]{display:block;font-style:normal;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer[data-v-88349176]{padding-top:1rem;width:100%}.testimonial-wrapper .right .see-more-outer .see-more-wrapper[data-v-88349176]{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer .see-more-wrapper .see-more-text[data-v-88349176]{padding-right:.5rem}@media (max-width:768px){.testimonial-wrapper[data-v-88349176]{flex-direction:column}.testimonial-wrapper .left[data-v-88349176]{align-items:center;margin-right:0;max-width:100%}.testimonial-wrapper .left .image-wrapper[data-v-88349176]{margin-bottom:1.5rem}.testimonial-wrapper .right .text-wrapper[data-v-88349176]{font-size:1.5rem;line-height:2rem;line-height:1.6;padding:1rem}.testimonial-wrapper .right .text-wrapper svg[data-v-88349176]{height:48px;margin-right:.5rem;width:48px}} diff --git a/_nuxt/Testimonial.BamnguDL.css b/_nuxt/Testimonial.BamnguDL.css deleted file mode 100644 index eafbbbc..0000000 --- a/_nuxt/Testimonial.BamnguDL.css +++ /dev/null @@ -1 +0,0 @@ -.testimonial-wrapper[data-v-97758cd8]{align-items:center;display:flex;flex-direction:row;width:100%}.testimonial-wrapper .left[data-v-97758cd8]{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.testimonial-wrapper .left .image-wrapper[data-v-97758cd8]{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.testimonial-wrapper .left .image-wrapper .image-container[data-v-97758cd8]{background-position:50%;background-size:cover;height:100%;width:100%}.testimonial-wrapper .left .brand-wrapper[data-v-97758cd8]{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.testimonial-wrapper .right .text-wrapper[data-v-97758cd8]{background:#ffffff26;border-radius:.5rem;display:block;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.testimonial-wrapper .right .text-wrapper svg[data-v-97758cd8]{display:block;flex-shrink:0;float:left;height:64px;margin-right:1rem;width:64px}.testimonial-wrapper .right .text-wrapper .text[data-v-97758cd8]{margin-bottom:auto;margin-top:auto}.testimonial-wrapper .right .text-wrapper .text a[data-v-97758cd8]{color:#18caf9}.testimonial-wrapper .right .text-wrapper .text span[data-v-97758cd8]{display:inline}.testimonial-wrapper .right .text-wrapper .text .name[data-v-97758cd8]{display:block;font-style:normal;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer[data-v-97758cd8]{padding-top:1rem;width:100%}.testimonial-wrapper .right .see-more-outer .see-more-wrapper[data-v-97758cd8]{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.testimonial-wrapper .right .see-more-outer .see-more-wrapper .see-more-text[data-v-97758cd8]{padding-right:.5rem}@media (max-width:768px){.testimonial-wrapper[data-v-97758cd8]{flex-direction:column}.testimonial-wrapper .left[data-v-97758cd8]{align-items:center;margin-right:0;max-width:100%}.testimonial-wrapper .left .image-wrapper[data-v-97758cd8]{margin-bottom:1.5rem}.testimonial-wrapper .right .text-wrapper[data-v-97758cd8]{font-size:1.5rem;line-height:2rem;line-height:1.6;padding:1rem}.testimonial-wrapper .right .text-wrapper svg[data-v-97758cd8]{height:48px;margin-right:.5rem;width:48px}} diff --git a/_nuxt/DbrryaCF.js b/_nuxt/WX_X95mj.js similarity index 65% rename from _nuxt/DbrryaCF.js rename to _nuxt/WX_X95mj.js index 9cb9113..1a6478a 100644 --- a/_nuxt/DbrryaCF.js +++ b/_nuxt/WX_X95mj.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./DiyP6pou.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/ByDkrM4K.js b/_nuxt/Ya7nsG7s.js similarity index 70% rename from _nuxt/ByDkrM4K.js rename to _nuxt/Ya7nsG7s.js index 8b614c5..35fbf50 100644 --- a/_nuxt/ByDkrM4K.js +++ b/_nuxt/Ya7nsG7s.js @@ -1 +1 @@ -import{f as c,u as d,k as u,o as s,c as t,i as f,l as n}from"./BlS8upJP.js";const l=["id"],p=["href"],k=c({__name:"ProseH1",props:{id:{}},setup(r){const a=r,{headings:o}=d().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[f(i)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,p)):n(e.$slots,"default",{key:1})],8,l))}});export{k as default}; +import{f as c,u as d,k as u,o as s,c as t,i as f,l as n}from"./DiyP6pou.js";const l=["id"],p=["href"],k=c({__name:"ProseH1",props:{id:{}},setup(r){const a=r,{headings:o}=d().public.mdc,i=u(()=>{var e;return a.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[f(i)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,p)):n(e.$slots,"default",{key:1})],8,l))}});export{k as default}; diff --git a/_nuxt/X2wNORNR.js b/_nuxt/YcXSTn_u.js similarity index 71% rename from _nuxt/X2wNORNR.js rename to _nuxt/YcXSTn_u.js index f46aff6..06fb4c6 100644 --- a/_nuxt/X2wNORNR.js +++ b/_nuxt/YcXSTn_u.js @@ -1,7 +1,2 @@ -function __vite__mapDeps(indexes) { - if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["./CFwVd7gV.js","./BlS8upJP.js","./entry.DiT2Mvoi.css","./DF1VbFfH.js","./BECgZIvk.js","./BsYmvPZw.js"] - } - return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) -} -import{u as m}from"./CRh1_mKz.js";import{u as v,K as l,L as d,M as g,y,f as h,v as _,k as w,H as C,J as p}from"./BlS8upJP.js";import{h as f,u as P}from"./BECgZIvk.js";import{q as $,w as c,e as x,s as N,j as E,u as T}from"./DF1VbFfH.js";import{_ as j}from"./CFzORWKb.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=$(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${x(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(N())return(await l(()=>import("./CFwVd7gV.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:P().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(j,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; +const __vite__fileDeps=["./BWKb2ttN.js","./DiyP6pou.js","./entry.DrGH3nHD.css","./DEZhdWR8.js","./BpUWW4O-.js","./C-v3KzvZ.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{u as m}from"./BqUvtMHT.js";import{u as v,J as l,K as d,L as g,y,f as h,v as _,k as w,G as C,I as p}from"./DiyP6pou.js";import{h as f,u as P}from"./BpUWW4O-.js";import{q as $,w as c,e as x,s as N,j as E,u as T}from"./DEZhdWR8.js";import{_ as j}from"./Djecwb_v.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=$(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${x(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(N())return(await l(()=>import("./BWKb2ttN.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:P().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(j,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; diff --git a/_nuxt/ZkJgmw7I.js b/_nuxt/ZkJgmw7I.js deleted file mode 100644 index 574246d..0000000 --- a/_nuxt/ZkJgmw7I.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./BneHlRLI.js";import{u as o}from"./maW11VfC.js";import{f as r,g as i,o as n}from"./BlS8upJP.js";import"./CFzORWKb.js";import"./BxiCSTFT.js";import"./DQv0CMQg.js";import"./BsYmvPZw.js";import"./BECgZIvk.js";import"./CRh1_mKz.js";import"./DF1VbFfH.js";const f=r({__name:"architecture",setup(a){return o({title:"QAComet | Architecture of Playwright",meta:[{name:"description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components."},{property:"og:image",content:"https://qacomet.com/img/playwright/architecture_diagram.jpg"},{property:"og:image:width",content:"800"},{property:"og:image:height",content:"500"},{property:"og:title",content:"QAComet | Architecture of Playwright"},{property:"og:url",content:"https://qacomet.com/playwright/how-playwright-initializes"},{property:"og:site_name",content:"QAComet"},{property:"og:description",content:"Let's dive into Playwright's internals by looking at how the project is structured and discover it's essential components."},{property:"og:type",content:"Website"},{name:"twitter:site",content:"@QACometOfficial"},{name:"twitter:creator",content:"@QACometOfficial"},{name:"twitter:card",content:"summary_large_image"}]}),(c,p)=>{const t=e;return n(),i(t,{path:"playwright/architecture"})}}});export{f as default}; diff --git a/_nuxt/_ufwR5o8.js b/_nuxt/_ufwR5o8.js new file mode 100644 index 0000000..094cbd1 --- /dev/null +++ b/_nuxt/_ufwR5o8.js @@ -0,0 +1 @@ +import{i as d,D,q as y,E as w,u as g,f as H,G as q,H as S,I as u}from"./DiyP6pou.js";import{u as _}from"./ChQXwC9l.js";import b from"./DMFARuCF.js";import x from"./Cb50__Mb.js";import"./aHVSc_rA.js";import"./C-v3KzvZ.js";import"./BpUWW4O-.js";import"./BqUvtMHT.js";import"./DEZhdWR8.js";const a=(p,s=y())=>{const e=d(p),f=g();D(()=>d(p),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),w(()=>_(t))},{immediate:!0})},$=H({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(p){const{contentHead:s}=g().public.content,e=q(),{tag:f,excerpt:m,path:n,query:t,head:r}=p,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||S(y().path),find:"one"},C=(o,i)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return u(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),u(b,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||u("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||u("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),G=$;export{G as default}; diff --git a/_nuxt/DQv0CMQg.js b/_nuxt/aHVSc_rA.js similarity index 88% rename from _nuxt/DQv0CMQg.js rename to _nuxt/aHVSc_rA.js index d78cfe5..4a23546 100644 --- a/_nuxt/DQv0CMQg.js +++ b/_nuxt/aHVSc_rA.js @@ -1 +1 @@ -import{f as j,z as ln,Y as en,k as w,J as z,A as on,Z as P,$ as tn,a0 as rn,o as an,g as un,i as sn}from"./BlS8upJP.js";import{p as F,k as cn}from"./BsYmvPZw.js";import{u as pn}from"./BECgZIvk.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&mn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,fn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,m,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(m=t==null?void 0:t.components)!=null&&m.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var m,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((m=s.component)==null?void 0:m.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,m;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(m=n.props)==null?void 0:m.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const m=g.map(p=>Pn(p,l,o,t));return Bn(m)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",m=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=m(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const jn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=wn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{jn as _}; +import{f as j,z as ln,X as en,k as w,I as z,Y as on,Z as P,$ as tn,a0 as rn,o as an,g as un,i as sn}from"./DiyP6pou.js";import{p as F,k as cn}from"./C-v3KzvZ.js";import{u as pn}from"./BpUWW4O-.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&fn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,mn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,f,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(f=t==null?void 0:t.components)!=null&&f.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var f,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((f=s.component)==null?void 0:f.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,f;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(f=n.props)==null?void 0:f.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const f=g.map(p=>Pn(p,l,o,t));return Bn(f)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",f=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=f(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const zn=wn,Fn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=zn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{Fn as _}; diff --git a/_nuxt/builds/latest.json b/_nuxt/builds/latest.json index 3855654..9fd86a7 100644 --- a/_nuxt/builds/latest.json +++ b/_nuxt/builds/latest.json @@ -1 +1 @@ -{"id":"d8c635a6-4df4-43ae-ac4a-a06023848560","timestamp":1714258600734} \ No newline at end of file +{"id":"c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621","timestamp":1717143046352} \ No newline at end of file diff --git a/_nuxt/builds/meta/c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621.json b/_nuxt/builds/meta/c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621.json new file mode 100644 index 0000000..5761a59 --- /dev/null +++ b/_nuxt/builds/meta/c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621.json @@ -0,0 +1 @@ +{"id":"c8cf7254-d3c7-4cf6-a9e8-c0205b0a8621","timestamp":1717143046352,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/terms-and-conditions","/terms-of-service","/privacy-policy","/playwright","/case-studies","/white-papers","/case-studies/automatisch","/white-papers/how-qa-factors-into-vc-due-diligence","/playwright/architecture","/playwright/how-playwright-initializes","/"]} \ No newline at end of file diff --git a/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json b/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json deleted file mode 100644 index 85a67f1..0000000 --- a/_nuxt/builds/meta/d8c635a6-4df4-43ae-ac4a-a06023848560.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"d8c635a6-4df4-43ae-ac4a-a06023848560","timestamp":1714258600734,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/terms-of-service","/terms-and-conditions","/privacy-policy","/case-studies","/playwright","/case-studies/automatisch","/playwright/architecture","/playwright/how-playwright-initializes","/"]} \ No newline at end of file diff --git a/_nuxt/e4iyi0z6.js b/_nuxt/e4iyi0z6.js new file mode 100644 index 0000000..6c64e5b --- /dev/null +++ b/_nuxt/e4iyi0z6.js @@ -0,0 +1 @@ +import"./DiyP6pou.js";const o=""+new URL("open-graph-banner.Cso2_SHa.jpg",import.meta.url).href;export{o as _}; diff --git a/_nuxt/dGARKcZ6.js b/_nuxt/eKBtyYuL.js similarity index 58% rename from _nuxt/dGARKcZ6.js rename to _nuxt/eKBtyYuL.js index 9668836..8958242 100644 --- a/_nuxt/dGARKcZ6.js +++ b/_nuxt/eKBtyYuL.js @@ -1 +1 @@ -import r from"./C17h_atD.js";import{f as o,H as f,k as u,z as c}from"./BlS8upJP.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=c(),{between:n,default:a}=f(),s=u(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; +import r from"./C5JBqY-4.js";import{f as o,G as f,k as u,z as c}from"./DiyP6pou.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=c(),{between:n,default:a}=f(),s=u(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; diff --git a/_nuxt/entry.DiT2Mvoi.css b/_nuxt/entry.DiT2Mvoi.css deleted file mode 100644 index 97f55e5..0000000 --- a/_nuxt/entry.DiT2Mvoi.css +++ /dev/null @@ -1 +0,0 @@ -.blog-outer{margin-left:auto;margin-right:auto;max-width:832px;width:100%}.blog-wrapper{background:#0006;border-radius:.5rem;box-sizing:border-box;color:#f5f6f1;margin:6rem 1rem 4rem;padding:2rem}.blog-wrapper .blog-breadcrumbs{display:flex;flex-direction:row;margin-left:auto;width:100%}.blog-wrapper .blog-breadcrumbs .crumb{color:#a9a8a6;font-size:.875rem;line-height:1.25rem}.blog-wrapper .blog-breadcrumbs .crumb a{text-decoration:underline}.blog-wrapper .blog-breadcrumbs .crumb .sep{padding-left:.5rem;padding-right:.5rem}.blog-wrapper div h2{font-size:1.5rem;font-weight:700;line-height:2rem;padding-bottom:.5rem;padding-top:.75rem}.blog-wrapper div h2:first-child{padding-top:0}.blog-wrapper div p{font-size:1.125rem;font-weight:300;line-height:2rem;padding-bottom:1rem}.blog-wrapper img{border-radius:.5rem}.blog-wrapper h3{font-size:1.125rem;font-weight:700;line-height:1.75rem;padding-bottom:.75rem;padding-top:.5rem}.blog-wrapper h4{font-weight:700;margin-bottom:.25rem}.blog-wrapper p a{color:#18caf9;text-decoration:underline}.blog-wrapper ol,.blog-wrapper ul{padding-bottom:1rem;padding-left:2rem}.blog-wrapper ol li,.blog-wrapper ul li{font-size:1.125rem;line-height:2rem}.blog-wrapper ol li,.blog-wrapper ul li{list-style-type:disc}.blog-wrapper .testimonial-outer{padding-top:2rem}.blog-wrapper .testimonial-outer .testimonial-wrapper .left{margin-right:0}.blog-wrapper .testimonial-outer .testimonial-wrapper .image-wrapper{max-height:172px;max-width:172px}.blog-wrapper code{color:#79b8ff}.blog-wrapper .code-outer{margin-bottom:1.5rem;margin-top:.5rem}.blog-wrapper .blog-header{padding-bottom:2rem;padding-top:.5rem}.blog-wrapper .blog-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.blog-wrapper .blog-header h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:1rem}.blog-wrapper .blog-header h2.subheader{font-size:1.125rem;font-weight:400;line-height:1.75rem;padding-top:1rem}.blog-wrapper .blog-header .blog-created-date{font-size:1.125rem;line-height:1.75rem;padding-top:.5rem}@media (max-width:768px){.blog-wrapper{margin-top:6rem;padding:1rem}.blog-wrapper .blog-header{padding-bottom:1rem}.blog-wrapper div h2{padding-top:.5rem}.blog-wrapper .testimonial-outer{padding-top:0}}@media (max-width:600px){.blog-wrapper .blog-header h1{font-size:2.25rem;line-height:2.5rem}}.blog-post-wrapper{padding-bottom:2rem}.blog-post-wrapper:last-child{padding-bottom:0}.blog-post-wrapper .date-wrapper{border:1px solid #f5f6f1;border-radius:.5rem;display:flex;flex-direction:column;float:left;font-size:.875rem;height:-moz-fit-content;height:fit-content;line-height:1.25rem;margin-right:1rem;min-width:60px;text-align:center}.blog-post-wrapper .date-wrapper .month{border-bottom:1px solid #f5f6f1}.blog-post-wrapper .date-wrapper .day{border-bottom:1px solid #f5f6f1;font-size:2.25rem;font-weight:700;line-height:2.5rem}.blog-post-wrapper .description-wrapper h3{font-size:1.25rem;font-weight:700;line-height:1.75rem;padding-bottom:0;padding-top:0;text-decoration:underline}.blog-post-wrapper .description-wrapper p{padding-bottom:0}.blog-post-wrapper .read{color:#18caf9;display:block;margin-left:auto;text-decoration:underline;width:-moz-fit-content;width:fit-content}:root{--text:#f5f6f1;--bg:#100c09;--main:#18caf9}#__nuxt,body{overflow-x:hidden}body{background:#100c09;background:var(--bg);color:#f5f6f1;color:var(--text);font-family:DM Sans,sans-serif} diff --git a/_nuxt/entry.DrGH3nHD.css b/_nuxt/entry.DrGH3nHD.css new file mode 100644 index 0000000..99a50b2 --- /dev/null +++ b/_nuxt/entry.DrGH3nHD.css @@ -0,0 +1 @@ +.blog-outer{margin-left:auto;margin-right:auto;max-width:832px;width:100%}.blog-wrapper{background:#0006;border-radius:.5rem;box-sizing:border-box;color:#f5f6f1;margin:6rem 1rem 4rem;padding:2rem}.blog-wrapper .blog-meta{display:flex;flex-direction:row}.blog-wrapper .blog-meta .blog-breadcrumbs{display:flex;flex-direction:row;margin-left:auto;width:100%}.blog-wrapper .blog-meta .blog-breadcrumbs .crumb{color:#a9a8a6;font-size:.875rem;line-height:1.25rem}.blog-wrapper .blog-meta .blog-breadcrumbs .crumb a{text-decoration:underline}.blog-wrapper .blog-meta .blog-breadcrumbs .crumb .sep{padding-left:.5rem;padding-right:.5rem}.blog-wrapper div h2{font-size:28px;padding-bottom:.25rem;padding-top:.75rem}.blog-wrapper div h2:first-child{padding-top:0}.blog-wrapper div p{font-size:1.125rem;font-weight:300;line-height:2rem;padding-bottom:1rem}.blog-wrapper img{border-radius:.5rem}.blog-wrapper h2,.blog-wrapper h3,.blog-wrapper h4,.blog-wrapper h5,.blog-wrapper h6{font-family:Inter Tight,sans-serif;font-weight:700;line-height:normal}.blog-wrapper h3{font-size:24px;padding-bottom:.25rem;padding-top:.5rem}.blog-wrapper h4{font-size:20px;padding-top:.25rem}.blog-wrapper li a,.blog-wrapper p a{color:#18caf9;text-decoration:underline}.blog-wrapper blockquote{background:#e6f9fe30;border-left:3px solid var(--main);margin-bottom:1rem;margin-top:1rem;padding:1rem 1.5rem}.blog-wrapper blockquote p{padding-bottom:0}.blog-wrapper ol,.blog-wrapper ul{padding-bottom:1rem;padding-left:2rem}.blog-wrapper ol li,.blog-wrapper ul li{font-size:1.125rem;line-height:2rem}.blog-wrapper ol li,.blog-wrapper ul li{list-style-type:disc}.blog-wrapper .testimonial-outer{padding-top:2rem}.blog-wrapper .testimonial-outer .testimonial-wrapper .left{margin-right:0}.blog-wrapper .testimonial-outer .testimonial-wrapper .image-wrapper{max-height:172px;max-width:172px}.blog-wrapper code{color:#79b8ff}.blog-wrapper .code-outer{margin-bottom:1.5rem;margin-top:.5rem}.blog-wrapper .blog-header{padding-bottom:2rem;padding-top:.5rem}.blog-wrapper .blog-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.blog-wrapper .blog-header h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:1rem}.blog-wrapper .blog-header h2.subheader{font-size:1.125rem;font-weight:400;line-height:1.75rem;padding-top:1rem}.blog-wrapper .blog-header .blog-created-date{font-size:1.125rem;line-height:1.75rem;padding-top:.5rem}@media (max-width:768px){.blog-wrapper{margin-top:6rem;padding:1rem}.blog-wrapper .blog-header{padding-bottom:1rem}.blog-wrapper div h2{padding-top:.5rem}.blog-wrapper .testimonial-outer{padding-top:0}}@media (max-width:600px){.blog-wrapper .blog-header h1{font-size:2.25rem;line-height:2.5rem}}.blog-post-wrapper{padding-bottom:2rem}.blog-post-wrapper:last-child{padding-bottom:0}.blog-post-wrapper .date-wrapper{border:1px solid #f5f6f1;border-radius:.5rem;display:flex;flex-direction:column;float:left;font-size:.875rem;height:-moz-fit-content;height:fit-content;line-height:1.25rem;margin-right:1rem;min-width:60px;text-align:center}.blog-post-wrapper .date-wrapper .month{border-bottom:1px solid #f5f6f1}.blog-post-wrapper .date-wrapper .day{border-bottom:1px solid #f5f6f1;font-size:2.25rem;font-weight:700;line-height:2.5rem}.blog-post-wrapper .description-wrapper h3{font-size:1.25rem;font-weight:700;line-height:1.75rem;padding-bottom:0;padding-top:0;text-decoration:underline}.blog-post-wrapper .description-wrapper p{padding-bottom:0}.blog-post-wrapper .read{color:#18caf9;display:block;margin-left:auto;text-decoration:underline;width:-moz-fit-content;width:fit-content}:root{--text:#f5f6f1;--bg:#100c09;--main:#18caf9}#__nuxt,body{overflow-x:hidden}body{background:var(--bg);color:var(--text);font-family:DM Sans,sans-serif} diff --git a/_nuxt/error-404.CyhgO96i.css b/_nuxt/error-404.JekaaCis.css similarity index 54% rename from _nuxt/error-404.CyhgO96i.css rename to _nuxt/error-404.JekaaCis.css index 457d89d..2406057 100644 --- a/_nuxt/error-404.CyhgO96i.css +++ b/_nuxt/error-404.JekaaCis.css @@ -1 +1 @@ -.spotlight[data-v-73a07988]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-73a07988]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media (prefers-color-scheme:light){.gradient-border[data-v-73a07988]{background-color:#ffffff4d}.gradient-border[data-v-73a07988]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media (prefers-color-scheme:dark){.gradient-border[data-v-73a07988]{background-color:#1414144d}.gradient-border[data-v-73a07988]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-73a07988]:before{background-size:400% auto;border-radius:.5rem;bottom:0;content:"";left:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;right:0;top:0;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-73a07988]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-73a07988]{position:fixed}.left-0[data-v-73a07988]{left:0}.right-0[data-v-73a07988]{right:0}.z-10[data-v-73a07988]{z-index:10}.z-20[data-v-73a07988]{z-index:20}.grid[data-v-73a07988]{display:grid}.mb-16[data-v-73a07988]{margin-bottom:4rem}.mb-8[data-v-73a07988]{margin-bottom:2rem}.max-w-520px[data-v-73a07988]{max-width:520px}.min-h-screen[data-v-73a07988]{min-height:100vh}.w-full[data-v-73a07988]{width:100%}.flex[data-v-73a07988]{display:flex}.cursor-pointer[data-v-73a07988]{cursor:pointer}.place-content-center[data-v-73a07988]{place-content:center}.items-center[data-v-73a07988]{align-items:center}.justify-center[data-v-73a07988]{justify-content:center}.overflow-hidden[data-v-73a07988]{overflow:hidden}.bg-white[data-v-73a07988]{--un-bg-opacity:1;background-color:#fff;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-73a07988]{padding-left:1rem;padding-right:1rem}.px-8[data-v-73a07988]{padding-left:2rem;padding-right:2rem}.py-2[data-v-73a07988]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-73a07988]{text-align:center}.text-8xl[data-v-73a07988]{font-size:6rem;line-height:1}.text-xl[data-v-73a07988]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-73a07988]{--un-text-opacity:1;color:#000;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-73a07988]{font-weight:300}.font-medium[data-v-73a07988]{font-weight:500}.leading-tight[data-v-73a07988]{line-height:1.25}.font-sans[data-v-73a07988]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-73a07988]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-73a07988]{--un-bg-opacity:1;background-color:#000;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-73a07988]{--un-text-opacity:1;color:#fff;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-73a07988]{padding-left:0;padding-right:0}.sm\:px-6[data-v-73a07988]{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3[data-v-73a07988]{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-4xl[data-v-73a07988]{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl[data-v-73a07988]{font-size:1.25rem;line-height:1.75rem}} +.spotlight[data-v-73a07988]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-73a07988]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media (prefers-color-scheme:light){.gradient-border[data-v-73a07988]{background-color:#ffffff4d}.gradient-border[data-v-73a07988]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media (prefers-color-scheme:dark){.gradient-border[data-v-73a07988]{background-color:#1414144d}.gradient-border[data-v-73a07988]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-73a07988]:before{background-size:400% auto;border-radius:.5rem;bottom:0;content:"";left:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;right:0;top:0;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-73a07988]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-73a07988]{position:fixed}.left-0[data-v-73a07988]{left:0}.right-0[data-v-73a07988]{right:0}.z-10[data-v-73a07988]{z-index:10}.z-20[data-v-73a07988]{z-index:20}.grid[data-v-73a07988]{display:grid}.mb-16[data-v-73a07988]{margin-bottom:4rem}.mb-8[data-v-73a07988]{margin-bottom:2rem}.max-w-520px[data-v-73a07988]{max-width:520px}.min-h-screen[data-v-73a07988]{min-height:100vh}.w-full[data-v-73a07988]{width:100%}.flex[data-v-73a07988]{display:flex}.cursor-pointer[data-v-73a07988]{cursor:pointer}.place-content-center[data-v-73a07988]{place-content:center}.items-center[data-v-73a07988]{align-items:center}.justify-center[data-v-73a07988]{justify-content:center}.overflow-hidden[data-v-73a07988]{overflow:hidden}.bg-white[data-v-73a07988]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-73a07988]{padding-left:1rem;padding-right:1rem}.px-8[data-v-73a07988]{padding-left:2rem;padding-right:2rem}.py-2[data-v-73a07988]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-73a07988]{text-align:center}.text-8xl[data-v-73a07988]{font-size:6rem;line-height:1}.text-xl[data-v-73a07988]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-73a07988]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-73a07988]{font-weight:300}.font-medium[data-v-73a07988]{font-weight:500}.leading-tight[data-v-73a07988]{line-height:1.25}.font-sans[data-v-73a07988]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-73a07988]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-73a07988]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-73a07988]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-73a07988]{padding-left:0;padding-right:0}.sm\:px-6[data-v-73a07988]{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3[data-v-73a07988]{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-4xl[data-v-73a07988]{font-size:2.25rem;line-height:2.5rem}.sm\:text-xl[data-v-73a07988]{font-size:1.25rem;line-height:1.75rem}} diff --git a/_nuxt/error-500.CNP9nqm1.css b/_nuxt/error-500.CNP9nqm1.css new file mode 100644 index 0000000..777a7d3 --- /dev/null +++ b/_nuxt/error-500.CNP9nqm1.css @@ -0,0 +1 @@ +.spotlight[data-v-6fdef64d]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-6fdef64d]{position:fixed}.-bottom-1\/2[data-v-6fdef64d]{bottom:-50%}.left-0[data-v-6fdef64d]{left:0}.right-0[data-v-6fdef64d]{right:0}.grid[data-v-6fdef64d]{display:grid}.mb-16[data-v-6fdef64d]{margin-bottom:4rem}.mb-8[data-v-6fdef64d]{margin-bottom:2rem}.h-1\/2[data-v-6fdef64d]{height:50%}.max-w-520px[data-v-6fdef64d]{max-width:520px}.min-h-screen[data-v-6fdef64d]{min-height:100vh}.place-content-center[data-v-6fdef64d]{place-content:center}.overflow-hidden[data-v-6fdef64d]{overflow:hidden}.bg-white[data-v-6fdef64d]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-6fdef64d]{padding-left:2rem;padding-right:2rem}.text-center[data-v-6fdef64d]{text-align:center}.text-8xl[data-v-6fdef64d]{font-size:6rem;line-height:1}.text-xl[data-v-6fdef64d]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-6fdef64d]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-6fdef64d]{font-weight:300}.font-medium[data-v-6fdef64d]{font-weight:500}.leading-tight[data-v-6fdef64d]{line-height:1.25}.font-sans[data-v-6fdef64d]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-6fdef64d]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-6fdef64d]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-6fdef64d]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-6fdef64d]{padding-left:0;padding-right:0}.sm\:text-4xl[data-v-6fdef64d]{font-size:2.25rem;line-height:2.5rem}} diff --git a/_nuxt/error-500.Cph627d6.css b/_nuxt/error-500.Cph627d6.css deleted file mode 100644 index 64f6595..0000000 --- a/_nuxt/error-500.Cph627d6.css +++ /dev/null @@ -1 +0,0 @@ -.spotlight[data-v-6fdef64d]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-6fdef64d]{position:fixed}.-bottom-1\/2[data-v-6fdef64d]{bottom:-50%}.left-0[data-v-6fdef64d]{left:0}.right-0[data-v-6fdef64d]{right:0}.grid[data-v-6fdef64d]{display:grid}.mb-16[data-v-6fdef64d]{margin-bottom:4rem}.mb-8[data-v-6fdef64d]{margin-bottom:2rem}.h-1\/2[data-v-6fdef64d]{height:50%}.max-w-520px[data-v-6fdef64d]{max-width:520px}.min-h-screen[data-v-6fdef64d]{min-height:100vh}.place-content-center[data-v-6fdef64d]{place-content:center}.overflow-hidden[data-v-6fdef64d]{overflow:hidden}.bg-white[data-v-6fdef64d]{--un-bg-opacity:1;background-color:#fff;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-6fdef64d]{padding-left:2rem;padding-right:2rem}.text-center[data-v-6fdef64d]{text-align:center}.text-8xl[data-v-6fdef64d]{font-size:6rem;line-height:1}.text-xl[data-v-6fdef64d]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-6fdef64d]{--un-text-opacity:1;color:#000;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-6fdef64d]{font-weight:300}.font-medium[data-v-6fdef64d]{font-weight:500}.leading-tight[data-v-6fdef64d]{line-height:1.25}.font-sans[data-v-6fdef64d]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-6fdef64d]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){.dark\:bg-black[data-v-6fdef64d]{--un-bg-opacity:1;background-color:#000;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\:text-white[data-v-6fdef64d]{--un-text-opacity:1;color:#fff;color:rgb(255 255 255/var(--un-text-opacity))}}@media (min-width:640px){.sm\:px-0[data-v-6fdef64d]{padding-left:0;padding-right:0}.sm\:text-4xl[data-v-6fdef64d]{font-size:2.25rem;line-height:2.5rem}} diff --git a/_nuxt/CZNwzoXQ.js b/_nuxt/h4BmERJ-.js similarity index 65% rename from _nuxt/CZNwzoXQ.js rename to _nuxt/h4BmERJ-.js index ce1aa7a..6646729 100644 --- a/_nuxt/CZNwzoXQ.js +++ b/_nuxt/h4BmERJ-.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,l as s}from"./BlS8upJP.js";const a={};function c(e,n){return r(),t("thead",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,l as s}from"./DiyP6pou.js";const a={};function c(e,n){return r(),t("thead",null,[s(e.$slots,"default")])}const _=o(a,[["render",c]]);export{_ as default}; diff --git a/_nuxt/index.DrXF56mq.css b/_nuxt/index.DrXF56mq.css new file mode 100644 index 0000000..7594333 --- /dev/null +++ b/_nuxt/index.DrXF56mq.css @@ -0,0 +1 @@ +.hero-wrapper{padding-top:100px;position:relative}.hero-wrapper .hero{display:flex;flex-direction:column;margin-left:auto;margin-right:auto;max-width:600px;padding-bottom:8rem;padding-top:8rem;text-align:center;z-index:10}.hero-wrapper .hero h1{color:var(--text);font-family:Inter Tight,sans-serif;font-size:64px;font-weight:900;letter-spacing:1.4px;line-height:1.15;padding-bottom:2rem;position:relative;text-shadow:1px 1px 1px rgba(16,12,9,.6)}.hero-wrapper .hero h1 .emph{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 266 10'%3E%3Cpath d='M542.908 702.997c8.969-.976 23.554-2.567 38.36-3.695 8.829-.672 17.736-1.178 25.575-1.297 7.673-.107 16.285.138 24.785.551 14.426.699 28.53 1.876 37.188 2.597.309.029.571-.463.585-1.099s-.224-1.177-.532-1.207c-8.658-.956-22.763-2.512-37.193-3.609-8.515-.648-17.143-1.136-24.833-1.243-7.858-.119-16.789.12-25.643.52-14.828.669-29.438 1.794-38.423 2.488-.801.075-1.423 1.478-1.387 3.132s.717 2.937 1.518 2.862' style='fill:%2318caf9' transform='matrix(2.06349 0 0 1 -1117.152 -693)'/%3E%3C/svg%3E");background-position:50% 100%;background-repeat:no-repeat;background-size:contain;color:var(--main)}.hero-wrapper .hero h2{font-family:DM Sans,sans-serif;font-size:32px;font-weight:300;line-height:1.25;padding-bottom:4rem}.hero-wrapper .hero .cta-outer{margin-left:auto;margin-right:auto;position:relative;width:-moz-fit-content;width:fit-content}.hero-wrapper .hero .cta-outer .hero-cta{align-items:center;border-radius:.5rem;display:flex;flex-direction:row;font-size:1.25rem;font-weight:700;line-height:1.75rem;padding:1.5rem 2rem 1.5rem 3rem;position:relative;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background:#0006;border:3px solid var(--main);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--text);top:0;transition:top .3s}.hero-wrapper .hero .cta-outer .hero-cta:hover{top:-4px}.hero-wrapper .hero .cta-outer .hero-cta .hero-cta-icon{padding-left:.5rem}.hero-wrapper .hero .cta-outer .hero-cta .hero-cta-icon svg{height:30px;width:30px}.hero-wrapper .hero .cta-outer .star-1{left:45px;top:-45px}.hero-wrapper .hero .cta-outer .star-2{left:-45px;top:10px;transform:rotate(15deg);width:22px}.hero-wrapper .hero .cta-outer .star-3{bottom:-45px;right:15px;transform:rotate(92deg);width:20px}.hero-wrapper .hero .cta-outer .star-4{bottom:10px;right:-45px;width:26px}.hero-wrapper .hero-images img{position:absolute}.hero-wrapper .hero-images .star{z-index:-1}.hero-wrapper .hero-images .planet-1{left:10px;top:100px}.hero-wrapper .hero-images .planet-2{bottom:45%;right:0;transform:rotate(-15deg)}.hero-wrapper .hero-images .planet-3{bottom:0;left:100px;transform:rotate(15deg)}@media (max-width:940px){.hero-wrapper .hero-images .planet-2{right:-10%}}@media (max-width:768px){.hero-wrapper .hero{border-radius:.5rem;margin-bottom:6rem;margin-top:6rem;padding-bottom:2rem;padding-top:2rem}.hero-wrapper .hero-images .planet-1{bottom:1px;left:auto;right:10%;top:auto}.hero-wrapper .hero-images .planet-2{max-width:180px;right:-10%;top:10%}.hero-wrapper .hero-images .planet-3{left:-5%;max-width:160px;top:40%}}@media (max-width:680px){.hero-wrapper .hero{margin-top:0}.hero-wrapper .hero h1{font-size:48px}.hero-wrapper .hero h2{font-size:28px}.hero-wrapper .hero-images{opacity:.9}}.brand-logos-wrapper{background:#100c09;color:#fff;margin-top:6rem;padding-bottom:2rem;padding-top:.5rem;position:relative;z-index:1}.brand-logos-wrapper .brand-logos{align-items:center;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-around;margin-left:auto;margin-right:auto;max-width:800px;padding-left:.5rem;padding-right:.5rem;padding-top:.5rem}.brand-logos-wrapper .brand-logos .brand-logo{padding-left:.5rem;padding-right:.5rem;padding-top:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.brand-logos-wrapper .brand-logos .brand-logo img{max-height:34px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media (max-width:640px){.brand-logos-wrapper .brand-logos .brand-logo img{max-height:30px}}.how-it-works-outer{position:relative}.how-it-works-outer .bg-img{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:#18caf974;border-radius:9999px;filter:blur(80px);height:400px;opacity:.8;position:absolute;right:50%;right:calc(50% - 200px);top:2rem;width:400px;z-index:0}.how-it-works-inner{background:#0006;padding-bottom:8rem;padding-top:8rem;position:relative;width:100%;z-index:1}.how-it-works-inner h1{font-size:1.875rem;font-weight:700;line-height:2.25rem}@media (max-width:768px){.how-it-works-inner{padding-bottom:4rem;padding-top:4rem}}.recent-work-outer{padding-bottom:8rem;padding-top:8rem}.recent-work-outer .slider-outer{position:relative}.recent-work-outer .slider-outer .slide-controls{display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.recent-work-outer .slider-outer .slide-controls .slide-control-left,.recent-work-outer .slider-outer .slide-controls .slide-control-right{align-items:center;background:#ffffff4d;border-radius:9999px;bottom:50%;cursor:pointer;display:flex;flex-direction:row;height:48px;justify-content:center;position:absolute;top:50%;width:48px}.recent-work-outer .slider-outer .slide-controls .slide-control-left svg,.recent-work-outer .slider-outer .slide-controls .slide-control-right svg{height:32px;width:32px}.recent-work-outer .slider-outer .slide-controls .slide-control-left{left:-64px}.recent-work-outer .slider-outer .slide-controls .slide-control-right{right:-64px}.recent-work-outer .slide{display:flex;flex-direction:row;width:100%}.recent-work-outer .slide .slide-left{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.recent-work-outer .slide .slide-left .project-icon{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.recent-work-outer .slide .slide-left .project-name{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.recent-work-outer .slide .slide-right{display:flex;flex:1;flex-direction:column;justify-content:center}.recent-work-outer .slide .slide-right img{border-radius:.5rem;height:100%;min-height:500px;width:100%}.recent-work-outer .slide .slide-right .report-text{padding-top:1rem}.recent-work-outer .slide .slide-right .testimonial-text-wrapper{background:#ffffff26;border-radius:.5rem;display:flex;flex-direction:row;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.recent-work-outer .slide .slide-right .testimonial-text-wrapper svg{display:block;flex-shrink:0;height:64px;margin-right:1rem;width:64px}@media (max-width:768px){.recent-work-outer .slide .slide-right .testimonial-text-wrapper{font-size:1.875rem;line-height:2.25rem;line-height:1.8}.recent-work-outer .slide .slide-right .testimonial-text-wrapper svg{height:48px;margin-right:.5rem;width:48px}}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .testimonial-text{margin-bottom:auto;margin-top:auto}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .testimonial-text a{color:#18caf9}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .name{font-style:normal}.recent-work-outer .slide .slide-right .see-more-outer{padding-top:1rem;width:100%}.recent-work-outer .slide .slide-right .see-more-outer .see-more-wrapper{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.recent-work-outer .slide .slide-right .see-more-outer .see-more-wrapper .see-more-text{padding-right:.5rem}@media (max-width:768px){.recent-work-outer{padding-bottom:4rem;padding-top:4rem}.recent-work-outer .slider-outer .slide-controls .slide-control-left,.recent-work-outer .slider-outer .slide-controls .slide-control-right{top:280px}.recent-work-outer .slider-outer .slide-controls .slide-control-left{left:0}.recent-work-outer .slider-outer .slide-controls .slide-control-right{right:0}.recent-work-outer .slide{flex-direction:column}.recent-work-outer .slide .slide-left{max-width:100%}}.services-outer{position:relative}.services-outer .services-inner{background:#0006;padding-bottom:8rem;padding-top:8rem;width:100%}.services-outer .services-inner .first-steps-wrapper{padding-bottom:6rem;padding-top:2rem}@media (max-width:768px){.services-outer .services-inner{padding-bottom:4rem;padding-top:4rem}.services-outer .services-inner .first-steps-wrapper{padding-bottom:2rem}}.services-outer .constellation-1,.services-outer .constellation-2{max-width:70vw;pointer-events:none;position:absolute;z-index:1}.services-outer .constellation-1{right:5%;top:40px}@media (max-width:800px){.services-outer .constellation-1{right:-10%}}.services-outer .constellation-2{left:12%;top:120px}@media (max-width:1000px){.services-outer .constellation-2{left:1%;top:200px}}@media (max-width:800px){.services-outer .constellation-2{left:-15%;max-width:200px;top:15%}}.services-outer .bg-img{-webkit-backdrop-filter:blur(200px);backdrop-filter:blur(200px);background:#18caf974;border-radius:9999px;filter:blur(200px);height:400px;left:-10%;opacity:.8;position:absolute;right:50%;right:calc(50% - 200px);top:5%;width:400px;z-index:0}@media (max-width:768px){.services-outer .services-inner{-webkit-backdrop-filter:none;backdrop-filter:none;background:#100c094d}}.toggle-wrapper{background:#fff3;border-radius:9999px;padding:.125rem .25rem;position:relative;width:-moz-fit-content;width:fit-content}.toggle-wrapper .toggle-bg{background:var(--main);left:0;margin:0 1px;position:absolute;top:4px;transition:all .3s;z-index:1}.toggle-wrapper .text{cursor:pointer;padding:.125rem .375rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:10}.plan-outer{padding-bottom:8rem;padding-top:8rem}.plan-outer .plan-header .star-1{left:-10px;top:-10px}.plan-outer .plan-header .star-2{right:30px;top:-40px;transform:rotate(-23deg);width:20px}.plan-outer .plan-header .star-3{bottom:20px;right:-30px;transform:rotate(-10deg)}.plan-outer .plan-toggle-wrapper{font-size:1.125rem;line-height:1.75rem;margin-left:auto;margin-right:auto;padding-bottom:2rem;padding-top:1rem}.plan-outer .plan{display:flex;flex-direction:column}.plan-outer .plan-body{background:#fff3;border-radius:.5rem;display:flex;flex-direction:row;margin-left:auto;margin-right:auto;max-width:800px;width:100%}.plan-outer .plan-body .plan-features,.plan-outer .plan-body .plan-info{display:flex;flex-direction:column;padding:2rem}.plan-outer .plan-body .plan-info{display:flex;flex:1;flex-direction:column;padding-right:1rem;width:100%}.plan-outer .plan-body .plan-info h1{font-size:3rem;line-height:1;padding-bottom:1rem}.plan-outer .plan-body .plan-info h1 .slash{font-weight:100}.plan-outer .plan-body .plan-info h1 .mo{color:var(--main);font-size:1.875rem;font-weight:300;line-height:2.25rem}.plan-outer .plan-body .plan-info h2{padding-bottom:1rem}.plan-outer .plan-body .plan-info h2,.plan-outer .plan-body .plan-info h3{font-size:1.25rem;line-height:1.75rem}.plan-outer .plan-body .plan-info h3{color:#b7b7b7;padding-bottom:2rem}.plan-outer .plan-body .plan-info .payment{background:var(--main);border:2px solid var(--main);border-radius:.5rem;color:var(--text);font-size:1.25rem;font-weight:900;line-height:1.75rem;margin-right:auto;padding:.75rem 1rem;transition:transform .3s}.plan-outer .plan-body .plan-info .payment:hover{transform:translateY(-6px) scale(1.025)}.plan-outer .plan-body .plan-features{display:flex;flex-direction:column;justify-content:center;padding-left:1rem}.plan-outer .plan-body .plan-features .plan-feature-row{display:flex;flex-direction:row;font-size:1.125rem;line-height:1.75rem;padding-bottom:1.5rem}.plan-outer .plan-body .plan-features .plan-feature-row:last-child{padding-bottom:0}.plan-outer .plan-body .plan-features .plan-feature-row .check{align-items:center;display:flex;flex-direction:row;padding-right:1rem}.plan-outer .plan-body .plan-features .plan-feature-row .check svg{border:2px solid var(--main);border-radius:9999px;color:var(--main);height:30px;padding:4px;width:30px;stroke-width:22}.plan-outer .booking-wrapper{align-items:center;color:#ccc;display:flex;flex-direction:row;font-size:1.125rem;line-height:1.75rem;margin-left:auto;margin-right:auto;max-width:800px;padding-top:4rem}.plan-outer .booking-wrapper .booking-text{font-size:1.125rem;line-height:1.75rem;padding-right:2rem}.plan-outer .booking-wrapper .booking-cta{align-items:center;border:2px solid #ccc;border-radius:.5rem;display:flex;flex-direction:row;padding:.5rem .75rem}.plan-outer .booking-wrapper .booking-cta svg{height:22px;width:28px}@media (max-width:768px){.plan-outer{padding-bottom:4rem;padding-top:4rem}}@media (max-width:550px){.plan-outer .plan-body{flex-direction:column}.plan-outer .plan-body .plan-info{padding-left:2rem;padding-right:2rem;text-align:center}.plan-outer .plan-body .plan-info .payment{text-align:center;width:100%}.plan-outer .plan-body .plan-features{padding-left:2rem;padding-top:0}.plan-outer .booking-wrapper{display:flex;flex-direction:column;padding-top:2rem}.plan-outer .booking-wrapper .booking-text{padding-bottom:1rem;padding-right:0}}.accordion-wrapper{border:1px solid var(--text);border-radius:.5rem}.accordion-wrapper .accordion-header{cursor:pointer;display:flex;flex-direction:row;padding:1rem}.accordion-wrapper .accordion-header .accordion-header-text{align-items:center;display:flex;flex:1;flex-direction:row;font-size:1.125rem;font-weight:700;line-height:1.75rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.accordion-wrapper .accordion-header .accordion-header-text span{cursor:auto;-webkit-user-select:text;-moz-user-select:text;user-select:text}.accordion-wrapper .accordion-header .accordion-header-icon{align-items:center;display:flex;flex-direction:row}.accordion-wrapper .accordion-header .accordion-header-icon svg{height:22px;width:22px;fill:var(--text)}.accordion-wrapper .accordion-text-wrapper{border-top:1px solid var(--text);padding:1rem;width:100%}.accordion-wrapper .accordion-text-wrapper.accordion-text-hidden{display:none}.accordion-wrapper .accordion-text-wrapper.accordion-text-expanded{display:flex}.faqs-outer{background:var(--bg);padding-bottom:4rem;padding-top:8rem}.faqs-outer .faqs-body{display:flex;flex-direction:column}.faqs-outer .faqs-body .accordion-wrapper{margin-bottom:1rem}.faqs-outer .faqs-body .accordion-wrapper a{color:var(--main);text-decoration:underline}@media (max-width:768px){.faqs-outer{padding-bottom:2rem;padding-top:4rem}}.end-outer{background:var(--bg);padding-bottom:8rem;padding-top:4rem}.end-outer .end-wrapper{max-width:800px;text-align:center}.end-outer .end-wrapper h2{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;letter-spacing:.5px;line-height:1;padding-bottom:3rem}.end-outer .end-wrapper h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;padding-bottom:4rem}.end-outer .end-wrapper .end-cta{align-items:center;border:2px solid var(--text);border-radius:.5rem;cursor:pointer;display:flex;flex-direction:row;font-size:1.5rem;font-weight:700;line-height:2rem;margin-left:auto;margin-right:auto;padding:2rem 3rem;width:-moz-fit-content;width:fit-content}.end-outer .end-wrapper .end-cta svg{display:none;height:30px;width:30px}@media (max-width:768px){.end-outer{padding-bottom:2rem;padding-top:2rem}.end-outer .end-wrapper .end-cta{font-size:1.25rem;line-height:1.75rem;padding:.75rem 1.5rem}}.section-header{display:flex;flex-direction:column;padding-bottom:4rem;position:relative;text-align:center}.section-header,.section-header h1{margin-left:auto;margin-right:auto;max-width:700px}.section-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.section-header h2{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:2rem}@media (max-width:768px){.section-header{padding-bottom:2rem}}@media (max-width:680px){.section-header{padding-bottom:2rem}}.star{position:absolute}.page-wrapper{flex-direction:column;margin-left:auto;margin-right:auto;max-width:1232px;padding-left:1rem;padding-right:1rem;width:100%}.page-wrapper,.steps-wrapper{display:flex}.steps-wrapper{flex-direction:row;justify-content:space-between}.steps-wrapper .step{display:flex;flex:1;flex-direction:column;margin-right:2rem}.steps-wrapper .step:last-child{margin-right:0}.steps-wrapper .step .step-icon{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fff3;border-radius:9999px;margin-left:auto;margin-right:auto;padding:1.5rem;transition:all .3s}.steps-wrapper .step .step-icon svg{height:42px;width:42px}.steps-wrapper .step .step-copy{font-size:1.25rem;line-height:1.75rem;line-height:1.6;padding-top:1.5rem;text-align:center}.steps-wrapper .step .step-copy h3{font-family:Inter Tight,sans-serif;font-weight:700;letter-spacing:.3px;padding-bottom:.5rem}.steps-wrapper .step:hover .step-icon{transform:translateY(-12px) scale(1.025)}@media (max-width:768px){.steps-wrapper{flex-direction:column}.steps-wrapper .step{margin-bottom:2rem;margin-left:auto;margin-right:auto;max-width:400px}.steps-wrapper .step:last-child{margin-bottom:0;margin-left:auto;margin-right:auto}} diff --git a/_nuxt/index.yI_g7lt1.css b/_nuxt/index.yI_g7lt1.css deleted file mode 100644 index d4af3fe..0000000 --- a/_nuxt/index.yI_g7lt1.css +++ /dev/null @@ -1 +0,0 @@ -.hero-wrapper{padding-top:100px;position:relative}.hero-wrapper .hero{display:flex;flex-direction:column;margin-left:auto;margin-right:auto;max-width:600px;padding-bottom:8rem;padding-top:8rem;text-align:center;z-index:10}.hero-wrapper .hero h1{color:var(--text);font-family:Inter Tight,sans-serif;font-size:64px;font-weight:900;letter-spacing:1.4px;line-height:1.15;padding-bottom:2rem;position:relative;text-shadow:1px 1px 1px rgba(16,12,9,.6)}.hero-wrapper .hero h1 .emph{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2' viewBox='0 0 266 10'%3E%3Cpath d='M542.908 702.997c8.969-.976 23.554-2.567 38.36-3.695 8.829-.672 17.736-1.178 25.575-1.297 7.673-.107 16.285.138 24.785.551 14.426.699 28.53 1.876 37.188 2.597.309.029.571-.463.585-1.099s-.224-1.177-.532-1.207c-8.658-.956-22.763-2.512-37.193-3.609-8.515-.648-17.143-1.136-24.833-1.243-7.858-.119-16.789.12-25.643.52-14.828.669-29.438 1.794-38.423 2.488-.801.075-1.423 1.478-1.387 3.132s.717 2.937 1.518 2.862' style='fill:%2318caf9' transform='matrix(2.06349 0 0 1 -1117.152 -693)'/%3E%3C/svg%3E");background-position:50% 100%;background-repeat:no-repeat;background-size:contain;color:var(--main)}.hero-wrapper .hero h2{font-family:DM Sans,sans-serif;font-size:32px;font-weight:300;line-height:1.25;padding-bottom:4rem}.hero-wrapper .hero .cta-outer{margin-left:auto;margin-right:auto;position:relative;width:-moz-fit-content;width:fit-content}.hero-wrapper .hero .cta-outer .hero-cta{align-items:center;border-radius:.5rem;display:flex;flex-direction:row;font-size:1.25rem;font-weight:700;line-height:1.75rem;padding:1.5rem 2rem 1.5rem 3rem;position:relative;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background:#0006;border:3px solid var(--main);box-shadow:0 0 #0000,0 0 #0000,0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--text);top:0;transition:top .3s}.hero-wrapper .hero .cta-outer .hero-cta:hover{top:-4px}.hero-wrapper .hero .cta-outer .hero-cta .hero-cta-icon{padding-left:.5rem}.hero-wrapper .hero .cta-outer .hero-cta .hero-cta-icon svg{height:30px;width:30px}.hero-wrapper .hero .cta-outer .star-1{left:45px;top:-45px}.hero-wrapper .hero .cta-outer .star-2{left:-45px;top:10px;transform:rotate(15deg);width:22px}.hero-wrapper .hero .cta-outer .star-3{bottom:-45px;right:15px;transform:rotate(92deg);width:20px}.hero-wrapper .hero .cta-outer .star-4{bottom:10px;right:-45px;width:26px}.hero-wrapper .hero-images img{position:absolute}.hero-wrapper .hero-images .star{z-index:-1}.hero-wrapper .hero-images .planet-1{left:10px;top:100px}.hero-wrapper .hero-images .planet-2{bottom:45%;right:0;transform:rotate(-15deg)}.hero-wrapper .hero-images .planet-3{bottom:0;left:100px;transform:rotate(15deg)}@media (max-width:940px){.hero-wrapper .hero-images .planet-2{right:-10%}}@media (max-width:768px){.hero-wrapper .hero{border-radius:.5rem;margin-bottom:6rem;margin-top:6rem;padding-bottom:2rem;padding-top:2rem}.hero-wrapper .hero-images .planet-1{bottom:1px;left:auto;right:10%;top:auto}.hero-wrapper .hero-images .planet-2{max-width:180px;right:-10%;top:10%}.hero-wrapper .hero-images .planet-3{left:-5%;max-width:160px;top:40%}}@media (max-width:680px){.hero-wrapper .hero{margin-top:0}.hero-wrapper .hero h1{font-size:48px}.hero-wrapper .hero h2{font-size:28px}.hero-wrapper .hero-images{opacity:.9}}.brand-logos-wrapper{background:#100c09;color:#fff;margin-top:6rem;padding-bottom:2rem;padding-top:2rem;position:relative;z-index:1}.brand-logos-wrapper .brand-logos{align-items:center;display:flex;flex-direction:row;justify-content:space-around;margin-left:auto;margin-right:auto;max-width:800px}.brand-logos-wrapper .brand-logos .brand-logo{padding-left:.5rem;padding-right:.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.brand-logos-wrapper .brand-logos .brand-logo img{max-height:34px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.how-it-works-outer{position:relative}.how-it-works-outer .bg-img{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:#18caf974;border-radius:9999px;filter:blur(80px);height:400px;opacity:.8;position:absolute;right:50%;right:calc(50% - 200px);top:2rem;width:400px;z-index:0}.how-it-works-inner{background:#0006;padding-bottom:8rem;padding-top:8rem;position:relative;width:100%;z-index:1}.how-it-works-inner h1{font-size:1.875rem;font-weight:700;line-height:2.25rem}@media (max-width:768px){.how-it-works-inner{padding-bottom:4rem;padding-top:4rem}}.recent-work-outer{padding-bottom:8rem;padding-top:8rem}.recent-work-outer .slider-outer{position:relative}.recent-work-outer .slider-outer .slide-controls{display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.recent-work-outer .slider-outer .slide-controls .slide-control-left,.recent-work-outer .slider-outer .slide-controls .slide-control-right{align-items:center;background:#ffffff4d;border-radius:9999px;bottom:50%;cursor:pointer;display:flex;flex-direction:row;height:48px;justify-content:center;position:absolute;top:50%;width:48px}.recent-work-outer .slider-outer .slide-controls .slide-control-left svg,.recent-work-outer .slider-outer .slide-controls .slide-control-right svg{height:32px;width:32px}.recent-work-outer .slider-outer .slide-controls .slide-control-left{left:-64px}.recent-work-outer .slider-outer .slide-controls .slide-control-right{right:-64px}.recent-work-outer .slide{display:flex;flex-direction:row;width:100%}.recent-work-outer .slide .slide-left{border-radius:.5rem;display:flex;flex-direction:column;margin-bottom:auto;margin-right:2rem;margin-top:auto;max-width:33%;padding:2rem;width:100%}.recent-work-outer .slide .slide-left .project-icon{border-radius:9999px;height:200px;margin-bottom:3rem;margin-left:auto;margin-right:auto;overflow:hidden;width:200px}.recent-work-outer .slide .slide-left .project-name{background:#ffffff26;border-radius:.5rem;font-size:1.25rem;font-weight:700;line-height:1.75rem;margin-left:auto;margin-right:auto;padding:.5rem 1rem}.recent-work-outer .slide .slide-right{display:flex;flex:1;flex-direction:column;justify-content:center}.recent-work-outer .slide .slide-right img{border-radius:.5rem;height:100%;min-height:500px;width:100%}.recent-work-outer .slide .slide-right .report-text{padding-top:1rem}.recent-work-outer .slide .slide-right .testimonial-text-wrapper{background:#ffffff26;border-radius:.5rem;display:flex;flex-direction:row;font-size:1.5rem;font-style:italic;line-height:2rem;line-height:1.6;padding:2rem}.recent-work-outer .slide .slide-right .testimonial-text-wrapper svg{display:block;flex-shrink:0;height:64px;margin-right:1rem;width:64px}@media (max-width:768px){.recent-work-outer .slide .slide-right .testimonial-text-wrapper{font-size:1.875rem;line-height:2.25rem;line-height:1.8}.recent-work-outer .slide .slide-right .testimonial-text-wrapper svg{height:48px;margin-right:.5rem;width:48px}}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .testimonial-text{margin-bottom:auto;margin-top:auto}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .testimonial-text a{color:#18caf9}.recent-work-outer .slide .slide-right .testimonial-text-wrapper .name{font-style:normal}.recent-work-outer .slide .slide-right .see-more-outer{padding-top:1rem;width:100%}.recent-work-outer .slide .slide-right .see-more-outer .see-more-wrapper{align-items:center;display:flex;flex-direction:row;margin-left:auto;width:-moz-fit-content;width:fit-content}.recent-work-outer .slide .slide-right .see-more-outer .see-more-wrapper .see-more-text{padding-right:.5rem}@media (max-width:768px){.recent-work-outer{padding-bottom:4rem;padding-top:4rem}.recent-work-outer .slider-outer .slide-controls .slide-control-left,.recent-work-outer .slider-outer .slide-controls .slide-control-right{top:280px}.recent-work-outer .slider-outer .slide-controls .slide-control-left{left:0}.recent-work-outer .slider-outer .slide-controls .slide-control-right{right:0}.recent-work-outer .slide{flex-direction:column}.recent-work-outer .slide .slide-left{max-width:100%}}.services-outer{position:relative}.services-outer .services-inner{background:#0006;padding-bottom:8rem;padding-top:8rem;width:100%}.services-outer .services-inner .first-steps-wrapper{padding-bottom:6rem;padding-top:2rem}@media (max-width:768px){.services-outer .services-inner{padding-bottom:4rem;padding-top:4rem}.services-outer .services-inner .first-steps-wrapper{padding-bottom:2rem}}.services-outer .constellation-1,.services-outer .constellation-2{max-width:70vw;pointer-events:none;position:absolute;z-index:1}.services-outer .constellation-1{right:5%;top:40px}@media (max-width:800px){.services-outer .constellation-1{right:-10%}}.services-outer .constellation-2{left:12%;top:120px}@media (max-width:1000px){.services-outer .constellation-2{left:1%;top:200px}}@media (max-width:800px){.services-outer .constellation-2{left:-15%;max-width:200px;top:15%}}.services-outer .bg-img{-webkit-backdrop-filter:blur(200px);backdrop-filter:blur(200px);background:#18caf974;border-radius:9999px;filter:blur(200px);height:400px;left:-10%;opacity:.8;position:absolute;right:50%;right:calc(50% - 200px);top:5%;width:400px;z-index:0}@media (max-width:768px){.services-outer .services-inner{-webkit-backdrop-filter:none;backdrop-filter:none;background:#100c094d}}.toggle-wrapper{background:#fff3;border-radius:9999px;padding:.125rem .25rem;position:relative;width:-moz-fit-content;width:fit-content}.toggle-wrapper .toggle-bg{background:var(--main);left:0;margin:0 1px;position:absolute;top:4px;transition:all .3s;z-index:1}.toggle-wrapper .text{cursor:pointer;padding:.125rem .375rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:10}.plan-outer{padding-bottom:8rem;padding-top:8rem}.plan-outer .plan-header .star-1{left:-10px;top:-10px}.plan-outer .plan-header .star-2{right:30px;top:-40px;transform:rotate(-23deg);width:20px}.plan-outer .plan-header .star-3{bottom:20px;right:-30px;transform:rotate(-10deg)}.plan-outer .plan-toggle-wrapper{font-size:1.125rem;line-height:1.75rem;margin-left:auto;margin-right:auto;padding-bottom:2rem;padding-top:1rem}.plan-outer .plan{display:flex;flex-direction:column}.plan-outer .plan-body{background:#fff3;border-radius:.5rem;display:flex;flex-direction:row;margin-left:auto;margin-right:auto;max-width:800px;width:100%}.plan-outer .plan-body .plan-features,.plan-outer .plan-body .plan-info{display:flex;flex-direction:column;padding:2rem}.plan-outer .plan-body .plan-info{display:flex;flex:1;flex-direction:column;padding-right:1rem;width:100%}.plan-outer .plan-body .plan-info h1{font-size:3rem;line-height:1;padding-bottom:1rem}.plan-outer .plan-body .plan-info h1 .slash{font-weight:100}.plan-outer .plan-body .plan-info h1 .mo{color:var(--main);font-size:1.875rem;font-weight:300;line-height:2.25rem}.plan-outer .plan-body .plan-info h2{padding-bottom:1rem}.plan-outer .plan-body .plan-info h2,.plan-outer .plan-body .plan-info h3{font-size:1.25rem;line-height:1.75rem}.plan-outer .plan-body .plan-info h3{color:#b7b7b7;padding-bottom:2rem}.plan-outer .plan-body .plan-info .payment{background:var(--main);border:2px solid var(--main);border-radius:.5rem;color:var(--text);font-size:1.25rem;font-weight:900;line-height:1.75rem;margin-right:auto;padding:.75rem 1rem;transition:transform .3s}.plan-outer .plan-body .plan-info .payment:hover{transform:translateY(-6px) scale(1.025)}.plan-outer .plan-body .plan-features{display:flex;flex-direction:column;justify-content:center;padding-left:1rem}.plan-outer .plan-body .plan-features .plan-feature-row{display:flex;flex-direction:row;font-size:1.125rem;line-height:1.75rem;padding-bottom:1.5rem}.plan-outer .plan-body .plan-features .plan-feature-row:last-child{padding-bottom:0}.plan-outer .plan-body .plan-features .plan-feature-row .check{align-items:center;display:flex;flex-direction:row;padding-right:1rem}.plan-outer .plan-body .plan-features .plan-feature-row .check svg{border:2px solid var(--main);border-radius:9999px;color:var(--main);height:30px;padding:4px;width:30px;stroke-width:22}.plan-outer .booking-wrapper{align-items:center;color:#ccc;display:flex;flex-direction:row;font-size:1.125rem;line-height:1.75rem;margin-left:auto;margin-right:auto;max-width:800px;padding-top:4rem}.plan-outer .booking-wrapper .booking-text{font-size:1.125rem;line-height:1.75rem;padding-right:2rem}.plan-outer .booking-wrapper .booking-cta{align-items:center;border:2px solid #ccc;border-radius:.5rem;display:flex;flex-direction:row;padding:.5rem .75rem}.plan-outer .booking-wrapper .booking-cta svg{height:22px;width:28px}@media (max-width:768px){.plan-outer{padding-bottom:4rem;padding-top:4rem}}@media (max-width:550px){.plan-outer .plan-body{flex-direction:column}.plan-outer .plan-body .plan-info{padding-left:2rem;padding-right:2rem;text-align:center}.plan-outer .plan-body .plan-info .payment{text-align:center;width:100%}.plan-outer .plan-body .plan-features{padding-left:2rem;padding-top:0}.plan-outer .booking-wrapper{display:flex;flex-direction:column;padding-top:2rem}.plan-outer .booking-wrapper .booking-text{padding-bottom:1rem;padding-right:0}}.accordion-wrapper{border:1px solid var(--text);border-radius:.5rem}.accordion-wrapper .accordion-header{cursor:pointer;display:flex;flex-direction:row;padding:1rem}.accordion-wrapper .accordion-header .accordion-header-text{align-items:center;display:flex;flex:1;flex-direction:row;font-size:1.125rem;font-weight:700;line-height:1.75rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.accordion-wrapper .accordion-header .accordion-header-text span{cursor:auto;-webkit-user-select:text;-moz-user-select:text;user-select:text}.accordion-wrapper .accordion-header .accordion-header-icon{align-items:center;display:flex;flex-direction:row}.accordion-wrapper .accordion-header .accordion-header-icon svg{height:22px;width:22px;fill:var(--text)}.accordion-wrapper .accordion-text-wrapper{border-top:1px solid var(--text);padding:1rem;width:100%}.accordion-wrapper .accordion-text-wrapper.accordion-text-hidden{display:none}.accordion-wrapper .accordion-text-wrapper.accordion-text-expanded{display:flex}.faqs-outer{background:var(--bg);padding-bottom:4rem;padding-top:8rem}.faqs-outer .faqs-body{display:flex;flex-direction:column}.faqs-outer .faqs-body .accordion-wrapper{margin-bottom:1rem}.faqs-outer .faqs-body .accordion-wrapper a{color:var(--main);text-decoration:underline}@media (max-width:768px){.faqs-outer{padding-bottom:2rem;padding-top:4rem}}.end-outer{background:var(--bg);padding-bottom:8rem;padding-top:4rem}.end-outer .end-wrapper{max-width:800px;text-align:center}.end-outer .end-wrapper h2{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;letter-spacing:.5px;line-height:1;padding-bottom:3rem}.end-outer .end-wrapper h3{font-size:1.875rem;font-weight:300;line-height:2.25rem;padding-bottom:4rem}.end-outer .end-wrapper .end-cta{align-items:center;border:2px solid var(--text);border-radius:.5rem;cursor:pointer;display:flex;flex-direction:row;font-size:1.5rem;font-weight:700;line-height:2rem;margin-left:auto;margin-right:auto;padding:2rem 3rem;width:-moz-fit-content;width:fit-content}.end-outer .end-wrapper .end-cta svg{display:none;height:30px;width:30px}@media (max-width:768px){.end-outer{padding-bottom:2rem;padding-top:2rem}.end-outer .end-wrapper .end-cta{font-size:1.25rem;line-height:1.75rem;padding:.75rem 1.5rem}}.section-header{display:flex;flex-direction:column;padding-bottom:4rem;position:relative;text-align:center}.section-header,.section-header h1{margin-left:auto;margin-right:auto;max-width:700px}.section-header h1{font-family:Inter Tight,sans-serif;font-size:3rem;font-weight:700;line-height:1}.section-header h2{font-size:1.875rem;font-weight:300;line-height:2.25rem;line-height:1.3;padding-top:2rem}@media (max-width:768px){.section-header{padding-bottom:2rem}}@media (max-width:680px){.section-header{padding-bottom:2rem}}.star{position:absolute}.page-wrapper{flex-direction:column;margin-left:auto;margin-right:auto;max-width:1232px;padding-left:1rem;padding-right:1rem;width:100%}.page-wrapper,.steps-wrapper{display:flex}.steps-wrapper{flex-direction:row;justify-content:space-between}.steps-wrapper .step{display:flex;flex:1;flex-direction:column;margin-right:2rem}.steps-wrapper .step:last-child{margin-right:0}.steps-wrapper .step .step-icon{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fff3;border-radius:9999px;margin-left:auto;margin-right:auto;padding:1.5rem;transition:all .3s}.steps-wrapper .step .step-icon svg{height:42px;width:42px}.steps-wrapper .step .step-copy{font-size:1.25rem;line-height:1.75rem;line-height:1.6;padding-top:1.5rem;text-align:center}.steps-wrapper .step .step-copy h3{font-family:Inter Tight,sans-serif;font-weight:700;letter-spacing:.3px;padding-bottom:.5rem}.steps-wrapper .step:hover .step-icon{transform:translateY(-12px) scale(1.025)}@media (max-width:768px){.steps-wrapper{flex-direction:column}.steps-wrapper .step{margin-bottom:2rem;margin-left:auto;margin-right:auto;max-width:400px}.steps-wrapper .step:last-child{margin-bottom:0;margin-left:auto;margin-right:auto}} diff --git a/_nuxt/BsvTfDZ0.js b/_nuxt/mKNKLkDI.js similarity index 58% rename from _nuxt/BsvTfDZ0.js rename to _nuxt/mKNKLkDI.js index f904cb1..9242f98 100644 --- a/_nuxt/BsvTfDZ0.js +++ b/_nuxt/mKNKLkDI.js @@ -1 +1 @@ -import{f as n,J as e}from"./BlS8upJP.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; +import{f as n,I as e}from"./DiyP6pou.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; diff --git a/_nuxt/medusa-logo.B_CCAbp4.svg b/_nuxt/medusa-logo.B_CCAbp4.svg new file mode 100644 index 0000000..1212716 --- /dev/null +++ b/_nuxt/medusa-logo.B_CCAbp4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_nuxt/thinkk-logo.B37igL3_.png b/_nuxt/thinkk-logo.B37igL3_.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0711dcb46c67d16f85ae338e9170ffe718b4fb GIT binary patch literal 14172 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 literal 0 HcmV?d00001 diff --git a/_payload.json b/_payload.json index 03a80fe..63cd431 100644 --- a/_payload.json +++ b/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1714258642196] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1717143074718] \ No newline at end of file diff --git a/api/_content/cache.1714258600178.json b/api/_content/cache.1714258600178.json deleted file mode 100644 index a471229..0000000 --- a/api/_content/cache.1714258600178.json +++ /dev/null @@ -1 +0,0 @@ -{"generatedAt":1714258642052,"generateTime":7501,"contents":[{"_path":"/case-studies/automatisch","_dir":"case-studies","_draft":false,"_partial":false,"_locale":"","title":"Automatisch","description":"W","subtitle":"Going from the launch pad to the cosmos with E2E testing","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Automatisch","path":"/case-studies/automatisch/"}],"link":"/case-studies/automatisch","created":{"string":"February 26, 2024","month":"Feb","day":26,"year":2024},"shortDescription":"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch"},"children":[{"type":"text","value":"Improving Software Quality and Testing Infrastructure for Automatisch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with an open source no-code automation company called "},{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"automatisch-the-open-source-zapier-alternative"},"children":[{"type":"text","value":"Automatisch: The Open Source Zapier Alternative"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" is a reputable "},{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch","rel":["nofollow"]},"children":[{"type":"text","value":"open source"}]},{"type":"text","value":" software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"proactive-bug-finding-and-reporting"},"children":[{"type":"text","value":"Proactive Bug Finding and Reporting"}]},{"type":"element","tag":"h3","props":{"id":"our-approach-to-reporting-bugs"},"children":[{"type":"text","value":"Our approach to reporting bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Overview"}]},{"type":"text","value":": A Quick overview of the bug found, which generally includes an image"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Reproduction"}]},{"type":"text","value":": Detailed list of instructions for reproducing the bug"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Improvements"}]},{"type":"text","value":": Suggestions for how to resolve the bug and improve the software"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket."}]},{"type":"element","tag":"h3","props":{"id":"some-bugs-we-found"},"children":[{"type":"text","value":"Some Bugs We Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1371","rel":["nofollow"]},"children":[{"type":"text","value":"Recreating deleted users"}]}]},{"type":"text","value":": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1370","rel":["nofollow"]},"children":[{"type":"text","value":"Inconsistent interface conveying permissions"}]}]},{"type":"text","value":": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1366","rel":["nofollow"]},"children":[{"type":"text","value":"Deleting roles edge case"}]}]},{"type":"text","value":": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1235","rel":["nofollow"]},"children":[{"type":"text","value":"Invalidating GitHub OAuth error"}]}]},{"type":"text","value":": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems."}]},{"type":"element","tag":"h2","props":{"id":"dive-into-testing"},"children":[{"type":"text","value":"Dive into Testing"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright."}]},{"type":"element","tag":"h3","props":{"id":"refactoring-workflow-tests"},"children":[{"type":"text","value":"Refactoring Workflow Tests"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"test.step"}]},{"type":"text","value":" interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases."}]},{"type":"element","tag":"h3","props":{"id":"user-management"},"children":[{"type":"text","value":"User Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We overcame these challenges by upgrading the library used so we could put "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data-"}]},{"type":"text","value":" props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information."}]},{"type":"element","tag":"h3","props":{"id":"role-management"},"children":[{"type":"text","value":"Role Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users."}]},{"type":"element","tag":"h2","props":{"id":"ci-pipeline-enhancements"},"children":[{"type":"text","value":"CI Pipeline Enhancements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem."}]},{"type":"element","tag":"h2","props":{"id":"tangible-value"},"children":[{"type":"text","value":"Tangible Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch","depth":2,"text":"Improving Software Quality and Testing Infrastructure for Automatisch"},{"id":"automatisch-the-open-source-zapier-alternative","depth":2,"text":"Automatisch: The Open Source Zapier Alternative"},{"id":"proactive-bug-finding-and-reporting","depth":2,"text":"Proactive Bug Finding and Reporting","children":[{"id":"our-approach-to-reporting-bugs","depth":3,"text":"Our approach to reporting bugs"},{"id":"some-bugs-we-found","depth":3,"text":"Some Bugs We Found"}]},{"id":"dive-into-testing","depth":2,"text":"Dive into Testing","children":[{"id":"refactoring-workflow-tests","depth":3,"text":"Refactoring Workflow Tests"},{"id":"user-management","depth":3,"text":"User Management"},{"id":"role-management","depth":3,"text":"Role Management"}]},{"id":"ci-pipeline-enhancements","depth":2,"text":"CI Pipeline Enhancements"},{"id":"tangible-value","depth":2,"text":"Tangible Value"}]}},"_type":"markdown","_id":"content:case-studies:automatisch.md","_source":"content","_file":"case-studies/automatisch.md","_extension":"md"},{"_path":"/playwright/architecture","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"Architecture of Playwright","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"Architecture","path":"/playwright/architecture/"}],"link":"/playwright/architecture","created":{"string":"March 11, 2024","number":1710136800000,"month":"Mar","day":11,"year":2024},"shortDescription":"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of Playwright's architecture","src":"/img/playwright/architecture_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"intro"},"children":[{"type":"text","value":"Intro"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you load up the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright","rel":["nofollow"]},"children":[{"type":"text","value":"repository"}]},{"type":"text","value":" for the Playwright library, you may be overwhelmed by the numerous packages living both inside the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages"}]},{"type":"text","value":" folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test, chromium } from \"@playwright/test\";\n","filename":"example-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test, chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project."}]},{"type":"element","tag":"h2","props":{"id":"root-directory"},"children":[{"type":"text","value":"Root directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the root directory we find the following folders"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","filename":"playwright/","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"browser_patches/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"docs/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"examples/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"packages/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"tests/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"utils/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"along with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" which includes the following keys"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-dark","code":"{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","filename":"package.json","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"playwright-internal\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"private\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"workspaces\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"packages/*\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" gives us the hint the core functionality is within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" directory since the root "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" file is labelled private, has \"internal\" in its name, and uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\"workspaces\""}]},{"type":"text","value":" key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" folder"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser_patches"}]},{"type":"text","value":" - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"docs"}]},{"type":"text","value":" - The docs folder contains markdown files which compile to the documentation found on "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/intro","rel":["nofollow"]},"children":[{"type":"text","value":"the Playwright docs"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"examples"}]},{"type":"text","value":" - Here are examples of test scripts to refer to, while getting started with using the Playwright project."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tests"}]},{"type":"text","value":" - Even testing libraries should have automated tests, which are written in Playwright."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more."}]}]},{"type":"element","tag":"h2","props":{"id":"packages-directory"},"children":[{"type":"text","value":"Packages directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions."}]},{"type":"element","tag":"h3","props":{"id":"test-reportinggeneration-packages"},"children":[{"type":"text","value":"Test reporting/generation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"html-reporter/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"recorder/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace-viewer/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"web/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which contains the code associated with either handling test reports or "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/codegen-intro","rel":["nofollow"]},"children":[{"type":"text","value":"generating"}]},{"type":"text","value":" them with the recorder package. In addition, there is the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/trace-viewer","rel":["nofollow"]},"children":[{"type":"text","value":"trace and trace viewer"}]},{"type":"text","value":" which can be recorded during playwright test runs. In addition, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"web/"}]},{"type":"text","value":" package provides utilities shared across the various web-based tools listed here."}]},{"type":"element","tag":"h3","props":{"id":"browser-specialized-packages"},"children":[{"type":"text","value":"Browser specialized packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each of the packages here are simply exports of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package along with an install script for the associated browser only. You can find them on npmjs, for example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/playwright-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-chromium"}]},{"type":"text","value":" is its own package which has playwright specialized for only automating chromium."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"browser-installation-packages"},"children":[{"type":"text","value":"Browser installation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages listed here only include install scripts for each of the browsers. For example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/@playwright/browser-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-browser-chromium"}]},{"type":"text","value":" corresponds to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/browser-chromium"}]},{"type":"text","value":" package on npmjs."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"component-testing-packages"},"children":[{"type":"text","value":"Component testing packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These packages are all associated to the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/test-components","rel":["nofollow"]},"children":[{"type":"text","value":"experimental component testing framework"}]},{"type":"text","value":" in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react17/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-solid/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-svelte/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue2/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"core-functionality-packages"},"children":[{"type":"text","value":"Core functionality packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-test/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"protocol/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-test"}]},{"type":"text","value":" folder is simply a wrapper for binding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" together in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" package installable through npm. If you look in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file, all you'll see is an export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright/test"}]},{"type":"text","value":", which lives in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another package to look at briefly is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol"}]},{"type":"text","value":" package which has automatically generated code through some of the build scripts in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" directory of the root directory of the playwright project. This simply contains a YAML file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol.yml"}]},{"type":"text","value":", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the two main packages of the entire playwright library are the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrite-core"}]},{"type":"text","value":" packages. The first of which is a wrapper around "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright.config.ts"}]},{"type":"text","value":" file, or any of the associated test running code, such as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test } from \"@playwright/test\";\n","filename":"my-test.spec.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"then you are likely importing code from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The other main package is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" which contains all of the browser automation functionality. This functionality is split up into two main components, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/server"}]},{"type":"text","value":", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the "},{"type":"element","tag":"a","props":{"href":"https://chromedevtools.github.io/devtools-protocol/","rel":["nofollow"]},"children":[{"type":"text","value":"Chrome Devtools Protocol"}]},{"type":"text","value":" (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '"},{"type":"element","tag":"a","props":{"href":"https://news.ycombinator.com","rel":["nofollow"]},"children":[{"type":"text","value":"https://news.ycombinator.com"}]},{"type":"text","value":"'\". The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"On the other hand, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really you are importing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" from an instance of the class in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/client/playwright"}]},{"type":"text","value":". Then, calling "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser.newPage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" is making requests to interfaces in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package since it provides a comprehensive and battle tested API for this kind of functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This splitting of responsibility design pattern works well because it allows for "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"supporting"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-java/","rel":["nofollow"]},"children":[{"type":"text","value":"multiple"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-dotnet","rel":["nofollow"]},"children":[{"type":"text","value":"languages"}]},{"type":"text","value":" which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":") as you would in the the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"looking-beyond"},"children":[{"type":"text","value":"Looking beyond"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"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);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"intro","depth":2,"text":"Intro"},{"id":"root-directory","depth":2,"text":"Root directory"},{"id":"packages-directory","depth":2,"text":"Packages directory","children":[{"id":"test-reportinggeneration-packages","depth":3,"text":"Test reporting/generation packages"},{"id":"browser-specialized-packages","depth":3,"text":"Browser specialized packages"},{"id":"browser-installation-packages","depth":3,"text":"Browser installation packages"},{"id":"component-testing-packages","depth":3,"text":"Component testing packages"},{"id":"core-functionality-packages","depth":3,"text":"Core functionality packages"}]},{"id":"looking-beyond","depth":2,"text":"Looking beyond"}]}},"_type":"markdown","_id":"content:playwright:architecture.md","_source":"content","_file":"playwright/architecture.md","_extension":"md"},{"_path":"/playwright/how-playwright-initializes","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"How importing from Playwright works","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"How Playwright Initializes","path":"/playwright/how-playwright-initializes/"}],"image":"img","shortDescription":"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.","created":{"string":"March 13, 2024","number":1710309600000,"month":"Mar","day":13,"year":2024},"link":"/playwright/how-playwright-initializes","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of playwright-core initialization process","src":"/img/playwright/playwright-core_initialization_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"peering-into-playwrights-import-process"},"children":[{"type":"text","value":"Peering into Playwright's import process"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" '@playwright/test'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://qacomet.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture."}]},{"type":"element","tag":"h3","props":{"id":"merging-playwright-and-playwright-core"},"children":[{"type":"text","value":"Merging "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Internally, when you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":", there is an underlying call to import from two merged packages, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":". This merge happens in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":", since "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is just an outward facinging export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"require('playwright/test')"}]},{"type":"text","value":", an alias for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":". This is where the test execution API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" are combined with the browser automation API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will focus on the import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", since it provides the core browser automation and is the code every other client library wraps. Looking at its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file"}]},{"type":"element","tag":"pre","props":{"className":"language-js shiki shiki-themes github-dark","code":"module.exports = require(\"./lib/inprocess\");\n","filename":"packages/playwright-core/index.js","language":"js","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"module"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"exports"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"./lib/inprocess\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"gives an export from its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib/inprocess.ts"}]},{"type":"text","value":" file (note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" directory is compiled to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib"}]},{"type":"text","value":" directory after playwright runs its build script, and is what's found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"node_modules/playwright-core"}]},{"type":"text","value":", hence the require imports from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./lib/"}]},{"type":"text","value":" and not "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./src/"}]},{"type":"text","value":"). The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inprocess.ts"}]},{"type":"text","value":" file just imports from the adjacent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" and executes the function from there, called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include the source below in its own section but note "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" dynamically intiailizes the interface between the client library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":", and the server library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-python"}]},{"type":"text","value":" source code, you will find the same design patterns and classes defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"'s "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"h3","props":{"id":"rapid-overview-of-the-client-and-server-libraries"},"children":[{"type":"text","value":"Rapid overview of the client and server libraries"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" the main functionality can be found in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" folders. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" folder contains classes, many of which are subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class. This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class is a client-side representation of a corresponding server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" class in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server/dispatchers"}]},{"type":"text","value":" folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":", containing the client side APIs (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":"), there is a corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":". When we call "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" a message is send over the unique client "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" instance to the unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" instance, which calls the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works."}]},{"type":"element","tag":"h2","props":{"id":"playwrights-core-api-factory-createinprocessplaywright"},"children":[{"type":"text","value":"Playwright's core API factory, createInProcessPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":", contains only one function called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include it here as a reference:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createInProcessPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dispatch synchronously at first.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"webkit\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI._android._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" AndroidServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Switch to async dispatch after we got Playwright object.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"toImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"x"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" x\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(x._guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")._toImpl "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection.toImpl;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you scan through the script and look at the return value, you'll see Playwright is returning the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" instance "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":", which is defined somewhere within the client library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/src/client/"}]},{"type":"text","value":" (which we find from our type hints). So when we write a script using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"playwright-core\";\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really we are making an import of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":" object and accessing its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" property, so our script is secretly"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Tracing where this object is instantiated, we find the call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is not very descriptive. If you try looking in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class definition, you won't get very far either, you'll just see"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export class Connection extends EventEmitter {\n readonly _objects = new Map();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _objects"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Map"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is even more opaque. From this all we know is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class keeps an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" map which at some point contains an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":" will give us a clear picture of how this library is wrapped together."}]},{"type":"element","tag":"h2","props":{"id":"cross-communication-between-client-and-server"},"children":[{"type":"text","value":"Cross communication between client and server"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you look through the script's imports, anything with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" in its name, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":", come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" directroy. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function creates an instance of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly, the imports for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" directory. Looking through the first lines of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":", there is an instantiation of the server "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class and instantiation of objects for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ClientConnection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next lines of code are the bridge between the internal client and server libraries"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"given by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" properties for each of these objects. Notice each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" calls the other's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" method; i.e., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" through "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" and vice versa. This gives us the hint somehow "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" will be called somewhere in the codebase."}]},{"type":"element","tag":"h3","props":{"id":"server-side-createplaywright"},"children":[{"type":"text","value":"Server-side createPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before we continue down the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", let's go over what the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function actually does. It is a simple function call which instantiates the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":". Below is a simplified version of it"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n","filename":"packages/playwright-core/server/playwright.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./chromium/chromium\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Firefox } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./firefox/firefox\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Selectors } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./selectors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { WebKit } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./webkit/webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { createInstrumentation, SdkObject } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./instrumentation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" SdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" debugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { attribution: {}, instrumentation: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"createInstrumentation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"() } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".options "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" options;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".chromium "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".firefox "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".webkit "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".selectors "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".debugController "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/chromium/"}]},{"type":"text","value":" you will see all the functionality for automating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" browser."}]},{"type":"element","tag":"h3","props":{"id":"rootdispatcher-and-server-side-playwright"},"children":[{"type":"text","value":"RootDispatcher and server-side Playwright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuing down "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", we see there's the construction of a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RootDispatcher"}]},{"type":"text","value":" instance, and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":" instance."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object is referenced throughout the dispatcher classes, and acts as a wrapper around the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" object instantiated above, so that each of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object. This wrapping functionality will become clearer when we dive into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor, where it passes the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" to all of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's a simplified version of what's happening in the constructor for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Rootscope"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","filename":"playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(connection, { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Root\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ParentScopeType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" channels"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"InitializerTraits"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent._connection;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._guid "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object.guid;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"registerDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" guid,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor we see the connection always comes from either the inherited parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", or from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" passed into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"parent"}]},{"type":"text","value":" parameter. This, coupled with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" having the name "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"root"}]},{"type":"text","value":", gives us the hint that every dispatcher in the server library will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" instance (from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":"). Furthermore, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" will register every instance of a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", hinting that it will communicate with each of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" objects. These points will become more clear after looking at the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor."}]},{"type":"element","tag":"h4","props":{"id":"playwrightdispatcher-and-its-constructor"},"children":[{"type":"text","value":"PlaywrightDispatcher and its constructor"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's look closer at a slightly simplified version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","filename":"packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Playwright } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core/src/server/playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"scope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.chromium),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.firefox),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.webkit),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notice the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"super"}]},{"type":"text","value":" call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" passed into it as the first parameter. Every call to the server will run through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":", which then can be traced through calls in each of the dispatcher classes. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserTypeDispatcher"}]},{"type":"text","value":" will launch a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserDispatcher"}]},{"type":"text","value":", which is responsible for creating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserContextDispatcher"}]},{"type":"text","value":", which can create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" defined in the factory method with confidence!"}]},{"type":"element","tag":"h3","props":{"id":"tying-back-to-the-onmessage-communication"},"children":[{"type":"text","value":"Tying back to the onmessage communication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnect.onmessage"}]},{"type":"text","value":" functions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" function is called from two main methods. These are "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":". The first, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":", is called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":", so the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcher.onmessage"}]},{"type":"text","value":" call in that case acts as a response callback. The second, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", is called from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendEvent"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendAdopt"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendDestroy"}]},{"type":"text","value":" methods defined within the dispatcher. Calls to these functions are spread throughout the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses which call these functions from their internal "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_connection"}]},{"type":"text","value":" variable. These will tell the client to construct, update, and destroy, their corresponding client side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" objects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Separately on the client-side, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":" is called from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendMessageToServer"}]},{"type":"text","value":" whenever you use a client-side API. This sends a message over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":", which finds the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", as mentioned before."}]},{"type":"element","tag":"h3","props":{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners"},"children":[{"type":"text","value":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function is special because it is only called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" implementation, internally it calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":" with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" parameter:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","filename":"packages/playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" SdkObject) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(initializer, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplToWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"), binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._isLocal "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'toBase64'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent._guid, type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { type, initializer, guid }, sdkObject);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so if we search through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class on the client side, sure enough in its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" function it has a call to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" for the associated method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":". This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" is what initializes the client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, and is the reason why we call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":". For the Playwright create message, the message looks something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" method"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" params"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@024d5a494527ece580841844a9a933a6'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@fae8f48651c02682ad3b276f0a046d63'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'android@832582c466c24c6933d3a5587059e1be'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'electron@3829a7608477101154e15c1e25bca9ca'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note before this "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" message is passed to create the Playwright API on the client side, there were "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" messages for each of the device types, meaning there already exists a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserType"}]},{"type":"text","value":" for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"firefox"}]},{"type":"text","value":", etc. before the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" message for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" is sent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class, which is a concept for a later section. For now, let's trace what happens in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"type: 'Playwright'"}]},{"type":"text","value":" message."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatchConnection.onmessage"}]},{"type":"text","value":", which calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" function, which then calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function with the following parameters"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// parentGuid - corresponds to Root, the root ChannelOwner\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// guid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // initializer\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@024d5a494527ece580841844a9a933a6\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@fae8f48651c02682ad3b276f0a046d63\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" android: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"android@832582c466c24c6933d3a5587059e1be\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" electron: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"electron@3829a7608477101154e15c1e25bca9ca\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function there is a transformation of the data and then a large "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"switch-case"}]},{"type":"text","value":" function instantiating the corresponding client class."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid: string, type: string, guid: string, initializer: any) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// here the parentGuid is ''\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"`Cannot find parent object ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parentGuid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"} to create ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" let"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" ''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplFromWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._rawBuffers "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'fromBase64'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" switch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (type) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" case"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":":\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent, type, guid, initializer);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" break"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tChannelImpl: _tChannelImplFromWire"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class. If you look at the type definition in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable is a map returning one of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses. So in the result above for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"case: 'Playwright'"}]},{"type":"text","value":", it returns a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, which is a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":", defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"launching-the-browser-instance"},"children":[{"type":"text","value":"Launching the browser instance"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The final bit of code in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" to consider is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_serverLauncher"}]},{"type":"text","value":" variables being set in each of the drivers. This is written as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" class is defined next to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" file in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browserServerLauncherImpl.ts"}]},{"type":"text","value":". The main functionality in this class lies in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"launchServer"}]},{"type":"text","value":" function, and is only called when you use the"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launchServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(serverOptions);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'playwright-core'"}]},{"type":"text","value":" library, something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ... automate page interactions here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so for now we skip giving an overview of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" code and defer it to a later post."}]},{"type":"element","tag":"h2","props":{"id":"recap"},"children":[{"type":"text","value":"Recap"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whew! That was quite the journey, so let's recap the main points we covered in this post:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is a wrapper around the test runner package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" and the browser automation package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Importing from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" is a dynamically generated process under the hood, which is done in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/inProcessFactory.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" there are two main libraries, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" libraries."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This separation exists so other programming languages can easily build a client library which communicates with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The client-side API and server-side API communicate with each other over a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" object and a server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" object. These pass messages with one another through their runtime-defined "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" callback."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is responsible for constructing client side API's, the API methods you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is responsible for keeping track of the dispatcher objects on the server side."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The instances of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is wrapped by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses, which all point to the same instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":". Similarly, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is wrapped by a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" which is responsible for a part of the automated browser."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Both the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes keep track of the same object on each side of the client/server side of the divide with a unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GUID"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once you have parsed the functionality of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"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);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"peering-into-playwrights-import-process","depth":2,"text":"Peering into Playwright's import process","children":[{"id":"merging-playwright-and-playwright-core","depth":3,"text":"Merging playwright and playwright-core"},{"id":"rapid-overview-of-the-client-and-server-libraries","depth":3,"text":"Rapid overview of the client and server libraries"}]},{"id":"playwrights-core-api-factory-createinprocessplaywright","depth":2,"text":"Playwright's core API factory, createInProcessPlaywright"},{"id":"cross-communication-between-client-and-server","depth":2,"text":"Cross communication between client and server","children":[{"id":"server-side-createplaywright","depth":3,"text":"Server-side createPlaywright"},{"id":"rootdispatcher-and-server-side-playwright","depth":3,"text":"RootDispatcher and server-side Playwright"},{"id":"tying-back-to-the-onmessage-communication","depth":3,"text":"Tying back to the onmessage communication"},{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners","depth":3,"text":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"id":"launching-the-browser-instance","depth":2,"text":"Launching the browser instance"},{"id":"recap","depth":2,"text":"Recap"}]}},"_type":"markdown","_id":"content:playwright:how-playwright-initializes.md","_source":"content","_file":"playwright/how-playwright-initializes.md","_extension":"md"},{"_path":"/privacy-policy","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Privacy Policy","description":"Effective Date: This Privacy Policy is effective as of February 16, 2024.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Effective Date"}]},{"type":"text","value":": "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"This Privacy Policy is effective as of February 16, 2024."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this Privacy Policy, unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"QAComet"}]},{"type":"text","value":"\" refers to the website operated by QAComet LLC accessible at QAComet.com"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Personal Information"}]},{"type":"text","value":"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Non-Personal Information"}]},{"type":"text","value":"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cookies"}]},{"type":"text","value":"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Google Analytics"}]},{"type":"text","value":"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"User"}]},{"type":"text","value":"\" refers to any individual who accesses or uses the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein."}]},{"type":"element","tag":"h2","props":{"id":"_1-information-collection"},"children":[{"type":"text","value":"1. INFORMATION COLLECTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We collect two types of information from users: personal information and non-personal information."}]},{"type":"element","tag":"h3","props":{"id":"personal-information"},"children":[{"type":"text","value":"Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website."}]}]},{"type":"element","tag":"h3","props":{"id":"non-personal-information"},"children":[{"type":"text","value":"Non-Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information."}]}]},{"type":"element","tag":"h3","props":{"id":"google-analytics"},"children":[{"type":"text","value":"Google Analytics:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-information"},"children":[{"type":"text","value":"2. USE OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users for the following purposes:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies."}]},{"type":"element","tag":"h2","props":{"id":"_3-sharing-of-information"},"children":[{"type":"text","value":"3. SHARING OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We may share both personal and non-personal information collected from users in the following circumstances:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone."}]}]},{"type":"element","tag":"h2","props":{"id":"_4-google-analytics"},"children":[{"type":"text","value":"4. GOOGLE ANALYTICS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: "},{"type":"element","tag":"a","props":{"href":"https://policies.google.com/privacy?hl=en-US","rel":["nofollow"]},"children":[{"type":"text","value":"Google Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website."}]},{"type":"element","tag":"h2","props":{"id":"_5-data-security"},"children":[{"type":"text","value":"5. DATA SECURITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels."}]},{"type":"element","tag":"h2","props":{"id":"_6-user-controls"},"children":[{"type":"text","value":"6. USER CONTROLS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":". This browser add-on allows users to prevent their data from being collected and used by Google Analytics."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights."}]},{"type":"element","tag":"h2","props":{"id":"_7-changes-to-the-privacy-policy"},"children":[{"type":"text","value":"7. CHANGES TO THE PRIVACY POLICY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_8-contact-information"},"children":[{"type":"text","value":"8. CONTACT INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS:"},{"id":"_1-information-collection","depth":2,"text":"1. INFORMATION COLLECTION:","children":[{"id":"personal-information","depth":3,"text":"Personal Information:"},{"id":"non-personal-information","depth":3,"text":"Non-Personal Information:"},{"id":"google-analytics","depth":3,"text":"Google Analytics:"}]},{"id":"_2-use-of-information","depth":2,"text":"2. USE OF INFORMATION:"},{"id":"_3-sharing-of-information","depth":2,"text":"3. SHARING OF INFORMATION:"},{"id":"_4-google-analytics","depth":2,"text":"4. GOOGLE ANALYTICS:"},{"id":"_5-data-security","depth":2,"text":"5. DATA SECURITY:"},{"id":"_6-user-controls","depth":2,"text":"6. USER CONTROLS:"},{"id":"_7-changes-to-the-privacy-policy","depth":2,"text":"7. CHANGES TO THE PRIVACY POLICY:"},{"id":"_8-contact-information","depth":2,"text":"8. CONTACT INFORMATION:"}]}},"_type":"markdown","_id":"content:privacy-policy.md","_source":"content","_file":"privacy-policy.md","_extension":"md"},{"_path":"/terms-and-conditions","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms And Conditions","description":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\")."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Website"}]},{"type":"text","value":"\" refers to the QAComet website, accessible at "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/","rel":["nofollow"]},"children":[{"type":"text","value":"QAComet.com"}]},{"type":"text","value":", including all associated web pages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":"\" refers to any products, features, or functionalities offered on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Content"}]},{"type":"text","value":"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Affiliates"}]},{"type":"text","value":"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Terms"}]},{"type":"text","value":"\" refers to these General Terms and Conditions governing the use of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Modification"}]},{"type":"text","value":"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion."}]},{"type":"element","tag":"h2","props":{"id":"_1-acceptance-of-terms"},"children":[{"type":"text","value":"1. ACCEPTANCE OF TERMS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-website"},"children":[{"type":"text","value":"2. USE OF WEBSITE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities"}]},{"type":"element","tag":"h2","props":{"id":"_3-intellectual-property"},"children":[{"type":"text","value":"3. INTELLECTUAL PROPERTY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties."}]},{"type":"element","tag":"h2","props":{"id":"_4-privacy-policy"},"children":[{"type":"text","value":"4. PRIVACY POLICY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/privacy-policy","rel":["nofollow"]},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"_5-disclaimer-of-warranties"},"children":[{"type":"text","value":"5. DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_6-limitation-of-liability"},"children":[{"type":"text","value":"6. LIMITATION OF LIABILITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_7-modification-and-termination"},"children":[{"type":"text","value":"7. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it."}]},{"type":"element","tag":"h2","props":{"id":"_8-governing-law-and-dispute-resolution"},"children":[{"type":"text","value":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The language of arbitration and all related proceedings shall be English."}]},{"type":"element","tag":"h2","props":{"id":"_9-miscellaneous"},"children":[{"type":"text","value":"9. MISCELLANEOUS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Contact Information: If you have any questions about these Terms or the QAComet website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS"},{"id":"_1-acceptance-of-terms","depth":2,"text":"1. ACCEPTANCE OF TERMS:"},{"id":"_2-use-of-website","depth":2,"text":"2. USE OF WEBSITE"},{"id":"_3-intellectual-property","depth":2,"text":"3. INTELLECTUAL PROPERTY:"},{"id":"_4-privacy-policy","depth":2,"text":"4. PRIVACY POLICY"},{"id":"_5-disclaimer-of-warranties","depth":2,"text":"5. DISCLAIMER OF WARRANTIES:"},{"id":"_6-limitation-of-liability","depth":2,"text":"6. LIMITATION OF LIABILITY:"},{"id":"_7-modification-and-termination","depth":2,"text":"7. MODIFICATION AND TERMINATION:"},{"id":"_8-governing-law-and-dispute-resolution","depth":2,"text":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"},{"id":"_9-miscellaneous","depth":2,"text":"9. MISCELLANEOUS:"}]}},"_type":"markdown","_id":"content:terms-and-conditions.md","_source":"content","_file":"terms-and-conditions.md","_extension":"md"},{"_path":"/terms-of-service","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms Of Service","description":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"Definitions:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client"}]},{"type":"text","value":": Refers to individuals or entities who utilize QAComet's QA/Testing services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Company"}]},{"type":"text","value":": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Materials"}]},{"type":"text","value":": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ownership"}]},{"type":"text","value":": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client-Specific Utilities"}]},{"type":"text","value":": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Design Patterns"}]},{"type":"text","value":": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Trial Period"}]},{"type":"text","value":": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Subscription Fee"}]},{"type":"text","value":": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Intellectual Property Rights"}]},{"type":"text","value":": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Dispute Resolution"}]},{"type":"text","value":": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms."}]},{"type":"element","tag":"h2","props":{"id":"_2-scope-of-service"},"children":[{"type":"text","value":"2. SCOPE OF SERVICE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_3-account-security"},"children":[{"type":"text","value":"3. ACCOUNT SECURITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet."}]},{"type":"element","tag":"h2","props":{"id":"_4-right-to-refuse-or-cancel-services"},"children":[{"type":"text","value":"4. RIGHT TO REFUSE OR CANCEL SERVICES"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_5-promotional-rights"},"children":[{"type":"text","value":"5. PROMOTIONAL RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials."}]},{"type":"element","tag":"h2","props":{"id":"_6-ownership-of-materials"},"children":[{"type":"text","value":"6. OWNERSHIP OF MATERIALS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials."}]},{"type":"element","tag":"h2","props":{"id":"_7-client-responsibilities"},"children":[{"type":"text","value":"7. CLIENT RESPONSIBILITIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_8-billing-and-payments"},"children":[{"type":"text","value":"8. BILLING AND PAYMENTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client."}]},{"type":"element","tag":"h2","props":{"id":"_9-intellectual-property-rights"},"children":[{"type":"text","value":"9. INTELLECTUAL PROPERTY RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests."}]},{"type":"text","value":"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client."}]},{"type":"element","tag":"h2","props":{"id":"_10-qacomet-pre-existing-ip-materials"},"children":[{"type":"text","value":"10. QACOMET Pre-Existing IP MATERIALS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement."}]},{"type":"element","tag":"h2","props":{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties"},"children":[{"type":"text","value":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances."}]},{"type":"element","tag":"h2","props":{"id":"_12-confidentiality"},"children":[{"type":"text","value":"12. CONFIDENTIALITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity."}]},{"type":"element","tag":"h2","props":{"id":"_13-dispute-resolution-and-governing-law"},"children":[{"type":"text","value":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts."}]},{"type":"element","tag":"h2","props":{"id":"_14-modification-and-termination"},"children":[{"type":"text","value":"14. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service."}]},{"type":"element","tag":"h2","props":{"id":"_15-severability"},"children":[{"type":"text","value":"15. SEVERABILITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision."}]},{"type":"element","tag":"h2","props":{"id":"_16-contact-us"},"children":[{"type":"text","value":"16. Contact Us:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"Definitions:"},{"id":"_2-scope-of-service","depth":2,"text":"2. SCOPE OF SERVICE"},{"id":"_3-account-security","depth":2,"text":"3. ACCOUNT SECURITY"},{"id":"_4-right-to-refuse-or-cancel-services","depth":2,"text":"4. RIGHT TO REFUSE OR CANCEL SERVICES"},{"id":"_5-promotional-rights","depth":2,"text":"5. PROMOTIONAL RIGHTS:"},{"id":"_6-ownership-of-materials","depth":2,"text":"6. OWNERSHIP OF MATERIALS:"},{"id":"_7-client-responsibilities","depth":2,"text":"7. CLIENT RESPONSIBILITIES:"},{"id":"_8-billing-and-payments","depth":2,"text":"8. BILLING AND PAYMENTS:"},{"id":"_9-intellectual-property-rights","depth":2,"text":"9. INTELLECTUAL PROPERTY RIGHTS:"},{"id":"_10-qacomet-pre-existing-ip-materials","depth":2,"text":"10. QACOMET Pre-Existing IP MATERIALS."},{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties","depth":2,"text":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"},{"id":"_12-confidentiality","depth":2,"text":"12. CONFIDENTIALITY:"},{"id":"_13-dispute-resolution-and-governing-law","depth":2,"text":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"},{"id":"_14-modification-and-termination","depth":2,"text":"14. MODIFICATION AND TERMINATION:"},{"id":"_15-severability","depth":2,"text":"15. SEVERABILITY"},{"id":"_16-contact-us","depth":2,"text":"16. Contact Us:"}]}},"_type":"markdown","_id":"content:terms-of-service.md","_source":"content","_file":"terms-of-service.md","_extension":"md"}],"navigation":[{"title":"Case Studies","_path":"/case-studies","children":[{"title":"Automatisch","_path":"/case-studies/automatisch"}]},{"title":"Playwright","_path":"/playwright","children":[{"title":"Architecture of Playwright","_path":"/playwright/architecture"},{"title":"How importing from Playwright works","_path":"/playwright/how-playwright-initializes"}]},{"title":"Privacy Policy","_path":"/privacy-policy"},{"title":"Terms And Conditions","_path":"/terms-and-conditions"},{"title":"Terms Of Service","_path":"/terms-of-service"}]} \ No newline at end of file diff --git a/api/_content/cache.1717143045798.json b/api/_content/cache.1717143045798.json new file mode 100644 index 0000000..1c81c7a --- /dev/null +++ b/api/_content/cache.1717143045798.json @@ -0,0 +1 @@ +{"generatedAt":1717143074653,"generateTime":7911,"contents":[{"_path":"/case-studies/automatisch","_dir":"case-studies","_draft":false,"_partial":false,"_locale":"","title":"Automatisch","description":"","subtitle":"Going from the launch pad to the cosmos with E2E testing","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Automatisch","path":"/case-studies/automatisch/"}],"link":"/case-studies/automatisch","created":{"string":"February 26, 2024","month":"Feb","day":26,"year":2024},"shortDescription":"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch"},"children":[{"type":"text","value":"Improving Software Quality and Testing Infrastructure for Automatisch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with an open source no-code automation company called "},{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"automatisch-the-open-source-zapier-alternative"},"children":[{"type":"text","value":"Automatisch: The Open Source Zapier Alternative"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" is a reputable "},{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch","rel":["nofollow"]},"children":[{"type":"text","value":"open source"}]},{"type":"text","value":" software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"proactive-bug-finding-and-reporting"},"children":[{"type":"text","value":"Proactive Bug Finding and Reporting"}]},{"type":"element","tag":"h3","props":{"id":"our-approach-to-reporting-bugs"},"children":[{"type":"text","value":"Our approach to reporting bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Overview"}]},{"type":"text","value":": A Quick overview of the bug found, which generally includes an image"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Reproduction"}]},{"type":"text","value":": Detailed list of instructions for reproducing the bug"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Improvements"}]},{"type":"text","value":": Suggestions for how to resolve the bug and improve the software"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket."}]},{"type":"element","tag":"h3","props":{"id":"some-bugs-we-found"},"children":[{"type":"text","value":"Some Bugs We Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1371","rel":["nofollow"]},"children":[{"type":"text","value":"Recreating deleted users"}]}]},{"type":"text","value":": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1370","rel":["nofollow"]},"children":[{"type":"text","value":"Inconsistent interface conveying permissions"}]}]},{"type":"text","value":": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1366","rel":["nofollow"]},"children":[{"type":"text","value":"Deleting roles edge case"}]}]},{"type":"text","value":": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1235","rel":["nofollow"]},"children":[{"type":"text","value":"Invalidating GitHub OAuth error"}]}]},{"type":"text","value":": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems."}]},{"type":"element","tag":"h2","props":{"id":"dive-into-testing"},"children":[{"type":"text","value":"Dive into Testing"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright."}]},{"type":"element","tag":"h3","props":{"id":"refactoring-workflow-tests"},"children":[{"type":"text","value":"Refactoring Workflow Tests"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"test.step"}]},{"type":"text","value":" interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases."}]},{"type":"element","tag":"h3","props":{"id":"user-management"},"children":[{"type":"text","value":"User Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We overcame these challenges by upgrading the library used so we could put "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data-"}]},{"type":"text","value":" props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information."}]},{"type":"element","tag":"h3","props":{"id":"role-management"},"children":[{"type":"text","value":"Role Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users."}]},{"type":"element","tag":"h2","props":{"id":"ci-pipeline-enhancements"},"children":[{"type":"text","value":"CI Pipeline Enhancements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem."}]},{"type":"element","tag":"h2","props":{"id":"tangible-value"},"children":[{"type":"text","value":"Tangible Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch","depth":2,"text":"Improving Software Quality and Testing Infrastructure for Automatisch"},{"id":"automatisch-the-open-source-zapier-alternative","depth":2,"text":"Automatisch: The Open Source Zapier Alternative"},{"id":"proactive-bug-finding-and-reporting","depth":2,"text":"Proactive Bug Finding and Reporting","children":[{"id":"our-approach-to-reporting-bugs","depth":3,"text":"Our approach to reporting bugs"},{"id":"some-bugs-we-found","depth":3,"text":"Some Bugs We Found"}]},{"id":"dive-into-testing","depth":2,"text":"Dive into Testing","children":[{"id":"refactoring-workflow-tests","depth":3,"text":"Refactoring Workflow Tests"},{"id":"user-management","depth":3,"text":"User Management"},{"id":"role-management","depth":3,"text":"Role Management"}]},{"id":"ci-pipeline-enhancements","depth":2,"text":"CI Pipeline Enhancements"},{"id":"tangible-value","depth":2,"text":"Tangible Value"}]}},"_type":"markdown","_id":"content:case-studies:automatisch.md","_source":"content","_file":"case-studies/automatisch.md","_extension":"md"},{"_path":"/medusa_gpt_edit","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Medusa","description":"","subtitle":"Levelling up their Next.JS Ecommerce Template into a Developer Powerhouse","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Medusa","path":"/case-studies/medusa/"}],"link":"/case-studies/medusa/","created":{"string":"May 6, 2024","month":"May","day":6,"year":2024},"shortDescription":"Recently we worked with the healess ecommerce platform Medusa. We upgraded their Next.JS ecommerce template to have a full E2E testing suite with a robust Github CI workflow.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"enhancing-medusas-nextjs-ecommerce-template-a-case-study"},"children":[{"type":"text","value":"Enhancing Medusa's Next.JS Ecommerce Template: A Case Study"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with the headless ecommerce platform, "},{"type":"element","tag":"a","props":{"href":"https://medusajs.com","rel":["nofollow"]},"children":[{"type":"text","value":"Medusa"}]},{"type":"text","value":", implementing a comprehensive End-to-End (E2E) testing suite, integrated with a new Github CI workflow, for their "},{"type":"element","tag":"a","props":{"href":"https://next.medusajs.com/us","rel":["nofollow"]},"children":[{"type":"text","value":"Next.JS template"}]},{"type":"text","value":". This suite, spanning over "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/graphs/contributors","rel":["nofollow"]},"children":[{"type":"text","value":"7,000 lines of code"}]},{"type":"text","value":" and covering over a dozen webpages, has significantly improved the reliability of core workflows for any ecommerce site using their template. In the process, we identified and rectified several bugs, enhancing the overall user experience."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Ecommerce is a complex domain where even minor "},{"type":"element","tag":"a","props":{"href":"https://stripe.com/resources/more/how-to-increase-checkout-conversion#1-simplify-the-process","rel":["nofollow"]},"children":[{"type":"text","value":"UX improvements"}]},{"type":"text","value":" can significantly boost revenue. For instance, a renowned UX researcher once identified friction points in the checkout process of a $25 billion American retailer in 2009, leading to a 45% increase in sales, amounting to an additional $300 million. Identifying such friction points in the baseline template is crucial for Medusa's customers who base their businesses off this template."}]},{"type":"element","tag":"h2","props":{"id":"medusa-revolutionizing-ecommerce-with-modularity"},"children":[{"type":"text","value":"Medusa: Revolutionizing Ecommerce with Modularity"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://medusajs.com","rel":["nofollow"]},"children":[{"type":"text","value":"Medusa"}]},{"type":"text","value":", a rising star in the ecommerce space, offers an open-source ecommerce platform featuring a robust modular backend and admin system. Their clientele includes industry giants like "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Mitsubishi"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Heineken"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Makro"}]},{"type":"text","value":". They also provide an open-source Next.js template for budding Ecommerce stores."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our collaboration with Medusa involved enhancing their "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/","rel":["nofollow"]},"children":[{"type":"text","value":"Next.js ecommerce template"}]},{"type":"text","value":" by integrating a comprehensive E2E testing suite with a CI build script in Github Actions. We also identified and reported numerous bugs, thereby improving the overall functionality. Additionally, we provided detailed documentation for setting up the testing suite, facilitating a smoother onboarding process for future developers."}]},{"type":"element","tag":"h2","props":{"id":"developing-a-comprehensive-e2e-testing-suite"},"children":[{"type":"text","value":"Developing a Comprehensive E2E Testing Suite"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When we began, Medusa's ecommerce template had minimal testing—a simple 100-line test script built in Cypress covering only a handful of features. We decided to transition to Playwright due to its advantages and used it to build a comprehensive testing suite."}]},{"type":"element","tag":"h3","props":{"id":"our-strategy"},"children":[{"type":"text","value":"Our Strategy"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our greenfield project allowed us to quickly establish a comprehensive testing suite. Leveraging our expertise in Playwright and a clear architectural vision for the testing suite, we first developed the testing boilerplate for the entire project. This included creating Page Object Models (POMs) for each page and modal, integrating them with the test runner, and preparing the main codebase with unique test ids for Playwright's test runner. This approach not only made our test suites resilient to changes in the codebase and design but also familiarized us with the project's architecture and components."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After setting up the base project and testing roadmap, we began testing each workflow critical to any ecommerce site. This ranged from basic workflows like registration and authentication to more complex customer journeys like product search, cart management, checkout, and order management. This comprehensive test suite has bolstered the confidence of Medusa developers in accepting future pull requests, as it helps prevent bugs and maintain the stability of key workflows."}]},{"type":"element","tag":"h2","props":{"id":"identifying-and-rectifying-bugs"},"children":[{"type":"text","value":"Identifying and Rectifying Bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"During our journey of building the comprehensive E2E test suite, we encountered several broken functionalities and edge cases. By reporting and rectifying these bugs, we have reduced the technical issues for ecommerce sites basing their business off this project, thereby helping Medusa maintain its reputation as a technical leader for modern ecommerce stores."}]},{"type":"element","tag":"h3","props":{"id":"critical-bugs-identified"},"children":[{"type":"text","value":"Critical Bugs Identified"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Giftcard Application Issue"}]},{"type":"text","value":": We found a critical bug in "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/312","rel":["nofollow"]},"children":[{"type":"text","value":"the checkout flow"}]},{"type":"text","value":" where a user could not complete the checkout if they applied a giftcard with no remaining balance. This issue was promptly fixed."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Address Syncing Inconsistencies"}]},{"type":"text","value":": We identified a "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/275","rel":["nofollow"]},"children":[{"type":"text","value":"UX issue"}]},{"type":"text","value":" with managing addresses within a registered user's account. If a customer wanted to use their default billing address during checkout, they had to refill the form, as it wasn't automatically populated or available in a dropdown menu."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Logout Issue"}]},{"type":"text","value":": We discovered an "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/295","rel":["nofollow"]},"children":[{"type":"text","value":"issue"}]},{"type":"text","value":" where logging out in certain cases returned a 404 page, causing confusion for users. This issue was resolved by using local state within the browser instead of storing state in a response header."}]}]},{"type":"element","tag":"h2","props":{"id":"streamlining-medusas-workflow-for-the-nextjs-template"},"children":[{"type":"text","value":"Streamlining Medusa's Workflow for the Next.js Template"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The final major contribution was the creation of a CI workflow with GitHub actions. Now, whenever a contributor submits a PR, the entire suite of tests is run, saving hours of manual labor and significantly increasing productivity."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Add Video from "},{"type":"element","tag":"a","props":{"href":"https://twitter.com/VariableVic/status/1783425329043849602","rel":["nofollow"]},"children":[{"type":"text","value":"https://twitter.com/VariableVic/status/1783425329043849602"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This automated testing layer, combined with our comprehensive test suite, provides thousands of lines of code worth of checks that would otherwise have to be done manually for every PR. This not only saves precious developer time but also ensures the stability and reliability of the platform."}]},{"type":"element","tag":"h2","props":{"id":"amplifying-medusas-business-impact-through-our-collaboration"},"children":[{"type":"text","value":"Amplifying Medusa’s Business Impact Through Our Collaboration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our partnership with Medusa has significantly enhanced the development workflow for their ecommerce template by adhering to best practices in testing. They now have robust assurances for future code modifications, redesigns, and other project changes. Moreover, as this is a template, ecommerce stores utilizing it can have stronger confidence that their modifications will function as expected. This leads to improved customer experiences for all the ecommerce brands involved, thereby amplifying Medusa’s business impact."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"enhancing-medusas-nextjs-ecommerce-template-a-case-study","depth":2,"text":"Enhancing Medusa's Next.JS Ecommerce Template: A Case Study"},{"id":"medusa-revolutionizing-ecommerce-with-modularity","depth":2,"text":"Medusa: Revolutionizing Ecommerce with Modularity"},{"id":"developing-a-comprehensive-e2e-testing-suite","depth":2,"text":"Developing a Comprehensive E2E Testing Suite","children":[{"id":"our-strategy","depth":3,"text":"Our Strategy"}]},{"id":"identifying-and-rectifying-bugs","depth":2,"text":"Identifying and Rectifying Bugs","children":[{"id":"critical-bugs-identified","depth":3,"text":"Critical Bugs Identified"}]},{"id":"streamlining-medusas-workflow-for-the-nextjs-template","depth":2,"text":"Streamlining Medusa's Workflow for the Next.js Template"},{"id":"amplifying-medusas-business-impact-through-our-collaboration","depth":2,"text":"Amplifying Medusa’s Business Impact Through Our Collaboration"}]}},"_type":"markdown","_id":"content:medusa_gpt_edit.md","_source":"content","_file":"medusa_gpt_edit.md","_extension":"md"},{"_path":"/medusa","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Medusa","description":"","subtitle":"Levelling up their Next.JS Ecommerce Template into a Developer Powerhouse","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Medusa","path":"/case-studies/medusa/"}],"link":"/case-studies/medusa/","created":{"string":"May 6, 2024","month":"May","day":6,"year":2024},"shortDescription":"Recently we worked with the healess ecommerce platform Medusa. We upgraded their Next.JS ecommerce template to have a full E2E testing suite with a robust Github CI workflow.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"helping-medusa-upgrade-their-nextjs-ecommerce-template"},"children":[{"type":"text","value":"Helping Medusa Upgrade their Next.JS Ecommerce Template"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Recently, we worked with the headless ecommerce platform [Medusa]"},{"type":"element","tag":"span","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://medusajs.com","rel":["nofollow"]},"children":[{"type":"text","value":"https://medusajs.com"}]}]},{"type":"text","value":" by implementing a full E2E testing suite integrated with a new Github CI workflow in their "},{"type":"element","tag":"a","props":{"href":"https://next.medusajs.com/us","rel":["nofollow"]},"children":[{"type":"text","value":"Next.JS template"}]},{"type":"text","value":". Today, they can accept pull requests with much more confidence because of the full suite of tests we wrote. At over "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/graphs/contributors","rel":["nofollow"]},"children":[{"type":"text","value":"7k lines of code"}]},{"type":"text","value":" spanning over a dozen webpages, we found multiple core workflows expected to work for any ecommerce site using their template. Not only that, while writing our comprehensive test suite we found several bugs, many of which were fixed immediately."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, ecommerce is a notoriously thorny space where "},{"type":"element","tag":"a","props":{"href":"https://stripe.com/resources/more/how-to-increase-checkout-conversion#1-simplify-the-process","rel":["nofollow"]},"children":[{"type":"text","value":"UX improvements"}]},{"type":"text","value":" to the checkout process can lead to significant changes in revenue. For example, in 2009 a $25 billion American retailer "},{"type":"element","tag":"a","props":{"href":"https://articles.centercentre.com/three_hund_million_button/","rel":["nofollow"]},"children":[{"type":"text","value":"hired a famous UX researcher"}]},{"type":"text","value":" to study their checkout process. He found some points of friction in the checkout process which led to an addition $300 million in sales, a 45% jump. Finding these points of friction are essential for any ecommerce company and identifying these in the baseline template is essential for Medusa's customers basing their business off the template."}]},{"type":"element","tag":"h2","props":{"id":"medusa-the-modular-ecommerce-platform"},"children":[{"type":"text","value":"Medusa: The Modular Ecommerce Platform"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the up and coming startups in the ecommerce space is "},{"type":"element","tag":"a","props":{"href":"https://medusajs.com","rel":["nofollow"]},"children":[{"type":"text","value":"Medusa"}]},{"type":"text","value":". They offer an open source ecommerce platform which provides an extensive modular backend and admin system for running an ecommerce platform. Some of their customers include "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Mitsubishi"}]},{"type":"text","value":", "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Heineken"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":""},"children":[{"type":"text","value":"Makro"}]},{"type":"text","value":". In addition to these base components, they also offer an open source Next.js template for new Ecommerce stores to base their website off of."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working with Medusa, we upgraded their "},{"type":"element","tag":"a","props":{"href":"https://medusajs.com/nextjs-commerce/","rel":["nofollow"]},"children":[{"type":"text","value":"Next.js ecommerce template"}]},{"type":"text","value":" by adding a full End-to-End (E2E) testing suite, integrated it with our CI build script in Github Actions, and found and reported numerous bugs along the way. In addition we provided comprehensive documentation for setting up the testing suite, thereby helping future developers get up to speed quicker."}]},{"type":"element","tag":"h2","props":{"id":"building-a-complete-e2e-testing-suite"},"children":[{"type":"text","value":"Building a Complete E2E Testing Suite"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At the beginning of our work Medusa's ecommerce template had minimal to no testing. There was a simple 100 line test script built in Cypress which covered only a minimal number of features. Moreover the tests were simple unit tests instead of a comprehensive E2E test flow. We decided on moving over to Playwright because of its benefits and built the comprehensive testing suite using it."}]},{"type":"element","tag":"h3","props":{"id":"our-approach"},"children":[{"type":"text","value":"Our Approach"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Because of having an essentially greenfield project building a test suite, we were able to hit the ground moving rapidly. Since we already have expertise in Playwright and have a clear idea of how to architect the testing suite, we began by writing up the testing boilerplate for the entire project before writing test code."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This includes writing up Page Object Models (POMs) for each of the pages and modals, integrating them with the test runner, and preparing the main codebase with unique test ids for Playwright's test runner. Following these best practices benefits future contributors because the test suites are much more resilient to changes in the codebase and design. Now moving a button around to a different div or container won't break a test."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Beyond following best practices, our top-down strategy had the benefit of acquainting ourselves with the architecture of the project, each of the compenents we would interact with, and mapping out what test cases should be implemented for the comprehensive test suite."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After getting the base project set up along with the testing roadmap, we were able to start testing each workflow essential for any ecommerce site. Of course this meant testing the basic workflows like registration and authentication, but this also included more complex scenarios customers would typically have in their journey. This includes searching for the correct product, adding items the cart, checking out, managing orders, and everything in between. Because of this test suite, Medusa developers can be much more confident about future pull requests keeping these key workflows stable by preventing bugs."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Having this test suite significantly increases productivity because of the time sink caused by regressions and tracking bugs after each change to the project. This manual labor was significantly reduced saving developer time for releasing more features."}]},{"type":"element","tag":"h2","props":{"id":"finding-and-reporting-bugs"},"children":[{"type":"text","value":"Finding and Reporting Bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"During our quest building the comprehensive E2E test suite, we ran into many edge cases broken functionality in the project. By reporting these bugs and getting them fixed, ecommerce sites basing their busines off this project now have less technical problems to worry about. This helps Medusa retain their excellent reputation as a technical leader for modern ecommerce stores. Let's look at some of the highlights:"}]},{"type":"element","tag":"h3","props":{"id":"applying-a-giftcard-to-a-users-cart-can-break-the-checkout-page"},"children":[{"type":"text","value":"Applying a Giftcard to a User's Cart can Break the Checkout Page"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The most critical bug we found was in "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/312","rel":["nofollow"]},"children":[{"type":"text","value":"the checkout flow"}]},{"type":"text","value":". If a user entered in a giftcard and there wasn't a remaining balance, then they would not be able to finish checking out. This would be a massive problem for your neice or nephew that just got a giftcard for their birthday to their favorite online toy store. Fortunately, this was fixed almost immediately because of how critical of an issue this was."}]},{"type":"element","tag":"h3","props":{"id":"address-syncing-inconsistencies"},"children":[{"type":"text","value":"Address Syncing Inconsistencies"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/275","rel":["nofollow"]},"children":[{"type":"text","value":"frustrating part of the UX we found"}]},{"type":"text","value":" was managing addresses within a registrered users account. If a customer signs up for an account and finishes their profile, one part of that profile is entering in a default billing address. Now, during the checkout process if that customer wanted to use their default billing address they wouldn't see it. Instead of having that form filled out by default, or having a dropdown for available billing addresses, the customer would have to refill this form again."}]},{"type":"element","tag":"h3","props":{"id":"logging-out-in-certain-cases-returns-a-404"},"children":[{"type":"text","value":"Logging Out in Certain Cases Returns a 404"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another awkward bug we found was an "},{"type":"element","tag":"a","props":{"href":"https://github.com/medusajs/nextjs-starter-medusa/issues/295","rel":["nofollow"]},"children":[{"type":"text","value":"issue returning 404 pages after logging out"}]},{"type":"text","value":". Now, having this behavior during the auth flow leaves the user confused because they aren't assured their account is safely inaccessible from the current computer they logged out of. It turned out there was state being stored in a response header, but was fixed by using local state within the browser instead."}]},{"type":"element","tag":"h2","props":{"id":"medusas-ci-workflow-for-the-nextjs-template"},"children":[{"type":"text","value":"Medusa's CI Workflow for the Next.js Template"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The last major addition we did was creating a CI workflow with GitHub actions. Now whenever a contributor submits a PR the whole suite of tests are ran."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Add Video from "},{"type":"element","tag":"a","props":{"href":"https://twitter.com/VariableVic/status/1783425329043849602","rel":["nofollow"]},"children":[{"type":"text","value":"https://twitter.com/VariableVic/status/1783425329043849602"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If there's ever a failed test a report will be generated for the developer to look at. This layer of automated testing with our comprehensive test suite is essential because it provides thousands of lines of code worth of tedious checks. Doing this manually for every PR would waste hours of developer time, a precious resource."}]},{"type":"element","tag":"h2","props":{"id":"how-our-work-benefits-medusas-business"},"children":[{"type":"text","value":"How our Work Benefits Medusa's Business"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Because of our collaboration with Medusa, we've supercharged their development workflow for their ecommerce template following best practices in testing. Now they have robust assurances for future code changes, redesigns, and any other changes to the project. In addition, because this is a template, ecommerce stores using this have stronger assurances their changes will function as well. This leads to a better customer experiences for all these ecommerce brands involved."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"helping-medusa-upgrade-their-nextjs-ecommerce-template","depth":2,"text":"Helping Medusa Upgrade their Next.JS Ecommerce Template"},{"id":"medusa-the-modular-ecommerce-platform","depth":2,"text":"Medusa: The Modular Ecommerce Platform"},{"id":"building-a-complete-e2e-testing-suite","depth":2,"text":"Building a Complete E2E Testing Suite","children":[{"id":"our-approach","depth":3,"text":"Our Approach"}]},{"id":"finding-and-reporting-bugs","depth":2,"text":"Finding and Reporting Bugs","children":[{"id":"applying-a-giftcard-to-a-users-cart-can-break-the-checkout-page","depth":3,"text":"Applying a Giftcard to a User's Cart can Break the Checkout Page"},{"id":"address-syncing-inconsistencies","depth":3,"text":"Address Syncing Inconsistencies"},{"id":"logging-out-in-certain-cases-returns-a-404","depth":3,"text":"Logging Out in Certain Cases Returns a 404"}]},{"id":"medusas-ci-workflow-for-the-nextjs-template","depth":2,"text":"Medusa's CI Workflow for the Next.js Template"},{"id":"how-our-work-benefits-medusas-business","depth":2,"text":"How our Work Benefits Medusa's Business"}]}},"_type":"markdown","_id":"content:medusa.md","_source":"content","_file":"medusa.md","_extension":"md"},{"_path":"/playwright/architecture","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"Architecture of Playwright","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"Architecture","path":"/playwright/architecture/"}],"link":"/playwright/architecture","created":{"string":"March 11, 2024","number":1710136800000,"month":"Mar","day":11,"year":2024},"shortDescription":"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of Playwright's architecture","src":"/img/playwright/architecture_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"intro"},"children":[{"type":"text","value":"Intro"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you load up the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright","rel":["nofollow"]},"children":[{"type":"text","value":"repository"}]},{"type":"text","value":" for the Playwright library, you may be overwhelmed by the numerous packages living both inside the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages"}]},{"type":"text","value":" folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test, chromium } from \"@playwright/test\";\n","filename":"example-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test, chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project."}]},{"type":"element","tag":"h2","props":{"id":"root-directory"},"children":[{"type":"text","value":"Root directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the root directory we find the following folders"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","filename":"playwright/","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"browser_patches/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"docs/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"examples/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"packages/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"tests/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"utils/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"along with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" which includes the following keys"}]},{"type":"element","tag":"pre","props":{"className":"language-json shiki shiki-themes github-dark","code":"{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","filename":"package.json","language":"json","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"name\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"playwright-internal\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"private\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" \"workspaces\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"packages/*\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" gives us the hint the core functionality is within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" directory since the root "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.json"}]},{"type":"text","value":" file is labelled private, has \"internal\" in its name, and uses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"\"workspaces\""}]},{"type":"text","value":" key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/"}]},{"type":"text","value":" folder"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser_patches"}]},{"type":"text","value":" - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"docs"}]},{"type":"text","value":" - The docs folder contains markdown files which compile to the documentation found on "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/intro","rel":["nofollow"]},"children":[{"type":"text","value":"the Playwright docs"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"examples"}]},{"type":"text","value":" - Here are examples of test scripts to refer to, while getting started with using the Playwright project."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tests"}]},{"type":"text","value":" - Even testing libraries should have automated tests, which are written in Playwright."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more."}]}]},{"type":"element","tag":"h2","props":{"id":"packages-directory"},"children":[{"type":"text","value":"Packages directory"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions."}]},{"type":"element","tag":"h3","props":{"id":"test-reportinggeneration-packages"},"children":[{"type":"text","value":"Test reporting/generation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is"}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"html-reporter/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"recorder/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace-viewer/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"trace/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"web/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which contains the code associated with either handling test reports or "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/codegen-intro","rel":["nofollow"]},"children":[{"type":"text","value":"generating"}]},{"type":"text","value":" them with the recorder package. In addition, there is the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/trace-viewer","rel":["nofollow"]},"children":[{"type":"text","value":"trace and trace viewer"}]},{"type":"text","value":" which can be recorded during playwright test runs. In addition, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"web/"}]},{"type":"text","value":" package provides utilities shared across the various web-based tools listed here."}]},{"type":"element","tag":"h3","props":{"id":"browser-specialized-packages"},"children":[{"type":"text","value":"Browser specialized packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each of the packages here are simply exports of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package along with an install script for the associated browser only. You can find them on npmjs, for example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/playwright-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-chromium"}]},{"type":"text","value":" is its own package which has playwright specialized for only automating chromium."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"browser-installation-packages"},"children":[{"type":"text","value":"Browser installation packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The packages listed here only include install scripts for each of the browsers. For example, "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/@playwright/browser-chromium","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-browser-chromium"}]},{"type":"text","value":" corresponds to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/browser-chromium"}]},{"type":"text","value":" package on npmjs."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-chromium/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-firefox/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-browser-webkit/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"component-testing-packages"},"children":[{"type":"text","value":"Component testing packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These packages are all associated to the "},{"type":"element","tag":"a","props":{"href":"https://playwright.dev/docs/test-components","rel":["nofollow"]},"children":[{"type":"text","value":"experimental component testing framework"}]},{"type":"text","value":" in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-react17/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-solid/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-svelte/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-ct-vue2/\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"core-functionality-packages"},"children":[{"type":"text","value":"Core functionality packages"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project."}]},{"type":"element","tag":"pre","props":{"className":"language-console shiki shiki-themes github-dark","code":"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n","filename":"playwright/packages","language":"console","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-core/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright-test/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"playwright/\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"protocol/\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-test"}]},{"type":"text","value":" folder is simply a wrapper for binding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" together in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" package installable through npm. If you look in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file, all you'll see is an export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright/test"}]},{"type":"text","value":", which lives in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another package to look at briefly is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol"}]},{"type":"text","value":" package which has automatically generated code through some of the build scripts in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utils"}]},{"type":"text","value":" directory of the root directory of the playwright project. This simply contains a YAML file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"protocol.yml"}]},{"type":"text","value":", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, the two main packages of the entire playwright library are the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrite-core"}]},{"type":"text","value":" packages. The first of which is a wrapper around "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright.config.ts"}]},{"type":"text","value":" file, or any of the associated test running code, such as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { test } from \"@playwright/test\";\n","filename":"my-test.spec.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { test } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"then you are likely importing code from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" package."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The other main package is "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" which contains all of the browser automation functionality. This functionality is split up into two main components, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/server"}]},{"type":"text","value":", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the "},{"type":"element","tag":"a","props":{"href":"https://chromedevtools.github.io/devtools-protocol/","rel":["nofollow"]},"children":[{"type":"text","value":"Chrome Devtools Protocol"}]},{"type":"text","value":" (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '"},{"type":"element","tag":"a","props":{"href":"https://news.ycombinator.com","rel":["nofollow"]},"children":[{"type":"text","value":"https://news.ycombinator.com"}]},{"type":"text","value":"'\". The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"On the other hand, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"@playwright/test\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really you are importing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" from an instance of the class in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/client/playwright"}]},{"type":"text","value":". Then, calling "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browser.newPage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" is making requests to interfaces in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" library in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" package since it provides a comprehensive and battle tested API for this kind of functionality."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This splitting of responsibility design pattern works well because it allows for "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"supporting"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-java/","rel":["nofollow"]},"children":[{"type":"text","value":"multiple"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-dotnet","rel":["nofollow"]},"children":[{"type":"text","value":"languages"}]},{"type":"text","value":" which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":") as you would in the the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" library found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"looking-beyond"},"children":[{"type":"text","value":"Looking beyond"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"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);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"intro","depth":2,"text":"Intro"},{"id":"root-directory","depth":2,"text":"Root directory"},{"id":"packages-directory","depth":2,"text":"Packages directory","children":[{"id":"test-reportinggeneration-packages","depth":3,"text":"Test reporting/generation packages"},{"id":"browser-specialized-packages","depth":3,"text":"Browser specialized packages"},{"id":"browser-installation-packages","depth":3,"text":"Browser installation packages"},{"id":"component-testing-packages","depth":3,"text":"Component testing packages"},{"id":"core-functionality-packages","depth":3,"text":"Core functionality packages"}]},{"id":"looking-beyond","depth":2,"text":"Looking beyond"}]}},"_type":"markdown","_id":"content:playwright:architecture.md","_source":"content","_file":"playwright/architecture.md","_extension":"md"},{"_path":"/playwright/how-playwright-initializes","_dir":"playwright","_draft":false,"_partial":false,"_locale":"","title":"How importing from Playwright works","description":"In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.","breadcrumbs":[{"name":"Playwright","path":"/playwright/"},{"name":"How Playwright Initializes","path":"/playwright/how-playwright-initializes/"}],"image":"img","shortDescription":"Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.","created":{"string":"March 13, 2024","number":1710309600000,"month":"Mar","day":13,"year":2024},"link":"/playwright/how-playwright-initializes","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Diagram of playwright-core initialization process","src":"/img/playwright/playwright-core_initialization_diagram.jpg"},"children":[]}]},{"type":"element","tag":"h2","props":{"id":"peering-into-playwrights-import-process"},"children":[{"type":"text","value":"Peering into Playwright's import process"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" '@playwright/test'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://qacomet.com\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture."}]},{"type":"element","tag":"h3","props":{"id":"merging-playwright-and-playwright-core"},"children":[{"type":"text","value":"Merging "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Internally, when you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":", there is an underlying call to import from two merged packages, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":". This merge happens in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":", since "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is just an outward facinging export of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"require('playwright/test')"}]},{"type":"text","value":", an alias for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright/test"}]},{"type":"text","value":". This is where the test execution API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" are combined with the browser automation API's from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We will focus on the import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", since it provides the core browser automation and is the code every other client library wraps. Looking at its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" file"}]},{"type":"element","tag":"pre","props":{"className":"language-js shiki shiki-themes github-dark","code":"module.exports = require(\"./lib/inprocess\");\n","filename":"packages/playwright-core/index.js","language":"js","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"module"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"exports"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"./lib/inprocess\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"gives an export from its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib/inprocess.ts"}]},{"type":"text","value":" file (note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" directory is compiled to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"lib"}]},{"type":"text","value":" directory after playwright runs its build script, and is what's found in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"node_modules/playwright-core"}]},{"type":"text","value":", hence the require imports from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./lib/"}]},{"type":"text","value":" and not "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"./src/"}]},{"type":"text","value":"). The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inprocess.ts"}]},{"type":"text","value":" file just imports from the adjacent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" and executes the function from there, called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include the source below in its own section but note "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" dynamically intiailizes the interface between the client library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":", and the server library, defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the "},{"type":"element","tag":"a","props":{"href":"https://github.com/microsoft/playwright-python","rel":["nofollow"]},"children":[{"type":"text","value":"playwright-python"}]},{"type":"text","value":" source code, you will find the same design patterns and classes defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":"'s "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"h3","props":{"id":"rapid-overview-of-the-client-and-server-libraries"},"children":[{"type":"text","value":"Rapid overview of the client and server libraries"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" the main functionality can be found in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" folders. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client"}]},{"type":"text","value":" folder contains classes, many of which are subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class. This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class is a client-side representation of a corresponding server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" class in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server/dispatchers"}]},{"type":"text","value":" folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":", containing the client side APIs (such as "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":"), there is a corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":". When we call "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"page.goto"}]},{"type":"text","value":" a message is send over the unique client "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" instance to the unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" instance, which calls the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works."}]},{"type":"element","tag":"h2","props":{"id":"playwrights-core-api-factory-createinprocessplaywright"},"children":[{"type":"text","value":"Playwright's core API factory, createInProcessPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":", contains only one function called "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":". We include it here as a reference:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createInProcessPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dispatch synchronously at first.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"webkit\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI._android._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" AndroidServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Switch to async dispatch after we got Playwright object.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" setImmediate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(() "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"toImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"x"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" x\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(x._guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection._dispatchers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")._toImpl "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection.toImpl;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you scan through the script and look at the return value, you'll see Playwright is returning the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" instance "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":", which is defined somewhere within the client library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core/src/client/"}]},{"type":"text","value":" (which we find from our type hints). So when we write a script using "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { chromium } from \"playwright-core\";\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"really we are making an import of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwrightAPI"}]},{"type":"text","value":" object and accessing its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" property, so our script is secretly"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n","filename":"my-automation-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwrightAPI;\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Tracing where this object is instantiated, we find the call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is not very descriptive. If you try looking in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class definition, you won't get very far either, you'll just see"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"export class Connection extends EventEmitter {\n readonly _objects = new Map();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _objects"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Map"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":")"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(guid)"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"which is even more opaque. From this all we know is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class keeps an "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" map which at some point contains an instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":" will give us a clear picture of how this library is wrapped together."}]},{"type":"element","tag":"h2","props":{"id":"cross-communication-between-client-and-server"},"children":[{"type":"text","value":"Cross communication between client and server"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you look through the script's imports, anything with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" in its name, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":", come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server"}]},{"type":"text","value":" directroy. The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function creates an instance of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Similarly, the imports for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightAPI"}]},{"type":"text","value":" come from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" directory. Looking through the first lines of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory"}]},{"type":"text","value":", there is an instantiation of the server "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class and instantiation of objects for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ClientConnection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" createPlaywright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" sdkLanguage:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (process.env."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"PW_LANG_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Language"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"||"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"javascript\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" clientConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"useRawBuffers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" dispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"true"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" /* local */"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The next lines of code are the bridge between the internal client and server libraries"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"onmessage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"message"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=>\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" dispatcherConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"dispatch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(message);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"given by setting the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" properties for each of these objects. Notice each "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" calls the other's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" method; i.e., "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" through "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" and vice versa. This gives us the hint somehow "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" will be called somewhere in the codebase."}]},{"type":"element","tag":"h3","props":{"id":"server-side-createplaywright"},"children":[{"type":"text","value":"Server-side createPlaywright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Before we continue down the logic within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", let's go over what the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createPlaywright"}]},{"type":"text","value":" function actually does. It is a simple function call which instantiates the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" class defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/playwright.ts"}]},{"type":"text","value":". Below is a simplified version of it"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n","filename":"packages/playwright-core/server/playwright.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Chromium } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./chromium/chromium\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Firefox } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./firefox/firefox\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Selectors } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./selectors\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { WebKit } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./webkit/webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { createInstrumentation, SdkObject } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"./instrumentation\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" SdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" readonly"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" debugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"options"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightOptions"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { attribution: {}, instrumentation: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"createInstrumentation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"() } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".options "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" options;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".chromium "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".firefox "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".webkit "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" WebKit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".selectors "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Selectors"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":".debugController "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DebugController"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/server/chromium/"}]},{"type":"text","value":" you will see all the functionality for automating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":" browser."}]},{"type":"element","tag":"h3","props":{"id":"rootdispatcher-and-server-side-playwright"},"children":[{"type":"text","value":"RootDispatcher and server-side Playwright"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuing down "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":", we see there's the construction of a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"RootDispatcher"}]},{"type":"text","value":" instance, and a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":" instance."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" rootScope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(dispatcherConnection);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// Initialize Playwright channel.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(rootScope, playwright);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object is referenced throughout the dispatcher classes, and acts as a wrapper around the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" object instantiated above, so that each of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" object. This wrapping functionality will become clearer when we dive into "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor, where it passes the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" to all of the child "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" classes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here's a simplified version of what's happening in the constructor for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Rootscope"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","filename":"playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(connection, { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Root\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {});\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" EventEmitter"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _connection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" _parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ParentScopeType"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" string"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" channels"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"InitializerTraits"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"Type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"=\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent._connection;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"instanceof"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" DispatcherConnection"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" undefined"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" parent;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._guid "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object.guid;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._type "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._object "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" object;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"registerDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._connection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" type,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" guid,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._parent._object\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor we see the connection always comes from either the inherited parent "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", or from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" passed into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"parent"}]},{"type":"text","value":" parameter. This, coupled with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" having the name "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"root"}]},{"type":"text","value":", gives us the hint that every dispatcher in the server library will have access to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" instance (from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":"). Furthermore, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" will register every instance of a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":", hinting that it will communicate with each of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" objects. These points will become more clear after looking at the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor."}]},{"type":"element","tag":"h4","props":{"id":"playwrightdispatcher-and-its-constructor"},"children":[{"type":"text","value":"PlaywrightDispatcher and its constructor"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's look closer at a slightly simplified version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PlaywrightDispatcher"}]},{"type":"text","value":"'s constructor"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","filename":"packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" { Playwright } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core/src/server/playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" PlaywrightDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" extends"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Dispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" constructor"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"scope"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" RootDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#FFAB70"},"children":[{"type":"text","value":"playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":") {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" super"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.chromium),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.firefox),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserTypeDispatcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(scope, playwright.webkit),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notice the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"super"}]},{"type":"text","value":" call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":" from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" passed into it as the first parameter. Every call to the server will run through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"rootScope"}]},{"type":"text","value":", which then can be traced through calls in each of the dispatcher classes. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserTypeDispatcher"}]},{"type":"text","value":" will launch a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserDispatcher"}]},{"type":"text","value":", which is responsible for creating a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserContextDispatcher"}]},{"type":"text","value":", which can create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"PageDispatcher"}]},{"type":"text","value":", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" defined in the factory method with confidence!"}]},{"type":"element","tag":"h3","props":{"id":"tying-back-to-the-onmessage-communication"},"children":[{"type":"text","value":"Tying back to the onmessage communication"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnect.onmessage"}]},{"type":"text","value":" functions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From within "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection.onmessage"}]},{"type":"text","value":" function is called from two main methods. These are "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":". The first, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":", is called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":", so the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcher.onmessage"}]},{"type":"text","value":" call in that case acts as a response callback. The second, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", is called from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendEvent"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendAdopt"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendDestroy"}]},{"type":"text","value":" methods defined within the dispatcher. Calls to these functions are spread throughout the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses which call these functions from their internal "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_connection"}]},{"type":"text","value":" variable. These will tell the client to construct, update, and destroy, their corresponding client side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" objects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Separately on the client-side, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.onmessage"}]},{"type":"text","value":" is called from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendMessageToServer"}]},{"type":"text","value":" whenever you use a client-side API. This sends a message over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":", which finds the corresponding "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":", as mentioned before."}]},{"type":"element","tag":"h3","props":{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners"},"children":[{"type":"text","value":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function is special because it is only called from within the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" implementation, internally it calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"text","value":" with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" parameter:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","filename":"packages/playwright-core/src/server/dispatchers/dispatcher.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"sendCreate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" SdkObject) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(initializer, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplToWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"), binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._isLocal "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'toBase64'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_sendMessageToClient"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent._guid, type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", { type, initializer, guid }, sdkObject);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so if we search through the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class on the client side, sure enough in its "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatch"}]},{"type":"text","value":" function it has a call to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" for the associated method "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":". This "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"text","value":" is what initializes the client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, and is the reason why we call"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" playwrightAPI"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" clientConnection."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"getObjectWithKnownName"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatcherConnection"}]},{"type":"text","value":" over to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":". For the Playwright create message, the message looks something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"{\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" method"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'__create__'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" params"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" type"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" initializer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" chromium"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@024d5a494527ece580841844a9a933a6'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" firefox"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@fae8f48651c02682ad3b276f0a046d63'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" webkit"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" android"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'android@832582c466c24c6933d3a5587059e1be'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" electron"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": { "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'electron@3829a7608477101154e15c1e25bca9ca'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":": "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Playwright'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note before this "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" message is passed to create the Playwright API on the client side, there were "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" messages for each of the device types, meaning there already exists a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserType"}]},{"type":"text","value":" for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"chromium"}]},{"type":"text","value":", "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"firefox"}]},{"type":"text","value":", etc. before the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"__create__"}]},{"type":"text","value":" message for "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" is sent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" class, which is a concept for a later section. For now, let's trace what happens in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection"}]},{"type":"text","value":" for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"type: 'Playwright'"}]},{"type":"text","value":" message."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sendCreate"}]},{"type":"text","value":" function calls "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"dispatchConnection.onmessage"}]},{"type":"text","value":", which calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection.dispatch"}]},{"type":"text","value":" function, which then calls the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function with the following parameters"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// parentGuid - corresponds to Root, the root ChannelOwner\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"Playwright\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// guid\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // initializer\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" chromium: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@024d5a494527ece580841844a9a933a6\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" firefox: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@fae8f48651c02682ad3b276f0a046d63\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" webkit: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" android: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"android@832582c466c24c6933d3a5587059e1be\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" electron: { guid: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"electron@3829a7608477101154e15c1e25bca9ca\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"clientConnection._createRemoteObject"}]},{"type":"text","value":" function there is a transformation of the data and then a large "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"switch-case"}]},{"type":"text","value":" function instantiating the corresponding client class."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n","filename":"packages/playwright-core/src/client/connection.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"_createRemoteObject"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid: string, type: string, guid: string, initializer: any) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" parent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._objects."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parentGuid); "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"// here the parentGuid is ''\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"!"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parent)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" throw"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"`Cannot find parent object ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"parentGuid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"} to create ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"guid"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" let"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" ChannelOwner"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"<"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"any"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":">;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" findValidator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(type, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"'Initializer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" validator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" initializer,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" ''"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" tChannelImpl: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._tChannelImplFromWire."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" binary: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"._rawBuffers "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'buffer'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'fromBase64'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" );\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" switch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" (type) {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" case"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" 'Playwright'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":":\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" Playwright"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(parent, type, guid, initializer);\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" break"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" result;\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"tChannelImpl: _tChannelImplFromWire"}]},{"type":"text","value":" in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" class. If you look at the type definition in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_objects"}]},{"type":"text","value":" variable is a map returning one of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses. So in the result above for the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"case: 'Playwright'"}]},{"type":"text","value":", it returns a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Playwright"}]},{"type":"text","value":" instance, which is a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":", defined in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"client/playwright.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"launching-the-browser-instance"},"children":[{"type":"text","value":"Launching the browser instance"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The final bit of code in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"createInProcessPlaywright"}]},{"type":"text","value":" to consider is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"_serverLauncher"}]},{"type":"text","value":" variables being set in each of the drivers. This is written as"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n","filename":"packages/playwright-core/src/inProcessFactory.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.chromium._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"chromium\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.firefox._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"firefox\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwrightAPI.webkit._serverLauncher "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":" BrowserServerLauncherImpl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"webkit\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" class is defined next to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"inProcessFactory.ts"}]},{"type":"text","value":" file in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"browserServerLauncherImpl.ts"}]},{"type":"text","value":". The main functionality in this class lies in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"launchServer"}]},{"type":"text","value":" function, and is only called when you use the"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launchServer"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"(serverOptions);\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"'playwright-core'"}]},{"type":"text","value":" library, something like"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-dark","code":"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n","filename":"my-script.ts","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":" \"playwright-core\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" () {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" browser"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" playwright.chromium."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"launch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"({ headless: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":"false"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#79B8FF"},"children":[{"type":"text","value":" page"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" browser."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"newPage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#F97583"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":" page."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#B392F0"},"children":[{"type":"text","value":"goto"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#9ECBFF"},"children":[{"type":"text","value":"\"https://playwright.dev\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":");\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // ... automate page interactions here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#E1E4E8"},"children":[{"type":"text","value":"})();\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"so for now we skip giving an overview of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"BrowserServerLauncherImpl"}]},{"type":"text","value":" code and defer it to a later post."}]},{"type":"element","tag":"h2","props":{"id":"recap"},"children":[{"type":"text","value":"Recap"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Whew! That was quite the journey, so let's recap the main points we covered in this post:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"@playwright/test"}]},{"type":"text","value":" is a wrapper around the test runner package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright"}]},{"type":"text","value":" and the browser automation package "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Importing from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" is a dynamically generated process under the hood, which is done in "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"packages/playwright-core/src/inProcessFactory.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":" there are two main libraries, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/client"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" libraries."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This separation exists so other programming languages can easily build a client library which communicates with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"src/server"}]},{"type":"text","value":" library."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The client-side API and server-side API communicate with each other over a client-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" object and a server-side "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" object. These pass messages with one another through their runtime-defined "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"onmessage"}]},{"type":"text","value":" callback."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is responsible for constructing client side API's, the API methods you import from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"playwright-core"}]},{"type":"text","value":", and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is responsible for keeping track of the dispatcher objects on the server side."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"The instances of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" is wrapped by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ChannelOwner"}]},{"type":"text","value":" subclasses, which all point to the same instance of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Page"}]},{"type":"text","value":". Similarly, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" is wrapped by a subclass of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Dispatcher"}]},{"type":"text","value":" which is responsible for a part of the automated browser."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Both the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":" classes keep track of the same object on each side of the client/server side of the divide with a unique "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"GUID"}]},{"type":"text","value":"."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Once you have parsed the functionality of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Connection"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"DispatcherConnection"}]},{"type":"text","value":", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"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);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"peering-into-playwrights-import-process","depth":2,"text":"Peering into Playwright's import process","children":[{"id":"merging-playwright-and-playwright-core","depth":3,"text":"Merging playwright and playwright-core"},{"id":"rapid-overview-of-the-client-and-server-libraries","depth":3,"text":"Rapid overview of the client and server libraries"}]},{"id":"playwrights-core-api-factory-createinprocessplaywright","depth":2,"text":"Playwright's core API factory, createInProcessPlaywright"},{"id":"cross-communication-between-client-and-server","depth":2,"text":"Cross communication between client and server","children":[{"id":"server-side-createplaywright","depth":3,"text":"Server-side createPlaywright"},{"id":"rootdispatcher-and-server-side-playwright","depth":3,"text":"RootDispatcher and server-side Playwright"},{"id":"tying-back-to-the-onmessage-communication","depth":3,"text":"Tying back to the onmessage communication"},{"id":"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners","depth":3,"text":"Synchronizing objects between the Dispatchers and client-side ChannelOwners"}]},{"id":"launching-the-browser-instance","depth":2,"text":"Launching the browser instance"},{"id":"recap","depth":2,"text":"Recap"}]}},"_type":"markdown","_id":"content:playwright:how-playwright-initializes.md","_source":"content","_file":"playwright/how-playwright-initializes.md","_extension":"md"},{"_path":"/privacy-policy","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Privacy Policy","description":"Effective Date: This Privacy Policy is effective as of February 16, 2024.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Effective Date"}]},{"type":"text","value":": "},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"This Privacy Policy is effective as of February 16, 2024."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this Privacy Policy, unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"QAComet"}]},{"type":"text","value":"\" refers to the website operated by QAComet LLC accessible at QAComet.com"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Personal Information"}]},{"type":"text","value":"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Non-Personal Information"}]},{"type":"text","value":"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Cookies"}]},{"type":"text","value":"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Google Analytics"}]},{"type":"text","value":"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"User"}]},{"type":"text","value":"\" refers to any individual who accesses or uses the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein."}]},{"type":"element","tag":"h2","props":{"id":"_1-information-collection"},"children":[{"type":"text","value":"1. INFORMATION COLLECTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We collect two types of information from users: personal information and non-personal information."}]},{"type":"element","tag":"h3","props":{"id":"personal-information"},"children":[{"type":"text","value":"Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website."}]}]},{"type":"element","tag":"h3","props":{"id":"non-personal-information"},"children":[{"type":"text","value":"Non-Personal Information:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information."}]}]},{"type":"element","tag":"h3","props":{"id":"google-analytics"},"children":[{"type":"text","value":"Google Analytics:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-information"},"children":[{"type":"text","value":"2. USE OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We use the information collected from users for the following purposes:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies."}]},{"type":"element","tag":"h2","props":{"id":"_3-sharing-of-information"},"children":[{"type":"text","value":"3. SHARING OF INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We may share both personal and non-personal information collected from users in the following circumstances:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone."}]}]},{"type":"element","tag":"h2","props":{"id":"_4-google-analytics"},"children":[{"type":"text","value":"4. GOOGLE ANALYTICS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: "},{"type":"element","tag":"a","props":{"href":"https://policies.google.com/privacy?hl=en-US","rel":["nofollow"]},"children":[{"type":"text","value":"Google Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website."}]},{"type":"element","tag":"h2","props":{"id":"_5-data-security"},"children":[{"type":"text","value":"5. DATA SECURITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels."}]},{"type":"element","tag":"h2","props":{"id":"_6-user-controls"},"children":[{"type":"text","value":"6. USER CONTROLS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at "},{"type":"element","tag":"a","props":{"href":"https://tools.google.com/dlpage/gaoptout","rel":["nofollow"]},"children":[{"type":"text","value":"Google Analytics Opt-out Browser Add-on"}]},{"type":"text","value":". This browser add-on allows users to prevent their data from being collected and used by Google Analytics."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights."}]},{"type":"element","tag":"h2","props":{"id":"_7-changes-to-the-privacy-policy"},"children":[{"type":"text","value":"7. CHANGES TO THE PRIVACY POLICY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_8-contact-information"},"children":[{"type":"text","value":"8. CONTACT INFORMATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS:"},{"id":"_1-information-collection","depth":2,"text":"1. INFORMATION COLLECTION:","children":[{"id":"personal-information","depth":3,"text":"Personal Information:"},{"id":"non-personal-information","depth":3,"text":"Non-Personal Information:"},{"id":"google-analytics","depth":3,"text":"Google Analytics:"}]},{"id":"_2-use-of-information","depth":2,"text":"2. USE OF INFORMATION:"},{"id":"_3-sharing-of-information","depth":2,"text":"3. SHARING OF INFORMATION:"},{"id":"_4-google-analytics","depth":2,"text":"4. GOOGLE ANALYTICS:"},{"id":"_5-data-security","depth":2,"text":"5. DATA SECURITY:"},{"id":"_6-user-controls","depth":2,"text":"6. USER CONTROLS:"},{"id":"_7-changes-to-the-privacy-policy","depth":2,"text":"7. CHANGES TO THE PRIVACY POLICY:"},{"id":"_8-contact-information","depth":2,"text":"8. CONTACT INFORMATION:"}]}},"_type":"markdown","_id":"content:privacy-policy.md","_source":"content","_file":"privacy-policy.md","_extension":"md"},{"_path":"/terms-and-conditions","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms And Conditions","description":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\")."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"DEFINITIONS"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Website"}]},{"type":"text","value":"\" refers to the QAComet website, accessible at "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/","rel":["nofollow"]},"children":[{"type":"text","value":"QAComet.com"}]},{"type":"text","value":", including all associated web pages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Owner"}]},{"type":"text","value":"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":"\" refers to any products, features, or functionalities offered on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Content"}]},{"type":"text","value":"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Affiliates"}]},{"type":"text","value":"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Terms"}]},{"type":"text","value":"\" refers to these General Terms and Conditions governing the use of the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"\""},{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Modification"}]},{"type":"text","value":"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion."}]},{"type":"element","tag":"h2","props":{"id":"_1-acceptance-of-terms"},"children":[{"type":"text","value":"1. ACCEPTANCE OF TERMS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website."}]},{"type":"element","tag":"h2","props":{"id":"_2-use-of-website"},"children":[{"type":"text","value":"2. USE OF WEBSITE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities"}]},{"type":"element","tag":"h2","props":{"id":"_3-intellectual-property"},"children":[{"type":"text","value":"3. INTELLECTUAL PROPERTY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties."}]},{"type":"element","tag":"h2","props":{"id":"_4-privacy-policy"},"children":[{"type":"text","value":"4. PRIVACY POLICY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our "},{"type":"element","tag":"a","props":{"href":"https://qacomet.com/privacy-policy","rel":["nofollow"]},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"_5-disclaimer-of-warranties"},"children":[{"type":"text","value":"5. DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_6-limitation-of-liability"},"children":[{"type":"text","value":"6. LIMITATION OF LIABILITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law."}]},{"type":"element","tag":"h2","props":{"id":"_7-modification-and-termination"},"children":[{"type":"text","value":"7. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it."}]},{"type":"element","tag":"h2","props":{"id":"_8-governing-law-and-dispute-resolution"},"children":[{"type":"text","value":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The language of arbitration and all related proceedings shall be English."}]},{"type":"element","tag":"h2","props":{"id":"_9-miscellaneous"},"children":[{"type":"text","value":"9. MISCELLANEOUS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Contact Information: If you have any questions about these Terms or the QAComet website, please "},{"type":"element","tag":"a","props":{"href":"mailto:contact@QAComet.com"},"children":[{"type":"text","value":"Contact Us"}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"DEFINITIONS"},{"id":"_1-acceptance-of-terms","depth":2,"text":"1. ACCEPTANCE OF TERMS:"},{"id":"_2-use-of-website","depth":2,"text":"2. USE OF WEBSITE"},{"id":"_3-intellectual-property","depth":2,"text":"3. INTELLECTUAL PROPERTY:"},{"id":"_4-privacy-policy","depth":2,"text":"4. PRIVACY POLICY"},{"id":"_5-disclaimer-of-warranties","depth":2,"text":"5. DISCLAIMER OF WARRANTIES:"},{"id":"_6-limitation-of-liability","depth":2,"text":"6. LIMITATION OF LIABILITY:"},{"id":"_7-modification-and-termination","depth":2,"text":"7. MODIFICATION AND TERMINATION:"},{"id":"_8-governing-law-and-dispute-resolution","depth":2,"text":"8. GOVERNING LAW AND DISPUTE RESOLUTION:"},{"id":"_9-miscellaneous","depth":2,"text":"9. MISCELLANEOUS:"}]}},"_type":"markdown","_id":"content:terms-and-conditions.md","_source":"content","_file":"terms-and-conditions.md","_extension":"md"},{"_path":"/terms-of-service","_dir":"","_draft":false,"_partial":false,"_locale":"","title":"Terms Of Service","description":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.","body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us."}]},{"type":"element","tag":"h2","props":{"id":"definitions"},"children":[{"type":"text","value":"Definitions:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client"}]},{"type":"text","value":": Refers to individuals or entities who utilize QAComet's QA/Testing services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Company"}]},{"type":"text","value":": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Services"}]},{"type":"text","value":": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Materials"}]},{"type":"text","value":": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Ownership"}]},{"type":"text","value":": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Client-Specific Utilities"}]},{"type":"text","value":": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Design Patterns"}]},{"type":"text","value":": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Trial Period"}]},{"type":"text","value":": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Subscription Fee"}]},{"type":"text","value":": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Intellectual Property Rights"}]},{"type":"text","value":": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Dispute Resolution"}]},{"type":"text","value":": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Privacy Policy"}]},{"type":"text","value":": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms."}]},{"type":"element","tag":"h2","props":{"id":"_2-scope-of-service"},"children":[{"type":"text","value":"2. SCOPE OF SERVICE"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_3-account-security"},"children":[{"type":"text","value":"3. ACCOUNT SECURITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet."}]},{"type":"element","tag":"h2","props":{"id":"_4-right-to-refuse-or-cancel-services"},"children":[{"type":"text","value":"4. RIGHT TO REFUSE OR CANCEL SERVICES"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law."}]},{"type":"element","tag":"h2","props":{"id":"_5-promotional-rights"},"children":[{"type":"text","value":"5. PROMOTIONAL RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials."}]},{"type":"element","tag":"h2","props":{"id":"_6-ownership-of-materials"},"children":[{"type":"text","value":"6. OWNERSHIP OF MATERIALS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials."}]},{"type":"element","tag":"h2","props":{"id":"_7-client-responsibilities"},"children":[{"type":"text","value":"7. CLIENT RESPONSIBILITIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions."}]},{"type":"element","tag":"h2","props":{"id":"_8-billing-and-payments"},"children":[{"type":"text","value":"8. BILLING AND PAYMENTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client."}]},{"type":"element","tag":"h2","props":{"id":"_9-intellectual-property-rights"},"children":[{"type":"text","value":"9. INTELLECTUAL PROPERTY RIGHTS:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests."}]},{"type":"text","value":"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client."}]},{"type":"element","tag":"h2","props":{"id":"_10-qacomet-pre-existing-ip-materials"},"children":[{"type":"text","value":"10. QACOMET Pre-Existing IP MATERIALS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”)."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement."}]},{"type":"element","tag":"h2","props":{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties"},"children":[{"type":"text","value":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances."}]},{"type":"element","tag":"h2","props":{"id":"_12-confidentiality"},"children":[{"type":"text","value":"12. CONFIDENTIALITY:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity."}]},{"type":"element","tag":"h2","props":{"id":"_13-dispute-resolution-and-governing-law"},"children":[{"type":"text","value":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts."}]},{"type":"element","tag":"h2","props":{"id":"_14-modification-and-termination"},"children":[{"type":"text","value":"14. MODIFICATION AND TERMINATION:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service."}]},{"type":"element","tag":"h2","props":{"id":"_15-severability"},"children":[{"type":"text","value":"15. SEVERABILITY"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Summary: "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision."}]},{"type":"element","tag":"h2","props":{"id":"_16-contact-us"},"children":[{"type":"text","value":"16. Contact Us:"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at "},{"type":"element","tag":"a","props":{"href":"mailto:contact@qacomet.com"},"children":[{"type":"text","value":"contact@qacomet.com"}]},{"type":"text","value":". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"definitions","depth":2,"text":"Definitions:"},{"id":"_2-scope-of-service","depth":2,"text":"2. SCOPE OF SERVICE"},{"id":"_3-account-security","depth":2,"text":"3. ACCOUNT SECURITY"},{"id":"_4-right-to-refuse-or-cancel-services","depth":2,"text":"4. RIGHT TO REFUSE OR CANCEL SERVICES"},{"id":"_5-promotional-rights","depth":2,"text":"5. PROMOTIONAL RIGHTS:"},{"id":"_6-ownership-of-materials","depth":2,"text":"6. OWNERSHIP OF MATERIALS:"},{"id":"_7-client-responsibilities","depth":2,"text":"7. CLIENT RESPONSIBILITIES:"},{"id":"_8-billing-and-payments","depth":2,"text":"8. BILLING AND PAYMENTS:"},{"id":"_9-intellectual-property-rights","depth":2,"text":"9. INTELLECTUAL PROPERTY RIGHTS:"},{"id":"_10-qacomet-pre-existing-ip-materials","depth":2,"text":"10. QACOMET Pre-Existing IP MATERIALS."},{"id":"_11-limitation-of-liability-and-disclaimer-of-warranties","depth":2,"text":"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:"},{"id":"_12-confidentiality","depth":2,"text":"12. CONFIDENTIALITY:"},{"id":"_13-dispute-resolution-and-governing-law","depth":2,"text":"13. DISPUTE RESOLUTION AND GOVERNING LAW:"},{"id":"_14-modification-and-termination","depth":2,"text":"14. MODIFICATION AND TERMINATION:"},{"id":"_15-severability","depth":2,"text":"15. SEVERABILITY"},{"id":"_16-contact-us","depth":2,"text":"16. Contact Us:"}]}},"_type":"markdown","_id":"content:terms-of-service.md","_source":"content","_file":"terms-of-service.md","_extension":"md"},{"_path":"/white-papers/how-qa-factors-into-vc-due-diligence","_dir":"white-papers","_draft":false,"_partial":false,"_locale":"","title":"How Software QA Factors Into VC Investment Decisions","description":"Let your products shine bright with effective QA. With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.","breadcrumbs":[{"name":"White papers","path":"/white-papers/"},{"name":"How QA factors into VC due diligence","path":"/white-papers/how-qa-factors-into-vc-due-diligence/"}],"link":"/white-papers/how-qa-factors-into-vc-due-diligence/","created":{"string":"May 30, 2024","number":1717048800000,"month":"May","day":30,"year":2024},"shortDescription":"With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"introduction"},"children":[{"type":"text","value":"Introduction"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In a recent market research survey we explored how venture capitalists (VCs) consider software quality in their investment decisions. We delved into their expectations for software quality at various investment stages and the standards for different products or verticals. The survey revealed that due to rising interest rates and increased consumer expectations for quality products, the investment landscape has become more stringent."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I think there's less room for error overall in all aspects of raising capital. Today, there's a clear flight to quality at all levels, starting with capital being deployed to VC funds. With today's higher interest rates, there's significantly less capital going forward. — Frederico Santos, "},{"type":"element","tag":"a","props":{"href":"https://sg.linkedin.com/in/frederico-castro-santos-33874444","rel":["nofollow"]},"children":[{"type":"text","value":"VC Investor"}]}]}]},{"type":"element","tag":"h2","props":{"id":"evolution-of-the-startup-investment-landscape"},"children":[{"type":"text","value":"Evolution of the startup investment landscape"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you think of building a SaaS product, one of the most commonly quoted methodologies for managing product development is to \"Build fast and break things\" "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"HBR"}]},{"type":"text","value":". But, this old wisdom applied to the early days of Facebook, from 2007 up to 2014 "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"CNET"}]},{"type":"text","value":", may not be the best managerial choice while building up your product."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Today, we live in a high-interest environment where capital is much more cautious than in the years before us. In addition, we've collectively seen nearly $1.5T in investments in the past ten years "},{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Statista"}]},{"type":"text","value":". This translates into a vast trove of well-made SaaS products and established brands."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With this diversity of products, we live in a world where users are fluent in multiple software products. And with that, they now have higher expectations for what a functional software product looks like today. This can be true even in the early stages of startup products, at pre-seed or seed stages, depending on your product and team. As your startup matures, passing through Series A onwards, the expectations for quality only increase."}]},{"type":"element","tag":"h2","props":{"id":"how-does-software-quality-affect-investment-decisions"},"children":[{"type":"text","value":"How does Software Quality Affect Investment Decisions?"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our survey identified many types of startups that would significantly benefit from additional software QA. Investors use various questions to assess software quality requirements, such as:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"How technical of a product is it/is the product deep tech?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is this an infrastructure product?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is the product expected to integrate with multiple other tools?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Does the product function as middleware between other sets of tools?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"How tolerant are customers of product failure?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Are the customers technically savvy?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is the product responsible for Personally Identifiable Information (PII)?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"What kind of regulatory environment does the product live in?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Are there any legal or financial risks if the product fails or behaves erratically?"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Ultimately, they are probing one fundamental question during due diligence:"}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"What are the risks when the product fails?"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is crucial because VCs are performing risk analysis on future software products while also assessing their market potential. If a product could be responsible for breaking a supply chain, crashing other software products due to downtime, enable fraud with stolen PII, pose security risks, or deterring non-technical users away from their product, this product will face extra scrutiny during due diligence."}]},{"type":"element","tag":"h3","props":{"id":"common-red-flags-during-vcs-due-diligence"},"children":[{"type":"text","value":"Common red flags during VC’s due diligence"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our survey found several common red flags VCs look for during their due diligence process. These included not having a technical member on the founding team, usability and reliability issues, having a product that cannot scale with its current tech, and having a product with security vulnerabilities or other critical bugs. These red flags are particularly concerning for VCs if the product is deep tech or carries significant liabilities. Addressing these risks is vital for securing your next round of funding."}]},{"type":"element","tag":"h4","props":{"id":"usability-issues"},"children":[{"type":"text","value":"Usability issues­"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Usability problems were frequently mentioned red flags in our survey. Investors mentioned how clunky interfaces or poorly designed workflows often deterred them from investing in companies. Ensuring your software is user-friendly and intuitive is crucial to improving your investment prospects in this highly competitive environment."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Have you considered how often users may be multitasking while using your software? This is essential for many products because there's a good chance a non-technical person will be using your product. I can't tell you the number of times I've been in a doctor's office, bank, financial aid office, etc. where someone I speak with is using some kind of software while talking to me. If a simple mistake could create catastrophe for some customer, you need to invest time and effort into polishing your product's workflow."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Furthermore, you may be developing a product for non-technical users. These are people who would not be using your software unless it saved them a considerable amount of time. How patient do you think Joe the plumber will be when his dispatching software has awkward controls? This is true in several industries where users are much less tolerant of software problems."}]},{"type":"element","tag":"h4","props":{"id":"architectural-missteps-and-scaling-challenges"},"children":[{"type":"text","value":"Architectural missteps and scaling challenges"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another red flag commonly mentioned by VCs were scaling issues. When raising capital your company will be expected to scale your number of customers. If your product requires a complete rewrite because you can't support enough customers or because of reliability issues, then you’ll likely be passed for investment. These problems create risks like"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Having a competitor come and scoop up your customers because of a superior product."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Customers litigating because you have legal or fiduciary responsibilities."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Dealing with reputational issues which will likely hamper future growth."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These risks are substantial deterrents for investors and will likely lead them to pass up investing in your startup. I've spoken with investors who have declined investing in companies because technical due diligence failing. This was even the case when the company passed every other metric used during diligence with flying colors. This was undoubtedly disappointing for the founders, but could have been avoided with more focus on their underlying technology."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The one counterexample to this is when you're building a product prototype while identifying product-market fit. This exception is short-lived, and any startup should transition out as quickly as possible. You may have heard stories of founders successfully exiting with a product built using some no-code tool (like Bubble), but you should ensure such a tech decision is viable within your market. Also, you should have a plan for migrating off of such a platform so you can take control of your own tech."}]},{"type":"element","tag":"h4","props":{"id":"security-vulnerabilities-and-critical-bugs"},"children":[{"type":"text","value":"Security vulnerabilities and critical bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Security issues were another prevalent red flag highlighted by survey participants. Many shared experiences of startups being rejected because of security concerns. This is a significant red flag for any company offering cybersecurity software, managing PII or financial data, or handling financial transactions. We've heard of companies trying to raise money that had bugs in their custom trading system that accidentally reversed positions for trades. Imagine shorting a stock and then having your position reversed by the trading platform to a put!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another story involved a cybersecurity company seeking funding. During due diligence, an analyst found numerous security vulnerabilities in their platform and managed to bypass their authentication into the admin dashboard. There the analyst left messages behind for the founders, leading to an embarrassing rejection from the VC."}]},{"type":"element","tag":"h3","props":{"id":"vc-expectations-at-pre-seed-and-seed-rounds"},"children":[{"type":"text","value":"VC expectations at pre-seed and seed rounds"}]},{"type":"element","tag":"quote","props":{":titles":"{\"titles\":[{\"title\": \"VC Investor\", \"link\": \"https://www.linkedin.com/in/frederic-gray-iv-637bba11\"}]}","image":"/img/white-papers/frederic-headshot.png","name":"Frederic Gray"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Expectations for software quality are stage-specific. Earlier products should be simplistic, to learn customer needs, to drive future product iterations. Later products, Series A onwards, are held to a higher standard. That said, all these expectations are vertical-specific."}]}]},{"type":"element","tag":"h4","props":{"id":"feedback-from-non-technical-investors"},"children":[{"type":"text","value":"Feedback from non-technical investors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In our discussions with investors, we found a range of responses regarding software quality in early-stage products at the pre-seed and seed stages of investment. The more non-technical investors we surveyed primarily focus their due diligence on"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Market potential."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"KPIs such as churn rate, CAC, MRR, etc."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"at these rounds. The main exceptions were deep tech products, products responsible for PII, or products with legal responsibilities. In these cases they would rely on tech consultants as part of their due diligence. Also, products in verticals requiring higher product quality faced additional scrutiny. In all these scenarios the bar is significantly higher, and founders should plan accordingly before seeking investments. In these cases investing in software quality is a major green flag for investors."}]},{"type":"element","tag":"h4","props":{"id":"feedback-from-technical-investors"},"children":[{"type":"text","value":"Feedback from technical investors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For technical investors, we received a range of answers. Many expected higher quality products and were more likely to dive deeper into the underlying tech used. Some green flags mentioned were"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Excellent architectural decisions for the software."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"A solid implementation roadmap, even if all features weren't yet available."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Adherence to best practices for software development, such as using agile management or Scrum."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"A solid foundation for scaling the product."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"High-quality API design and solid developer documentation."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The only reservations mentioned were founders who overengineered their product before fundraising. This could mean prematurely scaling a product without validating product-market fit, writing excessive tests for features that don't need them, and creating an inflexible infrastructure that doesn’t accomidate product changes. If you're in the early stages product development, there are many pitfalls for over-engineering. However, if product-market fit has been validated, then excellent software quality is highly rewarded."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One notable example of this is Stripe "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"Stripe"}]},{"type":"text","value":". When the company launched its first product, they were late to market with several competing payment platforms boasting large user bases. The key to Stripe's success was its excellent API design and high-quality infrastructure. Their product quality enabled them to secure funding successfully and continue to be an extremely successful company today."}]},{"type":"element","tag":"h3","props":{"id":"vc-expectations-at-series-a-and-beyond"},"children":[{"type":"text","value":"VC expectations at Series A and beyond"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our surveys generally indicated that post-Series A, the bar for software quality significantly rises. At this stage you should be following best practices for software quality in your development process. This includes:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Automated testing for core features and workflows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Best practices for testing new features and using regression testing to prevent recurring bugs."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Following standard development methodologies such as agile, Scrum, etc."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Having testing infrastructure in place along with Continuous Integration (CI) and Continuous Deployment (CD)."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Documenting software architecture, main technical decisions, and any other relevant material."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Regular customer interaction to find pain points and other issues."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At this stage, investors will substantially increase their scrutiny for any future series of investments. There is significantly less tolerance for failure, and investors will be looking for robust infrastructure in place."}]},{"type":"element","tag":"h2","props":{"id":"where-non-technical-founders-fall-short"},"children":[{"type":"text","value":"Where non-technical founders fall short"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The primary challenge non-technical founders face is exactly what's in their name: their lack of technical skills. If you, a non-technical founder, spend time learning about the core technical problems your startup faces in the future, investors will likely see this as a green flag. We've had investors tell us many non-technical founders value their ideas but don't understand the complexities of software, and hence cannot value the underlying technology. Some of these technical complexities include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding how scalability impacts future growth."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Learning about the limitations of no-code platforms and how they are primarly for prototypes."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Educating yourself about the software development life cycle (SDLC)."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding what software QA encompasses and how it looks in successful startups."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You should ideally be prepared with a host of questions so you can build a bridge with your future technical co-founder. Without this bridge, you will be flying blind, creating unwanted risks for investors. It is paramount to have someone technical on your team as soon as possible; most VCs we've spoken with will refuse to invest in teams lacking this expertise."}]},{"type":"element","tag":"h3","props":{"id":"enhance-your-product-with-qacomet"},"children":[{"type":"text","value":"Enhance your product with QAComet"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet offers a wide variety of services to help you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Identifying and resolving usability issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Resolve usability problems in your no-code proptype."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding technical content, providing support, and answering questions."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Conducting customer interviews for identifying customer pain points."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Establishing development workflows following Agile methodology."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Build a core testing suite when your business is ready for this acceleration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can "},{"type":"element","tag":"a","props":{"href":"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call","rel":["nofollow"]},"children":[{"type":"text","value":"schedule a free call today"}]},{"type":"text","value":" for a free 15-minute consultation to discuss your product's QA. We also offer a $50 two-week trial for early customers; ask us about it during our free consultation."}]},{"type":"element","tag":"h2","props":{"id":"challenges-for-technical-founders"},"children":[{"type":"text","value":"Challenges for technical founders"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our VC survey participants noted some common issues technical founders face when developing their products. These include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Overbuilding and creating overengineered solutions."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Failing to identify the most crucial features and leaving the rest as part of the product roadmap."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Not engaging with customers and identifying their problems."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Not finding product-market fit quickly enough."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each of these points requires a distinct mindset typically found among technical founders and can largely be fixed by communicating with customers within your market. Our survey revealed that it's more important to have solid implementations with partial feature support than to rattle off poorly implemented features."}]},{"type":"element","tag":"h3","props":{"id":"how-qacomet-helps-your-journey"},"children":[{"type":"text","value":"How QAComet helps your journey"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet offers a wide variety of services, helping you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Identifying usability issues and potential pain points."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Conducting customer interviews and pinpointing their problems and feature requirements."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Documenting core technical aspects, architectural decisions, and workflows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Writing E2E, integration and unit tests."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Integrating automated tests with CI and building out CI pipelines."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Establishing your QA strategy as part of your Agile SDLC."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can "},{"type":"element","tag":"a","props":{"href":"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call","rel":["nofollow"]},"children":[{"type":"text","value":"schedule a free call today"}]},{"type":"text","value":" for a free 15-minute consultation to talk about your product's QA. In addition, we offer a $50 two-week trial for early customers; ask us about it during our free consultation."}]},{"type":"element","tag":"h2","props":{"id":"take-your-startup-to-the-next-level"},"children":[{"type":"text","value":"Take your startup to the next level"}]},{"type":"element","tag":"quote","props":{":titles":"{\"titles\":[{\"title\": \"VC Partner\", \"link\": \"https://www.thinkklabs.com/\"}, {\"title\":\"4x Founder\", \"link\": \"https://www.linkedin.com/in/yianni-kellis/\"}]}","image":"/img/white-papers/yianni-headshot.png","name":"Yianni Kellis"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Startups that have a clear emphasis on quality software development and thorough QA processes often secure funding more smoothly. These companies don't necessarily need large in-house QA teams but must demonstrate a strategic approach to maintaining software quality, possibly through fractional QA services."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The key takeaway from our survey is that expectations for product quality are here to stay. In our current startup environment, VCs expects more from founders due to the increase in quality tooling and heightened market expectations for usable products. It's paramount for both technical and non-technical founders to learn from their customers, build a solid user experience, and make sure their product meets customer expectations. Today, we live with higher expectations from customers and VCs alike, and startups must adapt to this evolving market."}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[CNET] "},{"type":"element","tag":"a","props":{"href":"https://www.cnet.com/tech/mobile/zuckerberg-move-fast-and-break-things-isnt-how-we-operate-anymore/","rel":["nofollow"]},"children":[{"type":"text","value":"Zuckerberg: 'Move fast and break things' isn't how Facebook operates anymore"}]},{"type":"text","value":". CNET.com."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[HBR] "},{"type":"element","tag":"a","props":{"href":"https://hbr.org/2019/01/the-era-of-move-fast-and-break-things-is-over","rel":["nofollow"]},"children":[{"type":"text","value":"The Era of “Move Fast and Break Things” Is Over"}]},{"type":"text","value":". Harvard Business Review."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Notion] "},{"type":"element","tag":"a","props":{"href":"https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/","rel":["nofollow"]},"children":[{"type":"text","value":"Design on a deadline: How Notion pulled itself back from the brink of failure"}]},{"type":"text","value":". Figma Blog."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Statista] "},{"type":"element","tag":"a","props":{"href":"https://www.statista.com/statistics/277501/venture-capital-amount-invested-in-the-united-states-since-1995/","rel":["nofollow"]},"children":[{"type":"text","value":"Value of venture capital investment in the United States from 2006 to 2022"}]},{"type":"text","value":". Statista.com."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Stripe] "},{"type":"element","tag":"a","props":{"href":"https://www.inc.com/jason-aten/the-5-simple-reasons-stripe-became-most-valuable-startup-ever.html","rel":["nofollow"]},"children":[{"type":"text","value":"The 5 Simple Reasons Stripe Became the Most Valuable Startup Ever"}]},{"type":"text","value":". Inc."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Techcrunch] "},{"type":"element","tag":"a","props":{"href":"https://techcrunch.com/2024/01/10/venture-capital-2023-analysis/","rel":["nofollow"]},"children":[{"type":"text","value":"Explained in 5 charts: Venture capital in 2023"}]},{"type":"text","value":". Techcrunch."}]}]},{"type":"element","tag":"h3","props":{"id":"additional-resources"},"children":[{"type":"text","value":"Additional Resources"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://books.google.com/books?id=XLxUBQAAQBAJ","rel":["nofollow"]},"children":[{"type":"text","value":"Learning Agile: Understanding Scrum, XP, Lean, and Kanban"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468/","rel":["nofollow"]},"children":[{"type":"text","value":"Agile Testing: A Practical Guide for Testers and Agile Teams"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.scrum.org/resources/blog/yds-where-does-quality-assurance-qa-fit-scrum-team","rel":["nofollow"]},"children":[{"type":"text","value":"YDS: Where Does Quality Assurance (QA) Fit on a Scrum Team?"}]}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"introduction","depth":2,"text":"Introduction"},{"id":"evolution-of-the-startup-investment-landscape","depth":2,"text":"Evolution of the startup investment landscape"},{"id":"how-does-software-quality-affect-investment-decisions","depth":2,"text":"How does Software Quality Affect Investment Decisions?","children":[{"id":"common-red-flags-during-vcs-due-diligence","depth":3,"text":"Common red flags during VC’s due diligence"},{"id":"vc-expectations-at-pre-seed-and-seed-rounds","depth":3,"text":"VC expectations at pre-seed and seed rounds"},{"id":"vc-expectations-at-series-a-and-beyond","depth":3,"text":"VC expectations at Series A and beyond"}]},{"id":"where-non-technical-founders-fall-short","depth":2,"text":"Where non-technical founders fall short","children":[{"id":"enhance-your-product-with-qacomet","depth":3,"text":"Enhance your product with QAComet"}]},{"id":"challenges-for-technical-founders","depth":2,"text":"Challenges for technical founders","children":[{"id":"how-qacomet-helps-your-journey","depth":3,"text":"How QAComet helps your journey"}]},{"id":"take-your-startup-to-the-next-level","depth":2,"text":"Take your startup to the next level"},{"id":"references","depth":2,"text":"References","children":[{"id":"additional-resources","depth":3,"text":"Additional Resources"}]}]}},"_type":"markdown","_id":"content:white-papers:how-qa-factors-into-vc-due-diligence.md","_source":"content","_file":"white-papers/how-qa-factors-into-vc-due-diligence.md","_extension":"md"}],"navigation":[{"title":"Case Studies","_path":"/case-studies","children":[{"title":"Automatisch","_path":"/case-studies/automatisch"}]},{"title":"Medusa","_path":"/medusa"},{"title":"Medusa","_path":"/medusa_gpt_edit"},{"title":"Playwright","_path":"/playwright","children":[{"title":"Architecture of Playwright","_path":"/playwright/architecture"},{"title":"How importing from Playwright works","_path":"/playwright/how-playwright-initializes"}]},{"title":"Privacy Policy","_path":"/privacy-policy"},{"title":"Terms And Conditions","_path":"/terms-and-conditions"},{"title":"Terms Of Service","_path":"/terms-of-service"},{"title":"White Papers","_path":"/white-papers","children":[{"title":"How Software QA Factors Into VC Investment Decisions","_path":"/white-papers/how-qa-factors-into-vc-due-diligence"}]}]} \ No newline at end of file diff --git a/api/_content/query/9C0VBep6PV.1714258600178.json b/api/_content/query/9C0VBep6PV.1717143045798.json similarity index 100% rename from api/_content/query/9C0VBep6PV.1714258600178.json rename to api/_content/query/9C0VBep6PV.1717143045798.json diff --git a/api/_content/query/Cr3vX64g4U.1714258600178.json b/api/_content/query/Cr3vX64g4U.1717143045798.json similarity index 100% rename from api/_content/query/Cr3vX64g4U.1714258600178.json rename to api/_content/query/Cr3vX64g4U.1717143045798.json diff --git a/api/_content/query/FQBYG5nyVD.1717143045798.json b/api/_content/query/FQBYG5nyVD.1717143045798.json new file mode 100644 index 0000000..bc1b0d3 --- /dev/null +++ b/api/_content/query/FQBYG5nyVD.1717143045798.json @@ -0,0 +1 @@ +[{"title":"How Software QA Factors Into VC Investment Decisions","link":"/white-papers/how-qa-factors-into-vc-due-diligence/","created":{"string":"May 30, 2024","number":1717048800000,"month":"May","day":30,"year":2024},"shortDescription":"With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC."}] \ No newline at end of file diff --git a/api/_content/query/Qfdjvn2t5d.1714258600178.json b/api/_content/query/Qfdjvn2t5d.1714258600178.json deleted file mode 100644 index 7f3c918..0000000 --- a/api/_content/query/Qfdjvn2t5d.1714258600178.json +++ /dev/null @@ -1 +0,0 @@ -{"_path":"/case-studies/automatisch","_dir":"case-studies","_draft":false,"_partial":false,"_locale":"","title":"Automatisch","description":"W","subtitle":"Going from the launch pad to the cosmos with E2E testing","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Automatisch","path":"/case-studies/automatisch/"}],"link":"/case-studies/automatisch","created":{"string":"February 26, 2024","month":"Feb","day":26,"year":2024},"shortDescription":"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch"},"children":[{"type":"text","value":"Improving Software Quality and Testing Infrastructure for Automatisch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with an open source no-code automation company called "},{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"automatisch-the-open-source-zapier-alternative"},"children":[{"type":"text","value":"Automatisch: The Open Source Zapier Alternative"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" is a reputable "},{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch","rel":["nofollow"]},"children":[{"type":"text","value":"open source"}]},{"type":"text","value":" software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"proactive-bug-finding-and-reporting"},"children":[{"type":"text","value":"Proactive Bug Finding and Reporting"}]},{"type":"element","tag":"h3","props":{"id":"our-approach-to-reporting-bugs"},"children":[{"type":"text","value":"Our approach to reporting bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Overview"}]},{"type":"text","value":": A Quick overview of the bug found, which generally includes an image"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Reproduction"}]},{"type":"text","value":": Detailed list of instructions for reproducing the bug"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Improvements"}]},{"type":"text","value":": Suggestions for how to resolve the bug and improve the software"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket."}]},{"type":"element","tag":"h3","props":{"id":"some-bugs-we-found"},"children":[{"type":"text","value":"Some Bugs We Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1371","rel":["nofollow"]},"children":[{"type":"text","value":"Recreating deleted users"}]}]},{"type":"text","value":": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1370","rel":["nofollow"]},"children":[{"type":"text","value":"Inconsistent interface conveying permissions"}]}]},{"type":"text","value":": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1366","rel":["nofollow"]},"children":[{"type":"text","value":"Deleting roles edge case"}]}]},{"type":"text","value":": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1235","rel":["nofollow"]},"children":[{"type":"text","value":"Invalidating GitHub OAuth error"}]}]},{"type":"text","value":": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems."}]},{"type":"element","tag":"h2","props":{"id":"dive-into-testing"},"children":[{"type":"text","value":"Dive into Testing"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright."}]},{"type":"element","tag":"h3","props":{"id":"refactoring-workflow-tests"},"children":[{"type":"text","value":"Refactoring Workflow Tests"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"test.step"}]},{"type":"text","value":" interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases."}]},{"type":"element","tag":"h3","props":{"id":"user-management"},"children":[{"type":"text","value":"User Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We overcame these challenges by upgrading the library used so we could put "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data-"}]},{"type":"text","value":" props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information."}]},{"type":"element","tag":"h3","props":{"id":"role-management"},"children":[{"type":"text","value":"Role Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users."}]},{"type":"element","tag":"h2","props":{"id":"ci-pipeline-enhancements"},"children":[{"type":"text","value":"CI Pipeline Enhancements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem."}]},{"type":"element","tag":"h2","props":{"id":"tangible-value"},"children":[{"type":"text","value":"Tangible Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch","depth":2,"text":"Improving Software Quality and Testing Infrastructure for Automatisch"},{"id":"automatisch-the-open-source-zapier-alternative","depth":2,"text":"Automatisch: The Open Source Zapier Alternative"},{"id":"proactive-bug-finding-and-reporting","depth":2,"text":"Proactive Bug Finding and Reporting","children":[{"id":"our-approach-to-reporting-bugs","depth":3,"text":"Our approach to reporting bugs"},{"id":"some-bugs-we-found","depth":3,"text":"Some Bugs We Found"}]},{"id":"dive-into-testing","depth":2,"text":"Dive into Testing","children":[{"id":"refactoring-workflow-tests","depth":3,"text":"Refactoring Workflow Tests"},{"id":"user-management","depth":3,"text":"User Management"},{"id":"role-management","depth":3,"text":"Role Management"}]},{"id":"ci-pipeline-enhancements","depth":2,"text":"CI Pipeline Enhancements"},{"id":"tangible-value","depth":2,"text":"Tangible Value"}]}},"_type":"markdown","_id":"content:case-studies:automatisch.md","_source":"content","_file":"case-studies/automatisch.md","_extension":"md"} \ No newline at end of file diff --git a/api/_content/query/Qfdjvn2t5d.1717143045798.json b/api/_content/query/Qfdjvn2t5d.1717143045798.json new file mode 100644 index 0000000..4eedb0c --- /dev/null +++ b/api/_content/query/Qfdjvn2t5d.1717143045798.json @@ -0,0 +1 @@ +{"_path":"/case-studies/automatisch","_dir":"case-studies","_draft":false,"_partial":false,"_locale":"","title":"Automatisch","description":"","subtitle":"Going from the launch pad to the cosmos with E2E testing","breadcrumbs":[{"name":"Case Studies","path":"/case-studies/"},{"name":"Automatisch","path":"/case-studies/automatisch/"}],"link":"/case-studies/automatisch","created":{"string":"February 26, 2024","month":"Feb","day":26,"year":2024},"shortDescription":"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch"},"children":[{"type":"text","value":"Improving Software Quality and Testing Infrastructure for Automatisch"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We recently collaborated with an open source no-code automation company called "},{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"automatisch-the-open-source-zapier-alternative"},"children":[{"type":"text","value":"Automatisch: The Open Source Zapier Alternative"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://automatisch.io","rel":["nofollow"]},"children":[{"type":"text","value":"Automatisch"}]},{"type":"text","value":" is a reputable "},{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch","rel":["nofollow"]},"children":[{"type":"text","value":"open source"}]},{"type":"text","value":" software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions."}]},{"type":"element","tag":"h2","props":{"id":"proactive-bug-finding-and-reporting"},"children":[{"type":"text","value":"Proactive Bug Finding and Reporting"}]},{"type":"element","tag":"h3","props":{"id":"our-approach-to-reporting-bugs"},"children":[{"type":"text","value":"Our approach to reporting bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Overview"}]},{"type":"text","value":": A Quick overview of the bug found, which generally includes an image"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Reproduction"}]},{"type":"text","value":": Detailed list of instructions for reproducing the bug"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"Improvements"}]},{"type":"text","value":": Suggestions for how to resolve the bug and improve the software"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket."}]},{"type":"element","tag":"h3","props":{"id":"some-bugs-we-found"},"children":[{"type":"text","value":"Some Bugs We Found"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1371","rel":["nofollow"]},"children":[{"type":"text","value":"Recreating deleted users"}]}]},{"type":"text","value":": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1370","rel":["nofollow"]},"children":[{"type":"text","value":"Inconsistent interface conveying permissions"}]}]},{"type":"text","value":": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1366","rel":["nofollow"]},"children":[{"type":"text","value":"Deleting roles edge case"}]}]},{"type":"text","value":": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/automatisch/automatisch/issues/1235","rel":["nofollow"]},"children":[{"type":"text","value":"Invalidating GitHub OAuth error"}]}]},{"type":"text","value":": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems."}]},{"type":"element","tag":"h2","props":{"id":"dive-into-testing"},"children":[{"type":"text","value":"Dive into Testing"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright."}]},{"type":"element","tag":"h3","props":{"id":"refactoring-workflow-tests"},"children":[{"type":"text","value":"Refactoring Workflow Tests"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"test.step"}]},{"type":"text","value":" interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases."}]},{"type":"element","tag":"h3","props":{"id":"user-management"},"children":[{"type":"text","value":"User Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We overcame these challenges by upgrading the library used so we could put "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"data-"}]},{"type":"text","value":" props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information."}]},{"type":"element","tag":"h3","props":{"id":"role-management"},"children":[{"type":"text","value":"Role Management"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users."}]},{"type":"element","tag":"h2","props":{"id":"ci-pipeline-enhancements"},"children":[{"type":"text","value":"CI Pipeline Enhancements"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem."}]},{"type":"element","tag":"h2","props":{"id":"tangible-value"},"children":[{"type":"text","value":"Tangible Value"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"improving-software-quality-and-testing-infrastructure-for-automatisch","depth":2,"text":"Improving Software Quality and Testing Infrastructure for Automatisch"},{"id":"automatisch-the-open-source-zapier-alternative","depth":2,"text":"Automatisch: The Open Source Zapier Alternative"},{"id":"proactive-bug-finding-and-reporting","depth":2,"text":"Proactive Bug Finding and Reporting","children":[{"id":"our-approach-to-reporting-bugs","depth":3,"text":"Our approach to reporting bugs"},{"id":"some-bugs-we-found","depth":3,"text":"Some Bugs We Found"}]},{"id":"dive-into-testing","depth":2,"text":"Dive into Testing","children":[{"id":"refactoring-workflow-tests","depth":3,"text":"Refactoring Workflow Tests"},{"id":"user-management","depth":3,"text":"User Management"},{"id":"role-management","depth":3,"text":"Role Management"}]},{"id":"ci-pipeline-enhancements","depth":2,"text":"CI Pipeline Enhancements"},{"id":"tangible-value","depth":2,"text":"Tangible Value"}]}},"_type":"markdown","_id":"content:case-studies:automatisch.md","_source":"content","_file":"case-studies/automatisch.md","_extension":"md"} \ No newline at end of file diff --git a/api/_content/query/SdPqqtG5SL.1717143045798.json b/api/_content/query/SdPqqtG5SL.1717143045798.json new file mode 100644 index 0000000..6842549 --- /dev/null +++ b/api/_content/query/SdPqqtG5SL.1717143045798.json @@ -0,0 +1 @@ +{"_path":"/white-papers/how-qa-factors-into-vc-due-diligence","_dir":"white-papers","_draft":false,"_partial":false,"_locale":"","title":"How Software QA Factors Into VC Investment Decisions","description":"Let your products shine bright with effective QA. With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.","breadcrumbs":[{"name":"White papers","path":"/white-papers/"},{"name":"How QA factors into VC due diligence","path":"/white-papers/how-qa-factors-into-vc-due-diligence/"}],"link":"/white-papers/how-qa-factors-into-vc-due-diligence/","created":{"string":"May 30, 2024","number":1717048800000,"month":"May","day":30,"year":2024},"shortDescription":"With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.","body":{"type":"root","children":[{"type":"element","tag":"h2","props":{"id":"introduction"},"children":[{"type":"text","value":"Introduction"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In a recent market research survey we explored how venture capitalists (VCs) consider software quality in their investment decisions. We delved into their expectations for software quality at various investment stages and the standards for different products or verticals. The survey revealed that due to rising interest rates and increased consumer expectations for quality products, the investment landscape has become more stringent."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I think there's less room for error overall in all aspects of raising capital. Today, there's a clear flight to quality at all levels, starting with capital being deployed to VC funds. With today's higher interest rates, there's significantly less capital going forward. — Frederico Santos, "},{"type":"element","tag":"a","props":{"href":"https://sg.linkedin.com/in/frederico-castro-santos-33874444","rel":["nofollow"]},"children":[{"type":"text","value":"VC Investor"}]}]}]},{"type":"element","tag":"h2","props":{"id":"evolution-of-the-startup-investment-landscape"},"children":[{"type":"text","value":"Evolution of the startup investment landscape"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When you think of building a SaaS product, one of the most commonly quoted methodologies for managing product development is to \"Build fast and break things\" "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"HBR"}]},{"type":"text","value":". But, this old wisdom applied to the early days of Facebook, from 2007 up to 2014 "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"CNET"}]},{"type":"text","value":", may not be the best managerial choice while building up your product."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Today, we live in a high-interest environment where capital is much more cautious than in the years before us. In addition, we've collectively seen nearly $1.5T in investments in the past ten years "},{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Statista"}]},{"type":"text","value":". This translates into a vast trove of well-made SaaS products and established brands."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With this diversity of products, we live in a world where users are fluent in multiple software products. And with that, they now have higher expectations for what a functional software product looks like today. This can be true even in the early stages of startup products, at pre-seed or seed stages, depending on your product and team. As your startup matures, passing through Series A onwards, the expectations for quality only increase."}]},{"type":"element","tag":"h2","props":{"id":"how-does-software-quality-affect-investment-decisions"},"children":[{"type":"text","value":"How does Software Quality Affect Investment Decisions?"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our survey identified many types of startups that would significantly benefit from additional software QA. Investors use various questions to assess software quality requirements, such as:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"How technical of a product is it/is the product deep tech?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is this an infrastructure product?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is the product expected to integrate with multiple other tools?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Does the product function as middleware between other sets of tools?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"How tolerant are customers of product failure?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Are the customers technically savvy?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Is the product responsible for Personally Identifiable Information (PII)?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"What kind of regulatory environment does the product live in?"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Are there any legal or financial risks if the product fails or behaves erratically?"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Ultimately, they are probing one fundamental question during due diligence:"}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"What are the risks when the product fails?"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This is crucial because VCs are performing risk analysis on future software products while also assessing their market potential. If a product could be responsible for breaking a supply chain, crashing other software products due to downtime, enable fraud with stolen PII, pose security risks, or deterring non-technical users away from their product, this product will face extra scrutiny during due diligence."}]},{"type":"element","tag":"h3","props":{"id":"common-red-flags-during-vcs-due-diligence"},"children":[{"type":"text","value":"Common red flags during VC’s due diligence"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our survey found several common red flags VCs look for during their due diligence process. These included not having a technical member on the founding team, usability and reliability issues, having a product that cannot scale with its current tech, and having a product with security vulnerabilities or other critical bugs. These red flags are particularly concerning for VCs if the product is deep tech or carries significant liabilities. Addressing these risks is vital for securing your next round of funding."}]},{"type":"element","tag":"h4","props":{"id":"usability-issues"},"children":[{"type":"text","value":"Usability issues­"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Usability problems were frequently mentioned red flags in our survey. Investors mentioned how clunky interfaces or poorly designed workflows often deterred them from investing in companies. Ensuring your software is user-friendly and intuitive is crucial to improving your investment prospects in this highly competitive environment."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Have you considered how often users may be multitasking while using your software? This is essential for many products because there's a good chance a non-technical person will be using your product. I can't tell you the number of times I've been in a doctor's office, bank, financial aid office, etc. where someone I speak with is using some kind of software while talking to me. If a simple mistake could create catastrophe for some customer, you need to invest time and effort into polishing your product's workflow."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Furthermore, you may be developing a product for non-technical users. These are people who would not be using your software unless it saved them a considerable amount of time. How patient do you think Joe the plumber will be when his dispatching software has awkward controls? This is true in several industries where users are much less tolerant of software problems."}]},{"type":"element","tag":"h4","props":{"id":"architectural-missteps-and-scaling-challenges"},"children":[{"type":"text","value":"Architectural missteps and scaling challenges"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another red flag commonly mentioned by VCs were scaling issues. When raising capital your company will be expected to scale your number of customers. If your product requires a complete rewrite because you can't support enough customers or because of reliability issues, then you’ll likely be passed for investment. These problems create risks like"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Having a competitor come and scoop up your customers because of a superior product."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Customers litigating because you have legal or fiduciary responsibilities."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Dealing with reputational issues which will likely hamper future growth."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"These risks are substantial deterrents for investors and will likely lead them to pass up investing in your startup. I've spoken with investors who have declined investing in companies because technical due diligence failing. This was even the case when the company passed every other metric used during diligence with flying colors. This was undoubtedly disappointing for the founders, but could have been avoided with more focus on their underlying technology."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The one counterexample to this is when you're building a product prototype while identifying product-market fit. This exception is short-lived, and any startup should transition out as quickly as possible. You may have heard stories of founders successfully exiting with a product built using some no-code tool (like Bubble), but you should ensure such a tech decision is viable within your market. Also, you should have a plan for migrating off of such a platform so you can take control of your own tech."}]},{"type":"element","tag":"h4","props":{"id":"security-vulnerabilities-and-critical-bugs"},"children":[{"type":"text","value":"Security vulnerabilities and critical bugs"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Security issues were another prevalent red flag highlighted by survey participants. Many shared experiences of startups being rejected because of security concerns. This is a significant red flag for any company offering cybersecurity software, managing PII or financial data, or handling financial transactions. We've heard of companies trying to raise money that had bugs in their custom trading system that accidentally reversed positions for trades. Imagine shorting a stock and then having your position reversed by the trading platform to a put!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Another story involved a cybersecurity company seeking funding. During due diligence, an analyst found numerous security vulnerabilities in their platform and managed to bypass their authentication into the admin dashboard. There the analyst left messages behind for the founders, leading to an embarrassing rejection from the VC."}]},{"type":"element","tag":"h3","props":{"id":"vc-expectations-at-pre-seed-and-seed-rounds"},"children":[{"type":"text","value":"VC expectations at pre-seed and seed rounds"}]},{"type":"element","tag":"quote","props":{":titles":"{\"titles\":[{\"title\": \"VC Investor\", \"link\": \"https://www.linkedin.com/in/frederic-gray-iv-637bba11\"}]}","image":"/img/white-papers/frederic-headshot.png","name":"Frederic Gray"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Expectations for software quality are stage-specific. Earlier products should be simplistic, to learn customer needs, to drive future product iterations. Later products, Series A onwards, are held to a higher standard. That said, all these expectations are vertical-specific."}]}]},{"type":"element","tag":"h4","props":{"id":"feedback-from-non-technical-investors"},"children":[{"type":"text","value":"Feedback from non-technical investors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In our discussions with investors, we found a range of responses regarding software quality in early-stage products at the pre-seed and seed stages of investment. The more non-technical investors we surveyed primarily focus their due diligence on"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Market potential."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"KPIs such as churn rate, CAC, MRR, etc."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"at these rounds. The main exceptions were deep tech products, products responsible for PII, or products with legal responsibilities. In these cases they would rely on tech consultants as part of their due diligence. Also, products in verticals requiring higher product quality faced additional scrutiny. In all these scenarios the bar is significantly higher, and founders should plan accordingly before seeking investments. In these cases investing in software quality is a major green flag for investors."}]},{"type":"element","tag":"h4","props":{"id":"feedback-from-technical-investors"},"children":[{"type":"text","value":"Feedback from technical investors"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For technical investors, we received a range of answers. Many expected higher quality products and were more likely to dive deeper into the underlying tech used. Some green flags mentioned were"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Excellent architectural decisions for the software."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"A solid implementation roadmap, even if all features weren't yet available."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Adherence to best practices for software development, such as using agile management or Scrum."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"A solid foundation for scaling the product."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"High-quality API design and solid developer documentation."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The only reservations mentioned were founders who overengineered their product before fundraising. This could mean prematurely scaling a product without validating product-market fit, writing excessive tests for features that don't need them, and creating an inflexible infrastructure that doesn’t accomidate product changes. If you're in the early stages product development, there are many pitfalls for over-engineering. However, if product-market fit has been validated, then excellent software quality is highly rewarded."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"One notable example of this is Stripe "},{"type":"element","tag":"a","props":{"href":"#references"},"children":[{"type":"text","value":"Stripe"}]},{"type":"text","value":". When the company launched its first product, they were late to market with several competing payment platforms boasting large user bases. The key to Stripe's success was its excellent API design and high-quality infrastructure. Their product quality enabled them to secure funding successfully and continue to be an extremely successful company today."}]},{"type":"element","tag":"h3","props":{"id":"vc-expectations-at-series-a-and-beyond"},"children":[{"type":"text","value":"VC expectations at Series A and beyond"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our surveys generally indicated that post-Series A, the bar for software quality significantly rises. At this stage you should be following best practices for software quality in your development process. This includes:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Automated testing for core features and workflows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Best practices for testing new features and using regression testing to prevent recurring bugs."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Following standard development methodologies such as agile, Scrum, etc."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Having testing infrastructure in place along with Continuous Integration (CI) and Continuous Deployment (CD)."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Documenting software architecture, main technical decisions, and any other relevant material."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Regular customer interaction to find pain points and other issues."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"At this stage, investors will substantially increase their scrutiny for any future series of investments. There is significantly less tolerance for failure, and investors will be looking for robust infrastructure in place."}]},{"type":"element","tag":"h2","props":{"id":"where-non-technical-founders-fall-short"},"children":[{"type":"text","value":"Where non-technical founders fall short"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The primary challenge non-technical founders face is exactly what's in their name: their lack of technical skills. If you, a non-technical founder, spend time learning about the core technical problems your startup faces in the future, investors will likely see this as a green flag. We've had investors tell us many non-technical founders value their ideas but don't understand the complexities of software, and hence cannot value the underlying technology. Some of these technical complexities include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding how scalability impacts future growth."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Learning about the limitations of no-code platforms and how they are primarly for prototypes."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Educating yourself about the software development life cycle (SDLC)."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding what software QA encompasses and how it looks in successful startups."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You should ideally be prepared with a host of questions so you can build a bridge with your future technical co-founder. Without this bridge, you will be flying blind, creating unwanted risks for investors. It is paramount to have someone technical on your team as soon as possible; most VCs we've spoken with will refuse to invest in teams lacking this expertise."}]},{"type":"element","tag":"h3","props":{"id":"enhance-your-product-with-qacomet"},"children":[{"type":"text","value":"Enhance your product with QAComet"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet offers a wide variety of services to help you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Identifying and resolving usability issues."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Resolve usability problems in your no-code proptype."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Understanding technical content, providing support, and answering questions."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Conducting customer interviews for identifying customer pain points."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Establishing development workflows following Agile methodology."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Build a core testing suite when your business is ready for this acceleration."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can "},{"type":"element","tag":"a","props":{"href":"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call","rel":["nofollow"]},"children":[{"type":"text","value":"schedule a free call today"}]},{"type":"text","value":" for a free 15-minute consultation to discuss your product's QA. We also offer a $50 two-week trial for early customers; ask us about it during our free consultation."}]},{"type":"element","tag":"h2","props":{"id":"challenges-for-technical-founders"},"children":[{"type":"text","value":"Challenges for technical founders"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Our VC survey participants noted some common issues technical founders face when developing their products. These include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Overbuilding and creating overengineered solutions."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Failing to identify the most crucial features and leaving the rest as part of the product roadmap."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Not engaging with customers and identifying their problems."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Not finding product-market fit quickly enough."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Each of these points requires a distinct mindset typically found among technical founders and can largely be fixed by communicating with customers within your market. Our survey revealed that it's more important to have solid implementations with partial feature support than to rattle off poorly implemented features."}]},{"type":"element","tag":"h3","props":{"id":"how-qacomet-helps-your-journey"},"children":[{"type":"text","value":"How QAComet helps your journey"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"QAComet offers a wide variety of services, helping you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Identifying usability issues and potential pain points."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Conducting customer interviews and pinpointing their problems and feature requirements."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Documenting core technical aspects, architectural decisions, and workflows."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Writing E2E, integration and unit tests."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Integrating automated tests with CI and building out CI pipelines."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Establishing your QA strategy as part of your Agile SDLC."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You can "},{"type":"element","tag":"a","props":{"href":"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call","rel":["nofollow"]},"children":[{"type":"text","value":"schedule a free call today"}]},{"type":"text","value":" for a free 15-minute consultation to talk about your product's QA. In addition, we offer a $50 two-week trial for early customers; ask us about it during our free consultation."}]},{"type":"element","tag":"h2","props":{"id":"take-your-startup-to-the-next-level"},"children":[{"type":"text","value":"Take your startup to the next level"}]},{"type":"element","tag":"quote","props":{":titles":"{\"titles\":[{\"title\": \"VC Partner\", \"link\": \"https://www.thinkklabs.com/\"}, {\"title\":\"4x Founder\", \"link\": \"https://www.linkedin.com/in/yianni-kellis/\"}]}","image":"/img/white-papers/yianni-headshot.png","name":"Yianni Kellis"},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Startups that have a clear emphasis on quality software development and thorough QA processes often secure funding more smoothly. These companies don't necessarily need large in-house QA teams but must demonstrate a strategic approach to maintaining software quality, possibly through fractional QA services."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The key takeaway from our survey is that expectations for product quality are here to stay. In our current startup environment, VCs expects more from founders due to the increase in quality tooling and heightened market expectations for usable products. It's paramount for both technical and non-technical founders to learn from their customers, build a solid user experience, and make sure their product meets customer expectations. Today, we live with higher expectations from customers and VCs alike, and startups must adapt to this evolving market."}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[CNET] "},{"type":"element","tag":"a","props":{"href":"https://www.cnet.com/tech/mobile/zuckerberg-move-fast-and-break-things-isnt-how-we-operate-anymore/","rel":["nofollow"]},"children":[{"type":"text","value":"Zuckerberg: 'Move fast and break things' isn't how Facebook operates anymore"}]},{"type":"text","value":". CNET.com."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[HBR] "},{"type":"element","tag":"a","props":{"href":"https://hbr.org/2019/01/the-era-of-move-fast-and-break-things-is-over","rel":["nofollow"]},"children":[{"type":"text","value":"The Era of “Move Fast and Break Things” Is Over"}]},{"type":"text","value":". Harvard Business Review."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Notion] "},{"type":"element","tag":"a","props":{"href":"https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/","rel":["nofollow"]},"children":[{"type":"text","value":"Design on a deadline: How Notion pulled itself back from the brink of failure"}]},{"type":"text","value":". Figma Blog."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Statista] "},{"type":"element","tag":"a","props":{"href":"https://www.statista.com/statistics/277501/venture-capital-amount-invested-in-the-united-states-since-1995/","rel":["nofollow"]},"children":[{"type":"text","value":"Value of venture capital investment in the United States from 2006 to 2022"}]},{"type":"text","value":". Statista.com."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Stripe] "},{"type":"element","tag":"a","props":{"href":"https://www.inc.com/jason-aten/the-5-simple-reasons-stripe-became-most-valuable-startup-ever.html","rel":["nofollow"]},"children":[{"type":"text","value":"The 5 Simple Reasons Stripe Became the Most Valuable Startup Ever"}]},{"type":"text","value":". Inc."}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"[Techcrunch] "},{"type":"element","tag":"a","props":{"href":"https://techcrunch.com/2024/01/10/venture-capital-2023-analysis/","rel":["nofollow"]},"children":[{"type":"text","value":"Explained in 5 charts: Venture capital in 2023"}]},{"type":"text","value":". Techcrunch."}]}]},{"type":"element","tag":"h3","props":{"id":"additional-resources"},"children":[{"type":"text","value":"Additional Resources"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://books.google.com/books?id=XLxUBQAAQBAJ","rel":["nofollow"]},"children":[{"type":"text","value":"Learning Agile: Understanding Scrum, XP, Lean, and Kanban"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468/","rel":["nofollow"]},"children":[{"type":"text","value":"Agile Testing: A Practical Guide for Testers and Agile Teams"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.scrum.org/resources/blog/yds-where-does-quality-assurance-qa-fit-scrum-team","rel":["nofollow"]},"children":[{"type":"text","value":"YDS: Where Does Quality Assurance (QA) Fit on a Scrum Team?"}]}]}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"introduction","depth":2,"text":"Introduction"},{"id":"evolution-of-the-startup-investment-landscape","depth":2,"text":"Evolution of the startup investment landscape"},{"id":"how-does-software-quality-affect-investment-decisions","depth":2,"text":"How does Software Quality Affect Investment Decisions?","children":[{"id":"common-red-flags-during-vcs-due-diligence","depth":3,"text":"Common red flags during VC’s due diligence"},{"id":"vc-expectations-at-pre-seed-and-seed-rounds","depth":3,"text":"VC expectations at pre-seed and seed rounds"},{"id":"vc-expectations-at-series-a-and-beyond","depth":3,"text":"VC expectations at Series A and beyond"}]},{"id":"where-non-technical-founders-fall-short","depth":2,"text":"Where non-technical founders fall short","children":[{"id":"enhance-your-product-with-qacomet","depth":3,"text":"Enhance your product with QAComet"}]},{"id":"challenges-for-technical-founders","depth":2,"text":"Challenges for technical founders","children":[{"id":"how-qacomet-helps-your-journey","depth":3,"text":"How QAComet helps your journey"}]},{"id":"take-your-startup-to-the-next-level","depth":2,"text":"Take your startup to the next level"},{"id":"references","depth":2,"text":"References","children":[{"id":"additional-resources","depth":3,"text":"Additional Resources"}]}]}},"_type":"markdown","_id":"content:white-papers:how-qa-factors-into-vc-due-diligence.md","_source":"content","_file":"white-papers/how-qa-factors-into-vc-due-diligence.md","_extension":"md"} \ No newline at end of file diff --git a/api/_content/query/VlbRDfyd5U.1714258600178.json b/api/_content/query/VlbRDfyd5U.1717143045798.json similarity index 100% rename from api/_content/query/VlbRDfyd5U.1714258600178.json rename to api/_content/query/VlbRDfyd5U.1717143045798.json diff --git a/api/_content/query/c1NuIkbLFt.1714258600178.json b/api/_content/query/c1NuIkbLFt.1717143045798.json similarity index 100% rename from api/_content/query/c1NuIkbLFt.1714258600178.json rename to api/_content/query/c1NuIkbLFt.1717143045798.json diff --git a/api/_content/query/jaZDQs2Nrb.1714258600178.json b/api/_content/query/jaZDQs2Nrb.1717143045798.json similarity index 100% rename from api/_content/query/jaZDQs2Nrb.1714258600178.json rename to api/_content/query/jaZDQs2Nrb.1717143045798.json diff --git a/api/_content/query/muguO0VHIr.1714258600178.json b/api/_content/query/muguO0VHIr.1717143045798.json similarity index 100% rename from api/_content/query/muguO0VHIr.1714258600178.json rename to api/_content/query/muguO0VHIr.1717143045798.json diff --git a/api/_content/query/x1MOVa2EhJ.1714258600178.json b/api/_content/query/x1MOVa2EhJ.1717143045798.json similarity index 100% rename from api/_content/query/x1MOVa2EhJ.1714258600178.json rename to api/_content/query/x1MOVa2EhJ.1717143045798.json diff --git a/case-studies/_payload.json b/case-studies/_payload.json index 5d510b3..17cd1c3 100644 --- a/case-studies/_payload.json +++ b/case-studies/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":13},["Reactive",2],{"case-studies":3},[4],{"title":5,"link":6,"created":7,"shortDescription":12},"Automatisch","/case-studies/automatisch",{"string":8,"month":9,"day":10,"year":11},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",1714258642186] \ No newline at end of file +[{"data":1,"prerenderedAt":13},["Reactive",2],{"case-studies":3},[4],{"title":5,"link":6,"created":7,"shortDescription":12},"Automatisch","/case-studies/automatisch",{"string":8,"month":9,"day":10,"year":11},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",1717143074714] \ No newline at end of file diff --git a/case-studies/automatisch/_payload.json b/case-studies/automatisch/_payload.json index 6fae2d2..58b299e 100644 --- a/case-studies/automatisch/_payload.json +++ b/case-studies/automatisch/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":336},["Reactive",2],{"blog-post-/case-studies/automatisch":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"subtitle":10,"breadcrumbs":11,"link":4,"created":17,"shortDescription":22,"body":23,"_type":331,"_id":332,"_source":333,"_file":334,"_extension":335},"/case-studies/automatisch","case-studies",false,"","Automatisch","W","Going from the launch pad to the cosmos with E2E testing",[12,15],{"name":13,"path":14},"Case Studies","/case-studies/",{"name":8,"path":16},"/case-studies/automatisch/",{"string":18,"month":19,"day":20,"year":21},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",{"type":24,"children":25,"toc":314},"root",[26,35,51,57,76,82,89,94,130,135,141,156,171,186,201,207,212,218,232,238,243,248,253,258,271,277,282,287,292,298,303,309],{"type":27,"tag":28,"props":29,"children":31},"element","h2",{"id":30},"improving-software-quality-and-testing-infrastructure-for-automatisch",[32],{"type":33,"value":34},"text","Improving Software Quality and Testing Infrastructure for Automatisch",{"type":27,"tag":36,"props":37,"children":38},"p",{},[39,41,49],{"type":33,"value":40},"We recently collaborated with an open source no-code automation company called ",{"type":27,"tag":42,"props":43,"children":47},"a",{"href":44,"rel":45},"https://automatisch.io",[46],"nofollow",[48],{"type":33,"value":8},{"type":33,"value":50}," and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.",{"type":27,"tag":28,"props":52,"children":54},{"id":53},"automatisch-the-open-source-zapier-alternative",[55],{"type":33,"value":56},"Automatisch: The Open Source Zapier Alternative",{"type":27,"tag":36,"props":58,"children":59},{},[60,65,67,74],{"type":27,"tag":42,"props":61,"children":63},{"href":44,"rel":62},[46],[64],{"type":33,"value":8},{"type":33,"value":66}," is a reputable ",{"type":27,"tag":42,"props":68,"children":71},{"href":69,"rel":70},"https://github.com/automatisch/automatisch",[46],[72],{"type":33,"value":73},"open source",{"type":33,"value":75}," software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.",{"type":27,"tag":28,"props":77,"children":79},{"id":78},"proactive-bug-finding-and-reporting",[80],{"type":33,"value":81},"Proactive Bug Finding and Reporting",{"type":27,"tag":83,"props":84,"children":86},"h3",{"id":85},"our-approach-to-reporting-bugs",[87],{"type":33,"value":88},"Our approach to reporting bugs",{"type":27,"tag":36,"props":90,"children":91},{},[92],{"type":33,"value":93},"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections",{"type":27,"tag":95,"props":96,"children":97},"ul",{},[98,110,120],{"type":27,"tag":99,"props":100,"children":101},"li",{},[102,108],{"type":27,"tag":103,"props":104,"children":105},"strong",{},[106],{"type":33,"value":107},"Overview",{"type":33,"value":109},": A Quick overview of the bug found, which generally includes an image",{"type":27,"tag":99,"props":111,"children":112},{},[113,118],{"type":27,"tag":103,"props":114,"children":115},{},[116],{"type":33,"value":117},"Reproduction",{"type":33,"value":119},": Detailed list of instructions for reproducing the bug",{"type":27,"tag":99,"props":121,"children":122},{},[123,128],{"type":27,"tag":103,"props":124,"children":125},{},[126],{"type":33,"value":127},"Improvements",{"type":33,"value":129},": Suggestions for how to resolve the bug and improve the software",{"type":27,"tag":36,"props":131,"children":132},{},[133],{"type":33,"value":134},"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.",{"type":27,"tag":83,"props":136,"children":138},{"id":137},"some-bugs-we-found",[139],{"type":33,"value":140},"Some Bugs We Found",{"type":27,"tag":36,"props":142,"children":143},{},[144,154],{"type":27,"tag":103,"props":145,"children":146},{},[147],{"type":27,"tag":42,"props":148,"children":151},{"href":149,"rel":150},"https://github.com/automatisch/automatisch/issues/1371",[46],[152],{"type":33,"value":153},"Recreating deleted users",{"type":33,"value":155},": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.",{"type":27,"tag":36,"props":157,"children":158},{},[159,169],{"type":27,"tag":103,"props":160,"children":161},{},[162],{"type":27,"tag":42,"props":163,"children":166},{"href":164,"rel":165},"https://github.com/automatisch/automatisch/issues/1370",[46],[167],{"type":33,"value":168},"Inconsistent interface conveying permissions",{"type":33,"value":170},": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could",{"type":27,"tag":36,"props":172,"children":173},{},[174,184],{"type":27,"tag":103,"props":175,"children":176},{},[177],{"type":27,"tag":42,"props":178,"children":181},{"href":179,"rel":180},"https://github.com/automatisch/automatisch/issues/1366",[46],[182],{"type":33,"value":183},"Deleting roles edge case",{"type":33,"value":185},": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.",{"type":27,"tag":36,"props":187,"children":188},{},[189,199],{"type":27,"tag":103,"props":190,"children":191},{},[192],{"type":27,"tag":42,"props":193,"children":196},{"href":194,"rel":195},"https://github.com/automatisch/automatisch/issues/1235",[46],[197],{"type":33,"value":198},"Invalidating GitHub OAuth error",{"type":33,"value":200},": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.",{"type":27,"tag":28,"props":202,"children":204},{"id":203},"dive-into-testing",[205],{"type":33,"value":206},"Dive into Testing",{"type":27,"tag":36,"props":208,"children":209},{},[210],{"type":33,"value":211},"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.",{"type":27,"tag":83,"props":213,"children":215},{"id":214},"refactoring-workflow-tests",[216],{"type":33,"value":217},"Refactoring Workflow Tests",{"type":27,"tag":36,"props":219,"children":220},{},[221,223,230],{"type":33,"value":222},"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's ",{"type":27,"tag":224,"props":225,"children":227},"code",{"className":226},[],[228],{"type":33,"value":229},"test.step",{"type":33,"value":231}," interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.",{"type":27,"tag":83,"props":233,"children":235},{"id":234},"user-management",[236],{"type":33,"value":237},"User Management",{"type":27,"tag":36,"props":239,"children":240},{},[241],{"type":33,"value":242},"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.",{"type":27,"tag":36,"props":244,"children":245},{},[246],{"type":33,"value":247},"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username.",{"type":27,"tag":36,"props":249,"children":250},{},[251],{"type":33,"value":252},"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.",{"type":27,"tag":36,"props":254,"children":255},{},[256],{"type":33,"value":257},"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.",{"type":27,"tag":36,"props":259,"children":260},{},[261,263,269],{"type":33,"value":262},"We overcame these challenges by upgrading the library used so we could put ",{"type":27,"tag":224,"props":264,"children":266},{"className":265},[],[267],{"type":33,"value":268},"data-",{"type":33,"value":270}," props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.",{"type":27,"tag":83,"props":272,"children":274},{"id":273},"role-management",[275],{"type":33,"value":276},"Role Management",{"type":27,"tag":36,"props":278,"children":279},{},[280],{"type":33,"value":281},"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.",{"type":27,"tag":36,"props":283,"children":284},{},[285],{"type":33,"value":286},"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.",{"type":27,"tag":36,"props":288,"children":289},{},[290],{"type":33,"value":291},"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.",{"type":27,"tag":28,"props":293,"children":295},{"id":294},"ci-pipeline-enhancements",[296],{"type":33,"value":297},"CI Pipeline Enhancements",{"type":27,"tag":36,"props":299,"children":300},{},[301],{"type":33,"value":302},"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.",{"type":27,"tag":28,"props":304,"children":306},{"id":305},"tangible-value",[307],{"type":33,"value":308},"Tangible Value",{"type":27,"tag":36,"props":310,"children":311},{},[312],{"type":33,"value":313},"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.",{"title":7,"searchDepth":315,"depth":315,"links":316},2,[317,318,319,324,329,330],{"id":30,"depth":315,"text":34},{"id":53,"depth":315,"text":56},{"id":78,"depth":315,"text":81,"children":320},[321,323],{"id":85,"depth":322,"text":88},3,{"id":137,"depth":322,"text":140},{"id":203,"depth":315,"text":206,"children":325},[326,327,328],{"id":214,"depth":322,"text":217},{"id":234,"depth":322,"text":237},{"id":273,"depth":322,"text":276},{"id":294,"depth":315,"text":297},{"id":305,"depth":315,"text":308},"markdown","content:case-studies:automatisch.md","content","case-studies/automatisch.md","md",1714258649729] \ No newline at end of file +[{"data":1,"prerenderedAt":335},["Reactive",2],{"blog-post-/case-studies/automatisch":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":7,"subtitle":9,"breadcrumbs":10,"link":4,"created":16,"shortDescription":21,"body":22,"_type":330,"_id":331,"_source":332,"_file":333,"_extension":334},"/case-studies/automatisch","case-studies",false,"","Automatisch","Going from the launch pad to the cosmos with E2E testing",[11,14],{"name":12,"path":13},"Case Studies","/case-studies/",{"name":8,"path":15},"/case-studies/automatisch/",{"string":17,"month":18,"day":19,"year":20},"February 26, 2024","Feb",26,2024,"We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase.",{"type":23,"children":24,"toc":313},"root",[25,34,50,56,75,81,88,93,129,134,140,155,170,185,200,206,211,217,231,237,242,247,252,257,270,276,281,286,291,297,302,308],{"type":26,"tag":27,"props":28,"children":30},"element","h2",{"id":29},"improving-software-quality-and-testing-infrastructure-for-automatisch",[31],{"type":32,"value":33},"text","Improving Software Quality and Testing Infrastructure for Automatisch",{"type":26,"tag":35,"props":36,"children":37},"p",{},[38,40,48],{"type":32,"value":39},"We recently collaborated with an open source no-code automation company called ",{"type":26,"tag":41,"props":42,"children":46},"a",{"href":43,"rel":44},"https://automatisch.io",[45],"nofollow",[47],{"type":32,"value":8},{"type":32,"value":49}," and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.",{"type":26,"tag":27,"props":51,"children":53},{"id":52},"automatisch-the-open-source-zapier-alternative",[54],{"type":32,"value":55},"Automatisch: The Open Source Zapier Alternative",{"type":26,"tag":35,"props":57,"children":58},{},[59,64,66,73],{"type":26,"tag":41,"props":60,"children":62},{"href":43,"rel":61},[45],[63],{"type":32,"value":8},{"type":32,"value":65}," is a reputable ",{"type":26,"tag":41,"props":67,"children":70},{"href":68,"rel":69},"https://github.com/automatisch/automatisch",[45],[71],{"type":32,"value":72},"open source",{"type":32,"value":74}," software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.",{"type":26,"tag":27,"props":76,"children":78},{"id":77},"proactive-bug-finding-and-reporting",[79],{"type":32,"value":80},"Proactive Bug Finding and Reporting",{"type":26,"tag":82,"props":83,"children":85},"h3",{"id":84},"our-approach-to-reporting-bugs",[86],{"type":32,"value":87},"Our approach to reporting bugs",{"type":26,"tag":35,"props":89,"children":90},{},[91],{"type":32,"value":92},"While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections",{"type":26,"tag":94,"props":95,"children":96},"ul",{},[97,109,119],{"type":26,"tag":98,"props":99,"children":100},"li",{},[101,107],{"type":26,"tag":102,"props":103,"children":104},"strong",{},[105],{"type":32,"value":106},"Overview",{"type":32,"value":108},": A Quick overview of the bug found, which generally includes an image",{"type":26,"tag":98,"props":110,"children":111},{},[112,117],{"type":26,"tag":102,"props":113,"children":114},{},[115],{"type":32,"value":116},"Reproduction",{"type":32,"value":118},": Detailed list of instructions for reproducing the bug",{"type":26,"tag":98,"props":120,"children":121},{},[122,127],{"type":26,"tag":102,"props":123,"children":124},{},[125],{"type":32,"value":126},"Improvements",{"type":32,"value":128},": Suggestions for how to resolve the bug and improve the software",{"type":26,"tag":35,"props":130,"children":131},{},[132],{"type":32,"value":133},"Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.",{"type":26,"tag":82,"props":135,"children":137},{"id":136},"some-bugs-we-found",[138],{"type":32,"value":139},"Some Bugs We Found",{"type":26,"tag":35,"props":141,"children":142},{},[143,153],{"type":26,"tag":102,"props":144,"children":145},{},[146],{"type":26,"tag":41,"props":147,"children":150},{"href":148,"rel":149},"https://github.com/automatisch/automatisch/issues/1371",[45],[151],{"type":32,"value":152},"Recreating deleted users",{"type":32,"value":154},": If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.",{"type":26,"tag":35,"props":156,"children":157},{},[158,168],{"type":26,"tag":102,"props":159,"children":160},{},[161],{"type":26,"tag":41,"props":162,"children":165},{"href":163,"rel":164},"https://github.com/automatisch/automatisch/issues/1370",[45],[166],{"type":32,"value":167},"Inconsistent interface conveying permissions",{"type":32,"value":169},": If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could",{"type":26,"tag":35,"props":171,"children":172},{},[173,183],{"type":26,"tag":102,"props":174,"children":175},{},[176],{"type":26,"tag":41,"props":177,"children":180},{"href":178,"rel":179},"https://github.com/automatisch/automatisch/issues/1366",[45],[181],{"type":32,"value":182},"Deleting roles edge case",{"type":32,"value":184},": If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.",{"type":26,"tag":35,"props":186,"children":187},{},[188,198],{"type":26,"tag":102,"props":189,"children":190},{},[191],{"type":26,"tag":41,"props":192,"children":195},{"href":193,"rel":194},"https://github.com/automatisch/automatisch/issues/1235",[45],[196],{"type":32,"value":197},"Invalidating GitHub OAuth error",{"type":32,"value":199},": If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.",{"type":26,"tag":27,"props":201,"children":203},{"id":202},"dive-into-testing",[204],{"type":32,"value":205},"Dive into Testing",{"type":26,"tag":35,"props":207,"children":208},{},[209],{"type":32,"value":210},"Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.",{"type":26,"tag":82,"props":212,"children":214},{"id":213},"refactoring-workflow-tests",[215],{"type":32,"value":216},"Refactoring Workflow Tests",{"type":26,"tag":35,"props":218,"children":219},{},[220,222,229],{"type":32,"value":221},"The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's ",{"type":26,"tag":223,"props":224,"children":226},"code",{"className":225},[],[227],{"type":32,"value":228},"test.step",{"type":32,"value":230}," interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.",{"type":26,"tag":82,"props":232,"children":234},{"id":233},"user-management",[235],{"type":32,"value":236},"User Management",{"type":26,"tag":35,"props":238,"children":239},{},[240],{"type":32,"value":241},"After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.",{"type":26,"tag":35,"props":243,"children":244},{},[245],{"type":32,"value":246},"Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior.\nNote that when a user accesses Automatisch, they must provide their email address as a username.",{"type":26,"tag":35,"props":248,"children":249},{},[250],{"type":32,"value":251},"We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.",{"type":26,"tag":35,"props":253,"children":254},{},[255],{"type":32,"value":256},"One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.",{"type":26,"tag":35,"props":258,"children":259},{},[260,262,268],{"type":32,"value":261},"We overcame these challenges by upgrading the library used so we could put ",{"type":26,"tag":223,"props":263,"children":265},{"className":264},[],[266],{"type":32,"value":267},"data-",{"type":32,"value":269}," props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.",{"type":26,"tag":82,"props":271,"children":273},{"id":272},"role-management",[274],{"type":32,"value":275},"Role Management",{"type":26,"tag":35,"props":277,"children":278},{},[279],{"type":32,"value":280},"Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.",{"type":26,"tag":35,"props":282,"children":283},{},[284],{"type":32,"value":285},"We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.",{"type":26,"tag":35,"props":287,"children":288},{},[289],{"type":32,"value":290},"In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.",{"type":26,"tag":27,"props":292,"children":294},{"id":293},"ci-pipeline-enhancements",[295],{"type":32,"value":296},"CI Pipeline Enhancements",{"type":26,"tag":35,"props":298,"children":299},{},[300],{"type":32,"value":301},"Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.",{"type":26,"tag":27,"props":303,"children":305},{"id":304},"tangible-value",[306],{"type":32,"value":307},"Tangible Value",{"type":26,"tag":35,"props":309,"children":310},{},[311],{"type":32,"value":312},"Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.",{"title":7,"searchDepth":314,"depth":314,"links":315},2,[316,317,318,323,328,329],{"id":29,"depth":314,"text":33},{"id":52,"depth":314,"text":55},{"id":77,"depth":314,"text":80,"children":319},[320,322],{"id":84,"depth":321,"text":87},3,{"id":136,"depth":321,"text":139},{"id":202,"depth":314,"text":205,"children":324},[325,326,327],{"id":213,"depth":321,"text":216},{"id":233,"depth":321,"text":236},{"id":272,"depth":321,"text":275},{"id":293,"depth":314,"text":296},{"id":304,"depth":314,"text":307},"markdown","content:case-studies:automatisch.md","content","case-studies/automatisch.md","md",1717143083173] \ No newline at end of file diff --git a/case-studies/automatisch/index.html b/case-studies/automatisch/index.html index faee8b2..a391df2 100644 --- a/case-studies/automatisch/index.html +++ b/case-studies/automatisch/index.html @@ -22,40 +22,41 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Automatisch

Going from the launch pad to the cosmos with E2E testing

February 26, 2024

Improving Software Quality and Testing Infrastructure for Automatisch

We recently collaborated with an open source no-code automation company called Automatisch and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.

Automatisch: The Open Source Zapier Alternative

Automatisch is a reputable open source software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.

Proactive Bug Finding and Reporting

Our approach to reporting bugs

While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections

  • Overview: A Quick overview of the bug found, which generally includes an image
  • Reproduction: Detailed list of instructions for reproducing the bug
  • Improvements: Suggestions for how to resolve the bug and improve the software

Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.

Some Bugs We Found

Recreating deleted users: If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.

Inconsistent interface conveying permissions: If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could

Deleting roles edge case: If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.

Invalidating GitHub OAuth error: If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.

Dive into Testing

Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.

Refactoring Workflow Tests

The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's test.step interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.

User Management

After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.

Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior. -Note that when a user accesses Automatisch, they must provide their email address as a username.

We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.

One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.

We overcame these challenges by upgrading the library used so we could put data- props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.

Role Management

Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.

We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.

In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.

CI Pipeline Enhancements

Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.

Tangible Value

Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.

I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product.Ali B.
- \ No newline at end of file + +

Automatisch

Going from the launch pad to the cosmos with E2E testing

February 26, 2024

Improving Software Quality and Testing Infrastructure for Automatisch

We recently collaborated with an open source no-code automation company called Automatisch and helped them both improve their product with our numerous QA services. This includes implementing automated tests, bug finding and reporting, and enhancing their continuous integration (CI) pipeline to support both community and enterprise editions.

Automatisch: The Open Source Zapier Alternative

Automatisch is a reputable open source software integration platform providing an alternative to Zapier. It is built with a variety of node JS libraries, including ReactJS and expressJS. Upon starting our collaboration, their product already had several dozen integrations with other platforms, and were in progress building many more. The key quality assurance (QA) requirements included discovering and documenting bugs, developing automated smoke tests using playwright, and ensuring the CI pipeline works flawlessly for both community and enterprise editions.

Proactive Bug Finding and Reporting

Our approach to reporting bugs

While working through our testing of Automatisch's platform, we discovered bugs covering a wide span of cases. All of our bug reports included three sections

  • Overview: A Quick overview of the bug found, which generally includes an image
  • Reproduction: Detailed list of instructions for reproducing the bug
  • Improvements: Suggestions for how to resolve the bug and improve the software

Using this format makes it clear for future developers where they can find the source of the problem and resolve the ticket.

Some Bugs We Found

Recreating deleted users: If an admin deleted a user they manage, and then attempted to re-create that user with the same email address, they were met with not only an opaque error message, but also did not have a way to recover the user's old account.

Inconsistent interface conveying permissions: If a user does not have permissions to create a connection to a platform integrated into Automatisch, there was inconsistent behavior in the interface depending on the page they accessed. For example, the user could

Deleting roles edge case: If a only a deleted user has a role attached to them, the admin is not able to delete the role after the user has been deleted.

Invalidating GitHub OAuth error: If a user invalidates the oauth token used by Automatisch, there is not a useful error reported, only a generic error message which could imdicate many different problems.

Dive into Testing

Upon starting out work with Automatisch, we dove into a codebase already containing tests for some of the features their SaaS provides. One of the first tasks we worked on was refactoring one of the main smoke tests into one which followed best practices in Playwright.

Refactoring Workflow Tests

The central workflow configuration interface in Automatisch is their bread and butter: this is where users go to configure their custom integrations between the various supported platforms. The set of tests for this part of the codebase included some large multi-part test cases which needed to be run sequentially. We refactored this set of code using Playwright's test.step interface, which makes it easy to write a large multipart test into smaller easily comprehendable test units. By refactoring we ensured the test ordering was guaranteed to be stable across platforms, ensuring replicability of test runs while also giving assurances for working featres across software releases.

User Management

After this refactoring, we began work writing tests for other parts of the application. This included writing test cases for managing users for the enterprise-edition of Automatisch. Part of writing the tests is setting up the application code so it is compatible with the tests, even after user interface changes.

Our tests for user management captured a wide number of workflows administrators could face while using Automatisch. This includes the basic user workflows, such as creating users from the administrators side, editing the users, and finally deleting them. In addition to the standard checks, we also wrote tests ensuring coverage of edge case behavior. +Note that when a user accesses Automatisch, they must provide their email address as a username.

We included tests in the administrator workflow ensuring a second user cannot be created with the same email address as an existing user. In addition, there are tests ensuring that if an administrator attempts to edit one user to have the same email as another existing user, this action cannot be performed as well.

One of the challenges we ran into while writing these tests was ensuring the notifications plugin was not interfering with test behavior. After performing an action, a notification in the application would be displayed showing whether or not the action was successful. For example, if we tried editing the information of a user, either a success notification or error notification will be displayed after submitting the edit form.

We overcame these challenges by upgrading the library used so we could put data- props on the associated HTML mounted to the page for any of the notifications. This way we could check the status of the notification, the text included, and giving us a way to close the notification after our test is done validating its information.

Role Management

Another part of Automatisch requiring test coverage was role management. Automatisch provides an strong Role Based Access Control (RBAC) authorization system controlling which actions a user is able to perform. There are permissions for reading, creating, updating, and deleting, for many different sets of features within Automatisch. These features RBAC controls includes creating workflows integrating various third party software together, creating new connections to third party vendors, and managing executions of the workflows.

We wrote integration tests for each of these sets of permissions, ensuring they worked as intended, and ensured the interface behaved as expected when the logged-in user did or did not have the relevant permission.

In addition to these tests on permission, we also created test coverage for the admin workflows for managing these roles and permissions. This includes the standard creating, updating, and deleting of roles. In addition, we added coverage for edge case behavior similar to the edge cases found in the administration of users.

CI Pipeline Enhancements

Automatisch serves a diverse range of users, from open source self-hosted users to enterprise clients. Being able to push updates to this diverse user base requires adequate testing covering functionality available to both sets of users. Part of this equation is testing in the CI pipeline all types of end-users, ensuring robust updates of the software. We supported Automatisch in crafting their CI pipeline with GitHub actions, giving test support for both self-hosted and enterprise features during development, ultimately building a reliable development ecosystem.

Tangible Value

Already with our test work is Automatisch reaping the benefits from these automated checks. Currently they are working on a major restructuring of their application, moving the previous GraphQL API to the current REST API. Their main lighthouse guiding them throughout this process has been their test suite, since it has given them assurance these major structural changes to their codebase are not interfering with the already existing features and workflows supported on their platform.

I am grateful for all the work QAComet has done for us! Lucas has helped build a solid testing foundation for our product, and has been instrumental in setting up our CI pipeline. Not only that, he's found many bugs and edge cases which helps us build a much better product.Ali B.
+ \ No newline at end of file diff --git a/case-studies/index.html b/case-studies/index.html index 1947f10..249bfd7 100644 --- a/case-studies/index.html +++ b/case-studies/index.html @@ -21,22 +21,24 @@ - - + + + - + - - - - - - - - - - - + + + + + + + + + + + -

Case Studies

A showcase of some recent work we've done

Feb
26
2024

Automatisch

We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase. Continue Reading

- \ No newline at end of file + +

Case Studies

A showcase of some recent work we've done

Feb
26
2024

Automatisch

We've recently worked with Automatisch.io and provided numerous testing and QA services supporting their codebase. Continue Reading

+ \ No newline at end of file diff --git a/download/pdfs/how_does_qa_impact_investment_58634.pdf b/download/pdfs/how_does_qa_impact_investment_58634.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4c7ba72b87e165c5aca9391b962d5503e479bf75 GIT binary patch literal 204621 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 _ZLzh0z&>B4w}#XSOh z$+^`Ju&kw_hgGex1eE7WYE3O^MmpOy+PE@AbaVFKTvnWyoW6Ivm!y@y(y(G{sK@F5 zy~lt&i~aj?q%W4P3d>ULun5fo8B?dt3po8bWs%AoABJZy%~!C{AoD7Xy9c^McQU0% z6bMF+GFIuhWQ%JuO!}ib&`y1#?o%08Ic%>{W#I8pfNa^E0{tpVsHPVpXfR26*M@$T z(cxHEs@u%Zp}L{?TC@QMkH^16of%@Y65@dB+ulYN&487Q0=P2ux%4aq}q4$^CH z85vl9VU}ksyL_|bWfT%5`LV==9HKe7MHOwEuR=emjfa?zmRT&H7LosDB5Ay|InGW5 z^}?W9&tVuVhUw{pyv6XV0Za?MMK+QGuv{k|fEN@# zW2@FM-1#S!MV(n*GtHphl>5qR0|@npXyaWJ{St9Q#Q*@UZ>9m2j(*hIEqO2`4Ns8z z<%UyUl4(X)`cKXuUEaV`oGNe>3MXL)MSig;0x|82mCCT%&Cr4z`CLOBDHW*FX}oBlkk#6b zaEjC4kdpB&2H{RisX+Mi9e0uV`T+hDUm8P_8 zj6`1^)(UmnqCYBu(iSGaTj-%V-Zx*0ILkWks7J})E_%=syy<-9;YT{!TP!fwj1GEx znvAECa_jQn!U>$1ShO8GckFVXP8 zaaG-)4ijFcX4#$#TQ_GBwMPebW3jHgIBOT-+ZyD-WxAlN3HnFhsRDwot*0~*(%ojd zCF(nL_aMT)%2&o!bx&(i1Z^PUb3>*DO{1Vy+M#*?C~QniF=x?Xq8xAL_cNl!TvLht zVF$U*%OX5L-;-VLYOs{lDxRFsM@Qh^{_YvhYk=_=^Nlj*MpK<}SZ*$Ke~*&Wa{exFx=E`zZPedXvjlt5wBf~2Q&w)ZnTeF|9iVQ--k4VC-r#fh` zUlw8W!EyTOm#i`QpW&R|&($=I!RTHB#9itujzW{?f=WTvBG_Ja23t3TLl43 z{Jo%Wx2l~#Q&O=sPqtN^P%=TUX>f|nSA7?U${EmKpi6E!CLU2djVOpC`!|^`=C2IRpLELjqw^zxj=emRBAEETmY{Y)c^zYt!Fkq;ez z1OEXER@?=3EpAyX<;ay@jL>o19F5DXyUP8TAo`JB`l3zJGV{=){X;Ec_Af~$EGwem z;oT=u3|v?sy@2azI_>g8rq2rih}E)kzNA8BdQPlUxF_j#w{V+&b|`!PrEUKP3M~OL^|UtbDShlH4--KY2;~UX81-<$ zZZVQ+|4-QH6*>MFayLaaIhcteD*XrJf#7jxkSUF#sAQs~6NWg=lpzdyxTz%r16zmd zN~hl29yuXi9GNo4kMWiRy}yNN?KaF_J9R!P!Ii`$3YWb-H8&CCxXlf!?msB+W?&!l ze-jUN3(}!vD-ec3vuz0OsiBS}MugdjPvNSTY9zHkdjRV9=9>BzXwhKu9|~+RS5;sg zzXC@`OB|Z=htCqI<;>DdQGcDMKABdIPm)vg`3)gqU*VS?A)1ApthL4k=oo7XDE32e zK8LG{?xe1y3|*tyvMZNm;NrsbZ6Lcn63y;kqeKi45elRCERditS~jUgcsMH46=SL8 zLU;;Ao3~@jt&=G;lc4AYdwJ(#L4UnM1WwnxeLI2|PsLTs2R%?1y9h^%b(dFG+15QX zm-2e@n4>#nnlis;f$@EYons&mc`_8eg_8t=>J_Utx+K96t8#R~WZqAcVD>F3fhuNX z%yc>Ap?`oM@Wpn5{Uc3jaE4S+K*>a%D{@@+rTx)_6gW**jf&H%zBS#>U4qVkfYnZJ zGSO~v2gP%i>LK&SuQ(j03HOjatALPJv9q)6=4gbb_JBOZm8gV`8?Z`Z~t#Cb%#Wt?=m} zf?6bzrIF|nvf&yl!R`}+<<&|CYxH=}p{fGx86%co@xYh*W8LmR>MJTKElV#`mV>s5 zLG%NIZTXU8$u$D>55Vd=?>=#l-O7~pS%5c$4?T16$Qy0P$S2hpWrKfy_Z?4^89s{> zcm3V(AK*0;48&?t<6g=ekeNAiKVu{T6%T4?=G$2kxMF6BC zI7QJ^_35nX9Mmunlrh%aMr_v&ca`S5yTMo#MF-Q~e-Qjxe{E><7`JFqdXo8D3TT)N zU@PGN&X`mKhO1r7GWA@cwa%(XKCMfG4s%pb<`l5*t07(FO za=1KaD+b0S^k>cqF|}r%`A5OejRLoTq<13sg}rj0TDs61{MVS01Pi8Wl(bH7);|wv z&0z3mrV4g%5sMTE0dd8H%yUmtdFU+)1EI3nPx?|y;kQm-MoZ0Mz|GbPLRd?oPC{(N zJmk7bQ^F}7+_>Mgn`6pBJ9r?pR#fC4pn=rI3UU7uBkpJZd}y7H!zv)9uYF1eGQg)I z8kfiYYizlX%MjjR|LbU#LTVI3;}6r4XT296mCBmRx|bMk;-q0cT287LXiPmq$4iG!(q7<0SZ~^Y6ySn4l@M_3;in6BkC5?LwWtD;0p=%vVVY28D!D& zKLFK~+SRnvEjxYhl=N2NioPfdHqk>22`;f^p@D81{T@BznhvA*sGJ=3QekC>_Ft$m z8=Io$dPIouYRgkeNL&ZoI@IcMdt{s#Fw1HWZ-ofgOtWM6iLYc_@nn4*bRvV;y8nm= zuKjsd7+=j#*sO=lo5rKY^VE=u&V5Kn9c z6Un$>7h|=iI07~v|b$yQ+j^m=2OIcY~ z+LJ0loCXs}^g!m6R_14C&MS*?S@!FGN=z_k4wE8FRw z$$K!iRa4$fQ%-|OgAln}4o3i#F<=3K5_=Mx0D=0$L36F|B0W;RAsUK7YH;b3;lK=I z3gr=!^izkto=MkSVkMJ|4KlejSGc&Q5`g1@W6jkr?GOcJEoYWvR<6xrV>ycLIcR5G z&OMp@?Ym&ylou?U@n{1P1V{MZm62*RX93_JV7O|+xY`vpw+NHSX4Ux(=d1)Q-< z8a6)iv}mZGVdLy^L|_1BjX5XdBs+sTZvhWp$@eL}<|5xd8DxNZC5GZjLQBRWk)^1k zxXB1r_Sqmmffi7{#F-PCv2pt!0G?+xUok2Z^EKj~qRr-RsT9bR0}k z*{Ng`5V-Jf_5TYX^6z=9XZnv>Lt*3`OqlkRbJhmb<+8WU`=8eKqm0&Xd64EW?nZnjNxZJsv zvp$)(g5#G$1u@jTVOUv1K3?>`!VEDND@zepbW8|G5E1u9PlD?_%EgqM?(DsP?xTKQ z-%eL=)9Qtl(D`7-S8u`@%~b!)K7J-M%e#Z&hFQTw;wxuluP=|_mEnmA4vt2x<3L?4 zkJ^FI8HS|VD$O@xJwp z@2ai~#;i1Z*JcfgEETT(Bc_4Xj|F2ke890ZTKvyb!b-;U=8IZ>L=3KqPc!t6&8>!` zoUrMOtq1d9f4Ck`uw9csvIJf$ug)LgZ4YIBm3(ef-W=uCxE0#t`6}WCaPiefY<(tW z=yEK|V%7D1$s#7zdxit_Q&Qhe0 zYWa(zpe#q|ZLEk0)#5$Cq%3>0Yj6HC0?X(^s?9ts?XqZYnvw0BFH$GN*3Y)~xf;g9 zwO?_Lv1R&1*(Xwq&W`Qjj&bR)-SqBRwvsikSet}sBrjBRineTp{U2yubeQu%+f;AJ z&73dG+oC+>V}s`>AI;~?A&N8iyBn*~S1LtDv_)ONSx%`tC4q$L`M&%6{_E4%zE67g zKXn9_4Sjp`-nno#@s%sA=KLAGyl9LMgA<9Ft_uY;%Lj3jEzjaAMcOJQq(Pl@W(Ruz z_@3@K-DRa@dqb|c;~MeZB}bzfq}zz(-Voh|NA*?{9C^#->++}A)|k@gN#I;ov{+=C zT}Y+ch@*T7I`Q0?+qRx&Mi@@i!0eBo9>5T&tA3w)xDz$^^^XntdH)Q%3JjZw=K_Dr)PZKXvbXtn%i=Ox7cS`1AmH6 zh+<0f``(t5U9*~@OU+Y1G$HS1`-Rt>R)vST+oLwo%D&_X(srC;E{Mv1W{}@jmRJYg zr43@xnu13be;WL?N&0McC}rvS*HmwPp8_j?kj)lE+5ugT{ExR2|5?IiSTEJ(wDuK5 z+6vhmz0X{yeAj>g^XwxmO9xO=)Z1enc}6Mc!L-fXoC%Ag&37WA)PC4K0BXQ1=?vS+ z{_-UfVTpAZc2T`qnzqF*EOUnnV!WWDw1jtxGSCpawda7M<6|bSIy1%~U*a64lYb$LORZtRDicrY{R}oG(YI%vnU>d~liii6HsY#231c`4Wu*Xp z(e?0co~d5GZ|_2Z}@*wz`NZfqTeam z4Rf!~nC8UmS$f9&HvckxgZ{%McMRdhG!IqZWbk$IALEKi?2&8sylRhjIhE8jkN8-0 zqwoCgrDNXF8BsXjZ~T#x7xMF``T5IhsQATyA*diohvQ=}L}w3xVN$8bi@04Pf&nj=fsWZZ(YI>zg0nN_e5%-e>C{E9?kFYZ1c_9RmzR@%N(L28{~q8qd2=Pb zCZ76H!G4TIYRs9_#CIWW)%eM-?I2X9pYbtOPHFN0J~wWr%K#+)O7B+2>Rw4lx`Ua; z%IdevlYGjxg7R-|LE3w}@mkIQ>hVd`6}oUVuA`;Pu+_Wi{GQ(CDI_&9TVHEkPT~p) zw{dFU#80C35Zg{y-`M#J+G)f2R4?iI^T!jytG9Saa+J*(D1@K6PP|R45I%!){5dOW z;pM$wK>=JE_EBv|hbPX30+`)zJoBp(ZRFOEZB(BPJOX#250E?OEe_oI7nmFczY5XH zI&rw79kHD&o1Dj+b zk%fCZJ6FdA9IA<5%3oo9OrvBYIFT=U;Yp$sM76*dDs6fq+O(&_cfz3=jmA~1XFfULGSNF=!kY$1AHt(%u5NawXXowcE_h%yyfZ-DbC$nVFfn&CJZq%*@Qp z%*@QsXYS0LdH>#se}8;!g|@b8D=R~hC9PCtt^}1d#&e*(A`Ck2ob#aM0Fhk7b@-zB z{tm-+ppCNh`Q4)3A&u(=jj*R*4v6Dhie=|cAi=D!oy#cG5LB~p46RV1O9hnSQz|j2 z#cP~xhJ6-)Ccqo$u*oNqU3T)515k5mG8bvuQA#Tu#{RbJ7}()MCQyo3*%jiuN&5pU z<4+~+K1mN9$k`0U@oF{p_iq%{?|)HyL4EHwX$z2Ln_K-QhLJQIX_}cH_WS5F*)+s) zXo7Njx8UfdF5!VQtVH>{HWU)Aw|=ig{FD+M<9_;&aSiq)(7VQTfk0KNt&HyS=qqSl zmSN`uIuN@E@NqPf?>;<9mVkTX#~P~Xeho8k(~%u)f+gE4f9ugo`qbLPG{T)pF2HfH zX%ug3C;dyJkZbIRQ3O{Xh*1<*8+f5w<_d_tK&E2Q?RGhbt1yvpC|4S?Q4Cicno$~8 z80Mk6D=6oUmNivsf6Z*K7YZ2~v)Gdu@vaoB=Pq8hW z(%Va&JMMPQ<{ugUnL*A*tYeOZr0x#NTxo%m{F1kQrz=6<#!&7#?@7V|#XN-PxP|Eh zDG4I~SiDb^kO)?zO;40a357 zOX=J@8M(PG_ix+fbr5uZyvi*2r!_12O9_h1bYEiabJhOC+%qQxjB^P+WggA}IFL}l zz?`>GBVdL6?l!kCRarPtV8nkY(6VBu=5fe8ZMry6K_a&Mv>K;Pw~#MmSGzd@W`y}} z0Xa{}P51OCVdlFvLVb_Nfu7bbYT94)D*G8a8+HF0yXDv!k`5xi&Re))uw;$Pk=q+} z*bW>u)KIeAWqd_Q>XOBmp0~VcKn2hIj#H7jcOmC0!>1|Eh#c9?q(Ps{j85PgG8zTC zrN)|jGYCQtddkh0D_#!5vI+hbnXdbk$O6PJz0R~zjdX)nAPbC7CJqt^5l)mRnU*3) z$TP4)3w5Yy9K|jg6+7-%jUX8cTh0CBkAmE2~JZi*>#~tdAp}8732;oHG<56 zSMNDo4r(>!a^LFV`9xC27XMmsnA%V1#YQPE&2%Kr1qvggpU1l8-Oou`e=n|e8~h#= zr~~{93w399aPVl8XQyq(oHHf=xJ9cPBXTr?$AVgID+_BCP4tLLE-*gwa5R5-X4kka zk|zzG?zdJnxHqC@Y+OE?R%W`&e?JE-g|}fcM$==8!j8Au^77nVnL24&T1$S=iJhokyWluWA zQ1`(N{wUv9;5PRL;YMytS;XyB44@ek@-1bfwJ+1!G_9Qde&`unV7Re4)ux+2jB}%K zKyd2f06lQwzb3;@UwMXSNh&2N{CN$6t^sl<~lF z)18G?vF5uCnjL`l(`A-37P}2fjdbu5L~t3ZJcKKbLj4j5X2b2|!|4=`ni}n-uXh`S zoB^t@IuX+q@|EK@Ufc^H4fb&Fn%$GK!;!sTF`>8sCuSzTNyTOhSw#wD(ph(EE^^bZ@$o;Ej~B_gI-^M=??`=@0$vGMfKrI^j$3TYgN{KtdVOb1;_mXP<@6!@g3v zBp=r}=pm^Snsy{T)ECoFl6pa|)!>9dHx1%CcDZ9X*&+w{?MmCD*aXL_wH>lc1$9tkr)O{i(zDXo=f+gVx)Hw~zd zMa~>6C7^fYp=`t>tPk8A8})^3S(YTQa=D5P=B>dT3?Ra_5)e5iNb$2`kLS=yATL!j2uf;^1a6V(J#Yfb1$r^6@>F?sNxZ_kqvT0d>x@PC4 z)dZE+{fh&MTEl%5={0<;|cDEd`OIpmwn*FPdSd;}%Mmx^3eZ6uiKv zrjD?on+wnN-HtBVFUh?1iM=cuvE6Gp7n9js>8LHisKG$4BiPC*^s<}k@ZcJZGq_A7 zH@RgO&81Rto=G=mshw3Lk@YgwFRGGG(s%#r6fV|D<)kYLl{z;2#ryoEOz+2&WCYlu z;N+q#&(DJVlR5^pDvD)!Ezi%u2%eKKFjiI4$N$lx{>y*;%b{juWn}-mA~Or)KM#Lb zWd664%=DL&{6F}}|CjTtre3w)h~TxQopS_`$WAOI*3I8-rkuuP@`sd%7tfa`9eXWA ze$5gFP58_6s5g!H^t_c94-%O#GO0B>-P&pkxR1h`^Mty7^5k$XtuL#~ln2+y<7byWSEtAG($-e{``ljD6%UV>*HcqeP*TEr_8`jFs z!6}gf5k~BUoh~KEQHrY98(O%nqJ+^6U&{$QQY0tyS3BnePPK;0&&b-{Cx;z=;q^qU;w^}3#tYZ$;&XS)YA*PrQI!InBPill0zT@VxSAq>^_=EH);=v&iq*Y$8z(MED9Q&vVV%hkeIRSxsj?lm-1U088gY zr&sc!-Y_cab>TDsA$heoSBJU2Z|Udq<(RCLGC7-xp769(Kp>Zx9|I{22lkz2e4--3 z&vbZS_T30Lt$v>6A1Ya}#t$=ynLxQ~AiX=E3rjzCoP1OylK#*^QiIG3c8#xvJwkVh#LS0?P2NU6qR%?Cy+xru4XPZh|G7Epk}L?d;0 z;1U4v+bxF5=rHB3LB5`#eeMclMpFCoNtVIWypiY6_w2juFbSe9ahkpiU{!g_?@=i2 z`eI3BoPJk$#zv@h_O{@0kd-KpR?<}!cKFVAN+uJQVJITWy==A`E(Si0{$NfNs8`RZ z_%bu0=&msF4OOMwx>tK&hB5A;9jdS@j`06<55m_CO+W{hR)$X2;Hx^;mjMUPT)M5b zQm-=VoAF~4Kb_}YLHNh^5v-17UN1Cv8WI&6h=n_RPQ>d1dvxptOv4dx#3J>zvsi?t zRR*W2Rpc4LiZ+GUi&+D+9Q|yEtIN^Dx%1=~p;%L+J z-F(&9$f1It(oy4Wr`rawI3!#z_e9>6+}C8ONwbM4luA1H8g>*O2pW{B>?w-}ySV(# z?uyjw^)WjYZQ5xfXb_!>@a5_4aG{c;RAP=iJJ&{pAk_o))u4->OH=}Pl+CA+iw+@$ zu!*OJh7Ass^;87fpyavLkmrqfR__7AneNy^xbBYI9Y?)&O-$(sNZ4O6)h*I z8GRh1_+Ba>38+G-8|7iS`<@Fl23z+A0fM7)xai52Y`G|T@eLBen3|CI6&-3&ro^nq zXdQHjcjtg)gcz8J2XOC4S1*=`dGJEIyeOAYqBm-TO*Xsno-2*nX0aBU5A%%r z&NLdHkt=cBS0FjTKDc;$sIk{(^5%%|^EyKhF)pgpi(k{=vv@8}@%FzT$K6w^uIQJ

(x#f}5$Jw)qdR3sn!mcBESn?|r~j}CO!Qg=K` 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

xe9B zhT)rKj{Y=aW*(yKNo^juPCE&hV0nJU<9_`DTzMPfaZLq)ra8zl;g+^mk&T@caJc8) zT+Suuo$}@*#hCd_Y}X#|d4D;18yn)q{S+XT`6 z(?I~N9u}D|V0Rf^d4GUvS6@D@ssEf1JT+1O+rn(!4@c=K9B@bc+A!LFjcZt3U7g@N;BNNk8!#< zRUK^$McLliBS{b@vn?R36IBpiiC8h+0h+*NbLIEXi2lpE4-eNy_G3d%b_~oiSctI0 ze#9>eS74hR`Jb&Zk^VsJP+j_JtRJ(3QykWE%A z9A0yiEG8o+T0(+yCdbE5pU3-PY5aV2vm?Sb{;b>x6;sY?M#X&~f!xdr>AqI)il+F7 zDR&2F68J(UQOxSLqoD=B(4iq;mDV9NU(y-?>N-A#dMmBfC%?lxZ?L8@Nuilk9{;5a z0@%b-0}H4!E&+$!tb%9?ngKp?^3tsFxaLwiPZ8V1&7BrSgs9@4PCr5l4=^7xRGYK1 z>?(Ml%HnZyHty?sWHsU5$r7dKpH$@8tPyH-phs-~F9z+eMycbic?tj3>yBv|7+ZHC4AjHO6qrAI5cFkj;a2AtZT}9+EV#oTi@`psEX! zF6;c-#(l}z+#qv*NGG#ykxvzY3r1KV2YhOnkx0My11Xrs#s;d{3@=nH@BRUr^W7H6 zSQ8rn(^xpiAWT+j84^fqw-}Divwx9FcW#QJvRD0Bw=o#27cdBXb#sO~Vk&Tc(W>c+ z|5-Cz3xtnq1&&er0*h_}m}_1j-p+OmldhN}HVUSw)kDPY4G!j5g|O$XIe`MZSvI^7 z^0kChW6#5dgV)dSQSfr&YO>7;6w2~*%>wm85YdbPWu777$WJ}N8-;%H4Zq%Q2j`TL zx!*v)?}b!>s12-IQ1U0=hOg31l@(4%u~++P?A-d2YGCVJe(19e+@yjm^tkpbak?E$ zoa*>I?rP#Gl^~y-tzy!vrtk`uVudAtna0x45z;6*!{LdAg!x_5f@$ZDRT-haE@Ig; zFPWJiG~C6zr`4D?SW%~HF^VxlpWnzY{!@8XFmMonY3)xM~&{Szpbo;P-w|!u zQb%Q7$?vo(<$9b1Y%CL+;qyeuDeJK#Ng>ju$ItNhZqG@~eAa2{9M|B*vkXOE2+^>S zwO_}1x+_;k+H9rRuVLkNcQ8jCfhLE>kbvMz1w@#u*&{)95)AQL#Y}+LZj{l-b^B!3B}O( z=AZW0ubub*>R!snD@eL_j#OigwpPZFMK;5>yDs|w34O|hN;#s-tDKr&lUjPli{{lK z89~{xqQN++6Fh>2Gt}wrG7q;i8r84=W&!orkZAT88qX#^n4`WwvAl8VeT9(^o}bi` z=M*F@PoSPC2cB5etl)luyZhL%Vg{kPwmGTFLn;)*r$14}v>)wdx4FNKH`x=g3ux-e zb8hkfET^mnRw!zlt1d9TSCoj;tb$wGEV4?0xVaZll4V@tkdOtGr?YhJ^zhrf3e1<3 z5tvmef~R~kritATG);Q(zHA4K2*CBaG&Xea9gl!=bRsu~&LCaV`G$ZuL&J;UXfqk4 zh&jn>EO=!1Cpw<}w}hMUlsY;M96Q^8jET|^6PTMNB(LW1+b6qPN= zQl~~(d+LF_^#)mttQh3b*aLONC%ixe$;8LYUjGTa?rMx0RjWn-v=B!r%8 z3J}Ze*+l-!E2N|(ah1q2I-H}w-B*Xnmv;T-+ z6=%MPfr~!pEo zs2pDs?&H_1_s~JVr+Q9aOl$!Se(D%rKQae%UQej)pQ6l7qaeDhb|V0H6ox zpxE$aC(O!mx!vt?DiAAPT}oGqd9_@aJ?<#lV1Y1p9N6P`))x_L=@Asb$(amJQ48KsqA&17xV0r2iU*|LktEua`9ya^_0%uxxrp@3mH@BJ{4qQg}4 z0_y0>h%Mv%!K~Yx|I*@>O5J%>yAHqNH@@+dt(*5G7ZMg6BB)>gI_Fn!@XY=>IViZyrR>gE9QWGr#rOj0Nh$v+$)8PtSeYYK^89a-Hpv`T zK1Whb0%6;_QH(R`@*h$bsN~4WmX`50!+%d_$ZVdN4H~*qN($U>DWv=l_Lq9m=kCnl z`6}q?C$E)mXv^F@WLy^9#IS=w-NGqJ&={j*47tVemn@U)Y=dcPsfcffd9#8}bG3C` zua8phik)?P8tWkmstIttd=pP00L5|Hfk~^x2hDKjP#=ims4oXRr1Y#ho5fv*c0BIQ zZXv8)oky zA499WpMb|Z`2;m5wNyzHCV4;vvg4d%-cs7sgId`r*3gL;@DG6vfw!}1^vY4N_p%53 z#$W36kZ5D;i55e#DY{rZ@9x(SHW`Lnf_RkBDOwHp2YdHILsScBi+MF^fymoBcOafO zyqhW(g5gHyLM*SkOtM!gSKXKmaAdtV?FiZ4#EBcBP2a?eyfB6t*pg6Lp&0aA4v*o2 z!h)%Ic&-%Pn|Y7F(cj`hVQ`FaOoWaV0Z4zu8lt`GEMAg2TJouM9dDi<_PYqFk*n3z zM6sPLw$-8HUF#FZ_v@k<};0VirR?bmEzT> zLD5ydXG`gd?H=YH#1i;Dx`-ZDezTKtYH$VT9l}geMV4YQqM(F%x->*eYiSBCt{Nsn zSAd`;U8vNa+3}0CRm;5-RpLbGwWuOw$IM5UORRcFX{=ImM5N`H^-bI`5o1%2(ZsOk zD4Uan4oMQSLBC0Q12i^5dQ1{LJ6J2L%Kw@bk?nguqqo21F;C#k_1zSPAgiALrkrmF zHLIaeZIYz%;bOmw4FTd)k5I;M;&b;jXP;X9J}z`2-4bNSt4ZxIP(R6ebgsWwo2Y`d zgxXCb!zFAh3zLu-zM1D8#;DWnx|mRR02ErEb;m= znJ$rtQM~v-k552;4_7uAN&|U0`#HD{Z?cl%l^C*Hb+>~uWD}35Y-!e5GPEmY-NwZq zxXQ%WC<;vO0Z&z_42L!|wSCJykncc*RX4FiV(9?;n?nXGaWWQSOFmUDyOc6VGD_DW zDQW(5WU2lE#>Vu4rBnW>gVvHNFf0>ysy{nAacsu{iYi1qf+ zyi+Yo>d`|ec`!(}6-BxpQV2j~#L%}$1U4HF7LAK-7}5IMZuMta!~PDUDKq~BKHQ%a z%?8bZ6_OVjq}Up+rPSWx87FKgXBGw{y9H$OxPeTi7){my1+Hi^d`p)Ud-ci?;Iv)^ z;}w02gM{X=G{f^oQi+(#l1GQ&g-n90C7Gfkw0Vd{imXW`%DKNP#Gu26c1hexw~f9^ z8*()xZc4--r$gck@zM@Pf3H6U8XWAS6XiIW8b->2;(E!o*U`=zc2xpom_&l;0!7ek zdWMpt^Y$bD`lIt%hBqJ8`Qbg9$3Mso&-x72eL{OuBa$``(x=BohjO`Ddc?f&=Re}b zuL^$M3;`ZppP{5o#n)V^*<+}`vLBVQd@!DH`j5T$%RL#<0DQ$12lJ^xBJ2|p8t;FL zVS!6gJ%N{*cf4ZQI_!=>Vg&4aW`oF1K3=1*b0fVdT;A*_e*?`5N~s{92oFBqf4Eu_ zB)SI+6x#hNwb0@Y6Ji#Ka7BHF;d}r#(34Qwk8mx`*kgs7?6HHkWf8Ir{|*M8qPtE9 z-u5mixZ8`fjczoly+H7fJ)IP1A_U1`kiY<&iw&h25{}`X^urwn;6%cJ9C8pr-q5PI zGX%(HDS0`p#alCV3E>T4WwHFs5W~u#vkjwPNqwJ*Z=2Iz(Ez?a3{&TU5&jWbH+AoU z&2RrU3V?)s!=h88#Y$O4gG{7P@hnL+}5FK)hZhwZ#crgn8O)Zv~7ccI}x&H~Ar zLy2g0Q-bO%or{Qkj4||3mIdE*O~7CU|BQG(-}&!yO%&I}(fc&kDjyTq3d39581%*Z zV%zd+qBG%O3KO~qR9J!sUlqNDM}8rEVhecU@`9}D)GpVo1SgELs`CU{=qwRV+5WwD zw#*R`mdCy2q~&bxZ$!ETZUsxD3bygLTF>bEzwdbaYVr#td>^Q|1osqId#Xd?HmSx! zCDf1B;KP>+bxwWmhXvMp=c29Zp@R2|LI9^CW)4J(4NO{ERKUP7><f6Shw>ASkiBNaz)!QKDOd}n=HP=~+**q>B8XRje3t~#$9rf$ z>5H@ttklMEHj`tDAYKh~;?yM9^_RmG9T3T)$z6R{xX~zODnWKg-;w|3HzOq}kmC2e zidh_84{}-J*aosC>5a23Z9Of_4(OLVpu;3s+iKvx+=#vH16r^HE$>% zj-p5^1`V@Q6v^#947*g;B}t2Z&|d1E_+X961)u%$`^(oDOl_ke@v~v|SpYNBi}#R6 zmLe^asnQvMmF1OnD z);3g-!KbVW-u$L;;CT0JYQ`QL$hAweS+Z?fg}k<$z2*2#DX9P* zDY+yO|ByYgFC0LBlxI!1btR-B=Vu>(+*kcUaE!a=9@BIJT($_ZxezC3u2`EZkU^)b zml5`)PAZQ&_k?vleAc(_ReDVnYpP&oOM)iXr6O4E3#Xd%`C@a7Yh)zEOxFTV_|p%A z)RN8u@YH{fY!>gkU6oy|-F-o-a`i;P8tymXN|U$2N!CN{9%f^uHZ9ee9Es4x>Zml- zavN|qz7oZvg9D^EURpqm81A1O9y8SKY@VEDx~2mvc#rl0CY4I28LF3;4@wSCvaDwA zp&}1#k!Jd(YpRGIH6@debQ@RBg~^kj3%0P35DNC> zZh|rLm8p0$m^a%;cP&bAx!A+AI!6rrtICncXK+x5U~I_z;Nn8Ol^O7~4HHYpWv1yc z@R7mMYWbC*3JHIGWJqnbq|XPBOk*iFl!&kQc0NHb;KoYUZL32d3V%3YW7VX4onuh= zsOdb;=g%Y`U1cw@vNqPYn_B{_;Lk?E9!qVIl|pSQCgiR0st9JAzQsi4nQp>yV@1Nx zZr<`qhBQ~2{vpH&TrL{2>J$Q|7NZOn|3s2fMm0qz9AGXR!%OlqNOB@)0nWeI669Cn z{U=;7U5jiJwHVshH!B z@jH)h+cwo0QNu7N$68mf(pI-K4+WQxC^q}2>bhNIBedd8OyWt zOAjljdRa{-92mOzHK?iJ&nX%d`V#Cu| zpPUXzG+WnALzHjg4!wReAP}8nx*%Vr0A7q?lp{km1F6VaP+z9 zNG74e?dOgd7Y)?#p?6lN*0~a;dlIxyGyqAxNrQH)xRNggLMT?tQaw6Tt5pl7fcH1U zOk=fcScKN0!!GLmmn1XrK&~_2Y-YaD8u0MF#>)G=+pBw+lk;z0`au(RH}Ns0J@%2O z<>$GWI{2I6r-d&(QR-_ELfIzPxNYN+(@$PNRaB~&Di292bqr<}2cW?f11;&;!|=8S zDe9o=8EvYD$u!S>|$k)g@HHp;8VosQ%e*Je> zX?C}#b1b?CJV!`kw?Ju{H<=q0LTkuSWX#84hQV#TV$kq4tm>I}-s9u*&(Z=Dk3F0` z_rPIB!V8!zxL0Jaaz%KEf%633aP7dzej5<~?rgNhfk+<~vY|0-Y{e8BfO=JY5wdM# z4oRG{0RuhhI-xg~m6hyxm9% z)s`}wqO!LvzhP#eX!UgTc%>47B$mF04lDZtSbxU{ThcVDQ!Foimz&-OYfV27qP7|% zx$?UyjbA9b#?1T{%i~zgZ%{RzhSqGa0-n6)47>+QLJ%S$Wj1=yY@bfgAH3? zlg;`0WD%R-&3Q#FKCneezk$bFIpn;6M6H9*l}R-PW)li9k%aE)H?eNlI5IOIG1OC4 znwbjEf6g}bMk-HabO;)H-0+5P*d}p5Nlbu~jLc)M{KYc;;>G!1qhxgSBc8}nZ5#}9 zYWfRa%TUYd%3;8jP=ipW_HDdeDe~S-JTES^tck&FL{gWk#be?0z5luHI@91hZGh%D z6^{=tNX$~_c>%}e2(Ic$P|vGbQce3b;3U}-rN%}`oiz#S!08kImPX|^lFR0dOH!p| zp-97(Yo>0v_$dtxzhl=Ur^IuVk|9-SA_zy^{}8%TpIBe1{cxh#Fs>+pyAV*_kH<~2 zoYwkUnU{%d_5QX!&O>>Vb|saH=3HNaTJ8et?{uL3o&WaWmsF1mgL9)K zn+==Xdj;5V5i;LBdJ&?=Y66cvAdHrIGpTX~<3tGZlZOn`1)2ELFhDF6F!eKrXfBXt zR9DhH!+})YL&jB)FS&GQG%v01O(kngnX(#qUPg#EH=))HzvI1o{B{iV8_KCOr2yjR$KwU`)&wT5GsmMP zVrN(;nxVQ`1b}He7%xG*`&z$=pRe#xv~-UaSrzDzpt3-gL)jA`1($K*fD!BVPeAVt zjrm17REXp_;?d)JENOF#B>l$$XK1G9zDAa~>G4kIH{fHKg(J;@LE~xvCicJ86rq7V zh?KV`fSNSf;~>i4?R#4fg&LJ|)x&ZGP)#gVuuyTf;oPK@$$oeYXvX!HiT4sB>8-Le z1p7#^X>Vj(CH*da1cUUijS{(D3$&YK9oPUH-s00~Q(%X?GC`f|VpkJ$%}jh58MtRd zgc>q?9ZqsX!}a&zew*MSg=u`ASpG8?rF==$j>^w^KA@h1Udu$n7?}a_ViXAIyA|q( zf=mou(I`mYZ=h(#QSd?;=OtfRN7Ugu&JWbf*ZAJ|eD|nXsbY45ChbZ$4H{1XZ_u2B z1PmH!S^(CJJ4qH(wk3VUtkOwlYW$4G)fh!-FMm;YYsb=jkR^7Q=9zHTcQNh`qiI2JuOe1s2_$Y~s zxwlf>7;JT<0?8y>5NgdED#vMvA>Jxt&6bJFrW|2qChm9}ntO7aR>4`tVEJEh$PXmv zrIX3WHMY&zXuP2q!xk@!6bc1wLLvRoaWaSL3m6EM^m@HA1iC@2dG8Ku=aSV?I~&l9h~sL&(r4x$*ko7r#+)^Ln7Wc1d3Hf-?`{pm7l-*&l?(I zpu--SI!RI+X98pw6V#b>eALmyb?v)ZrSa)lF;|gh;Q89O7}0ffR>?cwCm%uIJHV>_ zzr+)~T4VYJ6v*NQX@c9Uo2z&*SGc&*YkX+n}6k!*OvmPr$<5s6TjFv*9u!kZrs``XK|{HE9XZ1@HPW$6M7iiAa#8 zoC4MPR~|_X_;y&mfW|j5#LlMw#R|a5AwWiBs2EA`7r+TxQWFnJur9DIK&vqAdx!wf zCf(3-E@^+wRVfjhC77OJ30GNlNrsm@XpM`X_O6gx~qzFbK<@1tPk zf03Emcq^KIQW=P=pl-GnMu?sD6_8_ORRoi)>xKaKy@?fEND(B5M_oYU+pNS#MoZef zHKR0%S-tdSHbpsV43Qe7kM|j|tPb7>p3Hhfj<0~VZ*W(ct_Z9Svu>FrQ{mYJL6G{r zUJu{1LCQli{*onWTkJz0NEUe_5!muZAiiJ_6wk;|1X%%grUrGipF^lbyuv1EbqP(U z3k&ezLm$Y6UO0Z{hmm@CX_`T@CCKM|^Q5j^>2SP=)fT!sW%i*T;oIUIgf-y&|5SAD z@lfUeAD{cpeP#%yT!xt;a+y>to#Q@}%W+8=YE#r8N}(@p?aa7lQ!b;JQYQ?f=%PU> zrM9d~*%Owcw6&{9vRl+f_4|GL*B>4@<9yzq*X#Luzf$IiGfnvnqbdoj&?`@B!?V-{ zP%)h`6hv@=7C^Zgo?x?6Y9oDqIR%l@2BnYZ>HE zg;b9$%m8XP)|U`#!C>i`Co?Iqkx6+*zYfdhQ4aw@YWjwvA*I>yj24pM^-@lK%rmP* zn!1#t!562GJVi`(v`rpk1o-(3+H-STw2B_|>mD-4?$3ycxld?=J=wYKhaqd>6V4kz zA1#=r&p;_ah1|Mz$E!d9Pp3Z*R#2*nNQIC{Xr2wsmjEL`w$Q}oxPe!ZJbA2P_s1aU~A$?EG+J^a}QAwOcQlA+UhbJ zX_x}VhYrF`1nzz?d238oJ>R-M<(FM4My;n-5a^Et#*-pNKmfN9p<5odJRHG{4e;&} z=WWw2&cY7Y*&VI>x7>MUWdI+yYSlf8lb>(U3Iam$`?g|l#Ic6}D8@99hOI>Gk&vh~c6Nr;`! z#`Z$*>OU_9j`>o|24hc(!lsk-wQCX?S%uX1g*daHOXWh^(8Y`ao|R<~z7ZTNARXQI z!yN~8xnB+zX#?~!CT|&TS1c6Li0yn45Ee1fxqIE;b+OT=+Wv->_jyvhiy4nei6_Z% zv!haTYo7pwVk29rJy5(|$^>gBrDGlB)^X&JZ6+i2`hTU`tPf~NW@h0jA)WhzilUcp z&ZDOS99Ej^NT|%ZVXt@>tQ_n*ohLPp_SulXi9@^6fclLt3MQo z{J8H%daJY#EDatBjmZ6ZHCdli1ez+^ytbtCQe)|EJ1ym7)7-c3PlgdT%?G#_GMG&{ zl}nM}KjnYs|L|}P+mQA+3DW&XfP$6gV47B+?pTAi&!330|GWnOwwsK2HUPoz8K`0^ z;u(jf=?g2}u;7V+=<8!9K05A*HvhJV)}eKe)|Dsnv8c&VD@TSKYPmYxZf9uYIX&6eYIPhnOK(@-b)MN^_Sw!dE~G`CB{-^f)} zV||KBo7IaFQl4V6|Lx8%?}qfnP$=D8cEwC$Ro^!*9SIm2kTux`7aF|d>A&UawkvV^ z+F;xv9H>A!A&EGggoAl0_NzGzE%C13uWtzCPG@0uUB7N(?6$G0eMlx`AymL$GdDKA z0g_86s{PwDNFSKy6EKIC=-w^%BA9+BCX@B|0tEI^)9MUxxPWCnQ#{iq5=mtKY0^>r)U=pe} zl>JkGNMhdffPf#BVYav#C@;_NrK~Ej?2Crd!82uwqy})wo_!b6*R~EwBTwhpvs4r} zFOc|K)FD_19S?7p=(M>VL^eDKl~}TH{dXlcbw;KRwY^j^BMy|GsQCN`*qz7A}?Y$rL##HX#2p6jN{Z% zT3Ehsy(4IeZHV7VIx~uRNldt@O@!wIvLlYJO1fLFYjZCA(FHd1pC6VwXH5^w7t0;% zMmO+#(Tb>|hhz$F2qR71?!aICHH&K7b0TepEo~8tPQ=nNkUuo*L4WDixmK%!q}wH& ze2eOF;lp8h(@v?S&o>#=l`SGlu&)ZOTXQBx51qy0@dM_>7kv%f(d-p3rri)T8+mfu z8HleB5;{zCqJTwDA1vpKyO-)nED8G_fNC#0-EjMrx88W?x>5S?VH@|ATDib2DF96o zx*>EX%1HvU(Bp72)WA9Z_`JlncYE5gA)LEZfO@%`;vhC7?JFBsC0YK=6{XHAi2);^ zdClRE6r*B7@$JSlbB4DxO>yV&xNnkSp2fv0mwIJ2D{Faog>q<^=WsLS4?W)t7u`nQ zp7`F%ROAwT#Y649XVV^9%2Pvpd$&BKh2oSAb$u&_O6wu1oHo0d3N?+6jmswR!cK1*nWBJz;lBdCACb3w~~ z_9r+4ckkct5ZPO1wur=@EtDq(M|6+M5^+{@Sk(S~^I$!EW24H#@*sou#g_9mVgd1A zbxt-ecQbJMgsdHDM0m&Ys9z`zttwIz&Ot}KBRpirr6#Y3x0jR0h)5wTy zCrClVvQ?x*>8MAwT*y3kQM2TF%3ooPGc%vhvtXFc?p>q(<~xsXF7XYy zR?U8VJTLnLy#fp@^wOPDk8caafXb0MjOF1msgp|@_;6;cS2ZwXy|{6OgaELxp4CD4 zswo zj}a7ZD_&L*N&!6u8|$(34Yx&h8(a^aU_*CJoQjV17! zo7I=PU(=8GkBBMSjN?%`_rHLEPrYEOk;5Xh=ZtBUY|d8JXkA^3>fmq|P~3f+|; zV5DVJho#HUR!d9MQ6_ay6(zn%b$?-KkX|~#II6Qfn_X>K9_}HrGXGSlW&hMW*!qF& zZrQqx>dzQ=*eo-cl=I5v`_1`A=Y^e{-W@`; zea@k-kj2qSO|O=VG^Ke=5BoLy0C9>htq>)RxdxIUCi}$vZ7aMGi(#r zC3!u*8bi(OiSpz2S`RD(7H)x-@{Dm=BY%Y$ zeDkvYCHqb{1kwy(w!P3fS05OWJd+1ayE;f!@m&SF=BPRVfDTqcYfwv&dMUeE#j}YF zV8-bx42JHQVrJWAv?}T|2oL@Wce)ohZ&Y%3pKVv31IXTLg3N4t#thWyWIh8OJ%%zUUi%2zXR2iq z>IWssW~Zzt_?$1d7FnS`DY5TfzP{9lRJYMauF5KdI3-t5Jm0zMKE45^ZrLuYE%w{; z)tA6*%74tW*Bt1+?tPD-zjKX}cJsAz;n~saM>|a!G~HjtTE=@dFJmB+GBtzAvs5wP zoJ2!iS{1A~*IGNbLc?poRbqihT||7tqg$?rP`63*ITQ!Rn6s@?aI4ci22aUUM=y~W z=BC8^$uuvL;RMs{p&$x;bFbSL$>*f7*ickpeD4)A-9|p`o^QYPLnZA2=_es638s4K zZX^?e>jMhuQLcS$bnn^B0QZYFo)N6nIg4D!-kl-$nmyb0Bx>*1fHR0~B-YeFqd^SM zI-cc1L_Wjt90ee9g}9JENcVB@EW8~bs-HeeQLt`YJ^TjtMQ_T2A&Gz_BTR+ zX7Q-bfn9kSsD5b;{n!FV{m~oZHHiLG)Vv8I6s-n_@AFwydlp{#oD!uUl1S@+Cb3qi zS!f|iQR)>&=eFRyN(0R0JofactS*dE6QpJ*te1?+^rmfO7cOm`W5gx$j6vIInL!iI z4|o>b9q!0#dyzq7A#M5ts{1drfbc#eF134L*P-!^yM&w~y+oQ{dot8LEzo++rWJs# zV%u@YYO-*~!?LUyn8y{K8Nvy}odCoCc({)rsN4qzdD1ykYGxnc~2e(Jo5CW0aj&CAECswMB zv0#m1RnO1@vcgk=;}Dqw)cd)Zl0F#({%e=s$6rc7ac9nMLtAPs;P90pVciq|cQ|ET(44@;HuDmickAd#<@)FT!+;I;=~v*tHS?Ue9;&xDjyGx&Xo7da&eumJcA3=! zVR5!TlM=p14iR z@8mDX)lL2lX!-AtO2hv)ycqiLP6O(IH1;0z2eO z1f#Q$F$M=@NPOP;An~KC6F03%X`)$qJuZVcK8{_*9=q03)1G6>7_)G&_BH8rh96^V zBH1lGa|`YVzq@kt>3R`8J~HNoZJ&FWT>kuBY?3l!D_4Rs7>J7dGB6ulzt$M%&J6O} zGUwM096p~mAV2XWY@nHDa)2}qXDP31VlSZktpD^180R^y8A=3=lVwdVY2`PcSIF9f zNL9&wIqv^c)x2;b-SNDeZH9ig9%xnj-tov%Iz5zM#r+?8{M96k{wP8FesS7ao_X=B zWxC&wdGaNjblMf9XxE;A5&pus#-L@}(-`aG+L|@5?GZA`NJ|tQ8-?B}Dk2DTiAflCl!hIp&;KAeNVg$`)#1 z=;JgTyE~_pT}JF6KdFda=^>fE9T0M_I($AvMc$-)D!1Xa(S}~<8j#AKB%QeeNx>QM zMzUPFaJW=~jT5pudGw+erha)a;+T*4${c(+GvaSt=&;p zJh$Un44&~w3lTBVhc5l&5n^rw-T7FPT z7O;5o=0gJh-)md6WN)KD4g_ zlZS0_Giv(5?leMVjPsHiwz1P?rPjq$?`ibCJRV_(ie%yylTM44;r$rLejS#FSg-VK z#a@~PI2u)EzX9`OU?qCOH{Nzd1Y(~76v9L=IXXKF<(&$|f{KqjW=a*omnBq8;fCfD z2C+g~EvLac%pUz_9F z<*%|$5;l89gwoeXoYBye!la@j>wIuoh>wmdxLN>jj7{AvgAzt%?E55z`6POt6qkRZL%jrWeA6h(Gnn<%=*AsEC0?huM#zD< zvdby=Rz1Lzy9MRAmJ6}4@0?&^2Kzr;#em^Il^7OUC&hl8$e(LXxLbQ9=8VF)_Y+7w zt>z*&vZBADKB1>1VMF>dTeLSbW2V_ywExnFKioo86r+3<9z^Rn(g;+MC}Co?D^=SK zhk{61S=f5GiKO(4XO$ys3Q08_nPv(Ww4-;G<*>^XY~8G{?==wCG~|Ya=*M0-D9=0V z-7Vd3mB@JNwRA&bGNv-%@)zpl{E*6vsi&)si?weCZf(v>UbU2`bHpoT2b^=ddOvZB zt<`u(fFJ4x!*^0WSU&!(kl46eVxReZ4d)z6G=5bYg#Hfv3X2yr@f~wRxV+;%$bagmjM}(t+&yo0z>D7U%lw22JW;dq*R)@mJ@| zVSlxf6qwMKNLgL6D8UH^I0d(QZ?BH}fAsr=N{2Y7vYH1vBauU5~FK_7M#pzSq z`gGPV_v-x=@XT}0_;vCz;Ng4i8kQDqmwR7!nugNdFh+!w;a9a?YO3!K@Y-ivZlr~u zAsC<{|GSA9YHpszYS(T_? z#&a<-VMQP8`pY)`KSKv!^kyw!zQ}5{lEt(!=x9I3@p561%Ch|qFZV_H#^h#p8f|1i-^?hx7 z$l8do9OAX_D!A3{Uim#&6}zJN;;2$fq2X`XP)7)-$>2gBjVeJYRXhWbAKf9+mgkS8 zlo#-*nJ5~-jb-CE-LKdK(6X7qwj|M+K3;Gry@x<`K+gN5CE=#9KvNln_}1 zvf$#f_vrOpjbhb9Nu$~;Skn9R33=qEJ>r;O@&Z1vG)JGOqPc^8*D^!a#wQMS7SgzC z^M{1zi3Cmnbpp0-NRq3VP?5wwHgY0g|Ba{1`AFU8wv32|Z&#pNu#M3kf9nbWka!O1 zb)JR!`u~R4ev$Nkby++>f9< z+R`KyPJl|1MKQ$b4#M$5iOwXQ1p=dDg+iXT)EDT)>xC%gAKYLE0q956;351-2PK2` z(`mPf3w5K6RBGU8HvB_0bK}>6i$+hp%IBpK1i*c4Zrk_g+USDaJ0s)$6o!UOtB?wm zpg4QJ+P(Myst=v+EY287)Ka#tx-oGXc3N*hkTrDWUWwoREyB*9(4K*!#?G9Bh+iBK zq`poXn+F~NNe(k@#Pq@M9RxSb=?a>_;8^2Iv%rm!4OUyC=iXV$c)(IkK0lf~*YN5~ zSC`7AgLF3Bfxp2^E8)w~o==!>LL8;pEjZS0@QsquoqIZ`*wqPk{!j>uhBnSNQ8w@s zrdPY#cm8DOly=c``6HP0)WYap^ffH%%O4p6!zWuhB(oJ=NVQc&_u`~odSZI!Fh10+ z6J-}T-4@gIanm2MbyeEB3jD~ptW?F>X+!B$5}yLS|Ic}}J0NRHWW_n>ypy6Z{&p4W ziAYRCp*ypXejw;X;L)mHN@zy_%{F5IeKP&+17^RP1sL6^)(mmCZB;p#4jl z1g2Y5*OLF1vsKIPgij4*GejqXrHhDvR3-XVYozq1!z1)Raf$Qe6z887ux)WsO#L0B zvgFo0Iqd7~W(M-+?KpP^l{0H8W7%*M@%;Z<9CdJN)>sG5b?DHLuHV0~!NqpW!)l9U zWs7&xAztd;oaLYqxFjj+riKi*564<4eA5YB|l)^Q#H#W~_^A;)AyM0Tc) zyoRK6f+aWY4<8#Tt=Ag;e9j98^5MYiYkqOodfP71-+}cA4~QECzb-ip7}^LH%xYv1 zN5sU`0U3@f0Rpu??U;skyowlHX0Cq_(>b?cE3(=hiFu!#ZJ%kI8j|!XSBKg{SzC5V zL^yb8h%y?uh;c<(iy*jUnI)A3cJT9#vs?j?(PVb2V#+zPrr89-NDVGWn*-3 zklsVgw#`BYrU)fNsh!tU`e8EO;oQ3X;ZQKjr#6pGG)_5!{y;R?%Cgsm3_sm1v0}YB zi0}qOKcGL`YCUb^YrMbhPwWrq*1P9%pS-+^=b-uD>4rB63OKBV=tMSRkaO1--{ z3=88KSH9z|Y!fft%MTEBKC^v{`A+1zsjTS%T%V#`5>x@emLzoniUY)^thQEYr6T#& zfx@MqTjkT+e(Q2z|M}lx?V2Vs1&=AI?#bV^LhNi7(1|xBS?@mA6NtNb=GGjuW!ue@ zdKEcwfnWSw4kF>E3E$TpRkbt!y2C&MJc1Q;VXm4cJunL!59|sCKcJY}s#FpiiI7ej zcbvEKkiGTexQ3vvTyHVmnid_)`@sGj5nn_@)u_tXPSKU;OA5^TtpjIs;CUA1U>UT> z04k{3E|UYiu^^SIiigmOAYZ~)f!-{=!{Ya%K(jlj%yUS` zmcKbHkeA$qYgS!w>j7B2!RIfN*0@fB4z8{{c%NU`jzg1H=IJ=lvizV>yR|%JLa7Y5 zTXkHmslrWLHBmTeMF;zbD9?X~({E(fs_*)ZYsdqYVp+VckIsIRVR?z!8Wd-R3aFQX zUo@vHb?+ZyI+Z)J4M&FM%Qf18>8RDX2akCS7_!>7+gRp%;6uGl3dLugwLmnhkke6g z(>&cP|g~mJwOEI|v`0nn>-_PEg)rX%PAC51aqP6t)MnSZsD#MR~f1D|##^;UnU~ zGg3ZChAlwuS-vAAk#0}N9d}$23opMh1*H!rl7~7`MJ3ti%qaF_YFgW9vdTiE>L?5+ z0dW1FIP==qXYvEk*3sdKu9#~H44y=!(7h`^umrTT1yQh4*?D<7&|J1ijDAz$9eobX zEqUU4GG)xGSVc&uOF;~dE?SYw7Y2|D-ta854W?QMrK&Fgh;ETv@N)o6Woh+)I8#bQ z#9?a|QAF!{DFa;lNEQ_oJ4>8-I{od(#T2)a7W}Y{)bp}0!KwAsJBjnm?pvjO{nmdU z=dUa9kT|(k@vP~+y0KgpxiRL%=JeXu++F$+=Qsy5P<1O>T&){^MM*0$H3P}6WX;Pl zF;-e@{*zA{THbQwlU?|3s|ObA3aIEbEDmGuD`gFiN(V%K?U)Y@Gk|y4pRA$<5+s(I zi74Te3U4|M4dmKJP{uGH&f=FzeQH|=4uqU!Rzg&SA?wZn0k1UVJ?4Tw7n9u+pt*tV zht#HJgk2#b@)dAB^KwOFIcM|5#E`R1_;YgtQg$t3nz#ngQKNfX4RIz0>QVX9s+Nza zL@2&XD(7{A_ z;gjhFR{NJ?)}*O_iSC8Kv?XjS7#x-YI?V?B3|g3Xx3_JWDUFot_e!?8sqWI!=oj(m z;gyBi@6n>WrEO2cV?q9+me+G!%$Sp5pmRuqTQerYEt+cWev-VH)B4wBEcd_?j*VOw zSFTXO+srz#h3|%$P4Hc*c`jI&Mq3!d4OM-MAW07ZV3;$<)^UvBBtVb&p#jk8aZw;R*&pKf>5s)L%F<0o@^i`A>TaR{WATl(Ty8lQ2X#tccFNj{Xuk z(RJd@3H=gH(L;(O;KXY#zLYQeng0C1;c07+mkZaCyY4N|=_Oe4oQ%V>bwqYxMEgl? z*>nS2VN2jFEFvx%#97rD43cl=8EleXztD5YWb?tv*!vC1`PL-Z9ofNJpNuyzW;#D4 zw~nle<~68r!3#lzbVjt_RNPPg2#+6J=cmw~R1ZkGTOcJR2lSHb^K=5RnGQ;L>kL;n z~K-Ii1b8bCAHx-`5v2?no& zgB1gkWdUq0VF94YNsx_Hr~uIOR_XFNUGv|-3clcGiNp1Hdj*NP-^xizk9~W{X3}}% ziCqZKX@nkXpmq}Ar)(sk_tcWbO~etI>w|D-6`#;jM%ZN)*O3Y;X~ff=YbHQD-EU#+ zbTc)Nxl~~CXpL!yPaU_v*>pX zueCvO;xUcBd`(k!e+fa%NTZpkI|hhG7AgP?5Mwafr@_lJo`CVR(ms%h=~%kpCh#nn;`iJ|{pm!n5tt zs&q~TT7u^@mMUpI6-r_%RYk&%{!`520K2)VORGT0^sy5${_g6Sw7evutdV_B9u9|9 z(+g=Skd!+hbzUPNL>1Fd&0;ew+;C8*8S7Xd|3X1NOt3!(z5 z7tiYH7q#w?cK;}Z`hX^u-8()@4BYOM%0?vy^C+uYZDJ|}4(ohQ4?#Yimz@bX(j(vq PZN!$ExE1RC-;@6bVXHkA literal 0 HcmV?d00001 diff --git a/img/white-papers/frederic-headshot.png b/img/white-papers/frederic-headshot.png new file mode 100644 index 0000000000000000000000000000000000000000..29171434d89b4add2c822361147bdefe52d4f134 GIT binary patch literal 27448 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 literal 0 HcmV?d00001 diff --git a/img/white-papers/white-paper-open-graph.jpg b/img/white-papers/white-paper-open-graph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc1d954a845ab1bc2ab19eb2fbf8c20b24f0ba87 GIT binary patch literal 108658 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

ZDHXDMRokaX$H$UUqeoHst0M8s?y zK0K^MLlJdz7Em)KE=KGWae*R~aY9c+0e_fKl&j275IMP@<`2PNFjDY?3pA(~V0f2& zsOGZ7P*Dq@kwa|TNpnpyHb@*Vu*JS@_KgWh7=8qV#12p5o*^Uz3Q8IwG=Q5bBi3O8 zMb$&;@q>1pB;pOQxSa55fD8m6c)*(!4Ax||WRc7;rsM~c9LbYpj@;;LlW3F5W)YQ4 z?}UCX>Q94M@C6q+cj*%1`kOb&B&6~}QNm7ucfsYcO70R8GwVPyJIQA*Q!`91FnEru z#|lMZ%~3supROsf+jssQ9mM}t`?4SqrW4H-{tox?OT^(?HK_wciPQFGJPlhme-Qb3 zFUF5*Ux|Zkwj0;BWX09&x`D#a{+&T_fD*I7!2$ed@dwe-FYKIe zybE4q=6?5ZXyik7_RmX0++m6P*~r>1Ytu+)>C-@e25-vgPkil6)frdl7s>qKkTBx4 z{xptOZ8@!Z$UD4e&5-9(Q==l+O;<~cCRn1NknV#?kMaL^*Zsex1mcSZX6wrCU@NC& z{j$&Z1=&VRi!QsTZL%O)&7MD*SoBtSG5{{6OzfQgs4!RxYw^70{9rLH$93T^TCJL3 z;bZ0iBKPCt+kG!9VCET#| zsBPw%&ZDj7iH5Qe0)BkdfwZ7_NuiBJQa=$fd2BJ+u^g7?s(>*T#*(oZ;fNbuIuvPo+e83lIb=V}Q;PBi#IJ7JO-XX=q&k?F|-$;z$v-Uqwur z7j-kPO2}8CjUp1Je@vooV4BUQayU1%%b-MY%qG2TK49u{kJ6~{?c98Q~gDJ1R%`9=rm-W4i)P-8cciZkC z*_oKGvj65}4_@Xtg=~EITVCy52~``dfmuW45tIVa(@9YllimiSJ^V1hRJ^V$As~|e zhKd)fd>VPl>$OutY zN(p~6n6CWj0>%5|W4iu`ZF=%LdW4-aza_9$0$;le?4S~?1^6Ox6K588{Wg3HC7y0# zIkxq{)7fmZWeu#8dSKcJApkElgokskngY}U)d3KUv$$fCGr4pm5?D~tF}*rw?l#^( z#xYikTvjBmz(j29ZPzW2nNZm*%=aT%fF%_G1-=9T2DsCm7bEzCjW;9uJ)oe1eK#CHFAb~c;f@3~;shL3DF|dY#h$>JvQE0zG z1My8kQEE(uGqA0aG3VSlY475?+hgvogMnajnkZ%hy$@=7RO{1Q`4u(CFLf3^i$3@^ zQmFTe>c3Iksp~ywe-CzgFO?4n>xD8wg+~c0U;2#W?ltQ$`@IrFypXc#YWV==VE{Ba z$<>gZUARV$aziu=VC@Vg2eBLue?^1QOyc5N#}v+D5vPSf!%s*P1`5>!IRGlaxY@tG zoCp#(0Xlukb;QGO9nJMMc>+J=QO0TgXf009=bwciyINxSf@Cr&y3=7dSpLR^kP2V4 z5P)3SFJQJ)n7lLmQB;E#zry0B#nSH{6t$oD>T1JXLQXy#46d?B5PK%or+8~F=@x|^ zd90yK%ny=#CSV4`v`P};3oeQ>NIKP@Nr(ui>E9nriYNd?|EZ{u3it;GTp_7X@Fe3? z6B78ECuE#VEsN_mIt$3*Uk%FoawM2jbMxK|x7lCwqh<_f%C ziROp`r^9hKuQ4@|h%nTW?g0A6;$c7qKq3sp)@j`XpcH1N*(}YpHQ(d2am$wjLdL;p zd;e#Qynv}kJN;Q28Q&g?*C zD)~zv%Lbfb$ta%gB0e3~g9$vtV``&+G)nfSvEzU6 zDUZMHiE>OD1_+zB+NYF2iLxRkye<wl?1Kjj=vvLF_QHECCK!9^hu({;0~Ob0Zp|_o>SHfI1*;QgmJaq)4&r> z<-FoEd7BzT?3eWoa_1+gk0l{y=N70xn!x^jbjahwOx5UKror@u+e0MnCSw(-&Ya6s z1{aw5KM?aXF2E_T)(|&oq3^wzBJfa3;PnCS&g$<;f009R4QQ-*R!}1RJ5wLu#NS1( z?sbihF%70{&A~u+D89C}7IyDjd2;OQx00klfW0q>p(HSm)(ncjEEv1tFRC`)8(&Rf%{A6pKpRP8>0`i!U>>mvES!F!G2aXJ_6p4=ymlb+pq z-+{Jk`ETyPbJYHU=z^#W_bhHfug^2)w6A%9YEden2a`9rZCo*IQ8{E_rY73+Y@|MO022EU=WNY@FixPz3hBB1 zEh~lO1PvVN{eL1xfF%&p^-D)n)gBdXW&(MXMxV25OGv|`>n;>xv}R6-;cq@x+P3Ys zzFBR_uiNlx;TtdNgd-0;Zwx**V_54HP9So>h1_Dx9rf#07Dpj~D$Xfa^;uqEv}MuL zXre6DMUAAp{gO=7+Z)1YK*xlV*!Fz?t# zkIRaRp=Nsdg|xRP=j{lW{Lj3emcA#3u|MrAO+2itot<9qgaI_C=kb`{0;3q^^6IJ= zO8mxGeDBu+#Q3kafM<=odD2g99_?<{)4ys(=gX z=7`3-YKSDIu6$Lq!XQ70JwHIS=*3k2MAf?&J%Ifthnr1D$6W)au=hx3Q4XcsIH7=R zh~i%NJ(Xu&4h@a1?VWybr5U;!SF5+2O1zPF9A`9Rn(l znem>_JjMGw-R(K2yr!R<^NoNe9W#`8PO8L?Qg)wP`P%~ZpvQ`#jpzHmZ@^gp9axO& zH!hxOgWetAENf5Hy0flqnF4fS2eMLLFgu{KK`Z3sJd}B=@%i^`LTDnr|JMhqWjp`x z2cl_<&u**A!>|vXyColF*H~j-FNt#^H6zh1h+akja8_Esj#vmZ5ILG>!}spT`J~CO zEmtl8TqL{>J(bh{0GLpAE0A?|g z7siq(^ZJ5tJ2jheUjiqh4;UlM5@Wyfl~_algCR*it9UV`SVMnIoeQ;;SfRs19THiRMYfPmpgsQp&k&1Nt-bK22)V z+x~WrL4`T*tN&@>Cr>;YG$p~?ga0b%{R8o}A(U-ZB}dwWQu)8Q^L6A$&PJRcP1vpu zov#*n2E`Z1kO)6ad1Is%)aB7qU0UsMi zBIvV0NfeoWRKvVKWP=y+@)om(UygCOT_wt(zuBMyz$WqC^v%Vj@JFG@N$#Q~QgshF zCouRUFNuo)C*m{{aggYYu3%t}0OWB?ttrJB0j&F{VXOBwsc5bg{XC%fZTYw;;q3S zRS7dfS_qED3P`vK*N`B{8abAys^=?2O;vIy(=EIdKCpgR1#9evkMSgik80eV=jqru z<-UpX%B+9i%KGBkJW?kfcwf3X@Vm4u*vJXWDictaIS^_vf+FGEhH!(@K=ufDIvh|i zS2Xpt77x6(PDL>iGP8CfU`sAtzU$eSCG2B7+ZX89@hp9{7PlyM96i&6ql}!sQ6$gJ zwG+5pJlk5A1LR-IIn&${sWDb|E8AT<`ePZjo0wLvb5)D z(VL)MJM~;?A6Yl51B070)lv-1xp@Iuz@Ay9M5DI^i3D9bh=UZSbcz@6=Hnkyxy5rn z!S;wSwf;KJYs=u%w!!7==vT;#ny-;!2&n7a+5#|M2RWGM z)L<-&k!Xw=`T;u7tRIMVG8DC%%=2&9um##*m(Sd$Yq*L1AS_Bl#xLWuJ4=0YcdE%&pUW24$3y0R3&E{YDQgvPVJ_3ukuu(4az zD3(?5n)IgOO){mUNV&8>lj*zE?r7Sqv+^)LkQF$8xO7*NEiK)G6!|$8R84uG>T3iY zYF&%g}`b_Y7lj+8o*IbpJ(GNjk}MyOE=D`PKZRY8Mu+TpZ<= zu2kIJHb-|`rKPdf%$(-NSW);Mm5NaGtt*)j(luqCdcTQ~jJ_p&-QBRPgs<{~IgQ5b zjK%4<1kwd`^T7`qO85N2w{3U-fz%&f@V~He)_w9Ad`{8VcZF=hk1aN?GPnH$xf8`> zSXKTs;BL=~JxNX1G@(qrwD#d=Bk~W_-P|Z)Jq*fik-cXN9r5^zTAIWEP6urp@?zip zx?&G>9A4o$$oQO{qqR+HKq&MSaRWQp>^8#O(H{6P;ahFl3spNYnP;tVCE4(h{ z7smGw6meyIW$@opps-`m)WlxP=R>`0PTX!0L0a9v)9@iUr~m352X~LaG45ALQ+KO@ z%z;}NL-*NJHa6v-5Rcp}vgH$z6LIlc3M-a(4FrFNJKo&-vb+3?^NY>4=&Xo$HJ9O86+tDMJG0t<2$|nhNte@Cw$1eUXFKIl1&wG zJMl_!&Zm6;7&r^WbWVoI-!mw@RV|F3H3-}V#1;WkKKsfCOM9G(MV7D&aujf8wx3?!eP(&3~CC;^4Qm zv<$EgXCkIm0RU?&zMtU62$ssWrae3K!q|atw4rxeI?i?=(tf>XqST{z@ex zu~C6HKnn`2xri%Lu{9F~L4AOVuM<+6$E{Ba=+{aRGn-xl7MC_K8^sr6gXLq?K% z(n1kk9i@0pK>!^vLU->!)eGmy#XrzTS>Q6ip_d}Vq&=aZ`Lm^#RG|rE{1pAj>%vpe zCthnL54xyZkL(8MkzLIu?~JwbAe__6xIvK-qVX+9tuoG~hX%%yhG0O)ElNse& zcINo(%2=ISRRE-`ACv_FkAriwe;TvAu1=}eTw2S@=xPsV%Np`5_|kXoNBUDYSrU)o z3^$>C>_mPdS#PJB;~vTAMymL@k#3N0&1(scTkqQ2V?vFo(x>Pj ztcO_T16vQkPWy!Y>Nh!?iS`;y+7ZcHGT?<`8@{^>r~g(>#t9{@r~u_BktZh{KF_iMIb}`7{7UFtqj(~^&)sFfkya-^=qOb8a(mzSRFYF4@*e(_{N=(hi zMF0R!V(Q06CSY_Vr^BIKsrQAl32uB}^M}OOjMT3<1+rjBLj`HANvzYxF)pe1Q)VV5 z3LMNu!(-zLp>hMHzyY{7j{!N-?A4a%}YdG`9BD-w86WefBMODAI-P zca6%n#jmhF-P+!Axq>dHeFg9JdR5tFIIO%6+QfDL$SvvdybOP>jkSy{GUE%*<8mFd;`UG-5%*AF6Tb*^;h zi+vQmYS8G4VtJfxlh?N@Zh&}Uovw4U=CAMrfG&nt1US0$r5Hpd?&>L2_llFbs6hFx&zvuo+yJC~+E-X#S%}VALOpHg z_4ZAvr~Y+v%YMp0a=jW6v`uL$WM-204ML%Ij@6#W;UTK*?E9yqPzYK+k^w*oT%E~Cl^z5{5YQ>|+2`hSA;f!rQqY;Ot z3f5k3I)wTDkPVd_Es$AmIvO&gmPi?%`;3+(w%)qouCaBI!_D3`>LqLIs2-uJNg!4HNQs@m3+R6P=XtUhg-X zcT%3Qa|MY~XJ_X~N6~tcfIajwfS4|QC&g-B2=j(I1(!_C3eT6N?!9|KTCQ8$4Vn?< z*M|c?^r)8SpHl-N3!iunr)Z*jckb2PPxR!JwhGcv1eR>L7|cZ%e6Wfi8qh*++3-EU zFB5yFo9i$e)6DBzyD}4>W1|u*qV$6cR+a8~E~+{TK@Jh}H{nV(NWb(vOWZ23m+}dxA{dv`Ye?tLz<(dH{V@JxJo%|KVTJbW zoG`)BNU&WB8nsoRRpRpe!tNR50TFqvqtkP@s9=m_I+jlwoR(q*?!~m7| zb1rvo_x6x&-bJGjA~A`PCB@2Mn{^g!K(Cg!M}MrSE%h;D_$E7|ZnfH=0BtGV@W2;mK;WtmCGq z|3;m{xW>{z5uqjd8(^VnUpJ{}oBw(LBKVizfQ zkNBD2x$R1tF}ThVJ(T;9@)7w0q;POaMV9`%CN1s|qeIB|ROVHHK2fWhB7Gk4gN@;h zM1N+nPYm?3o7{mAY_2d9Cf#}GpsV;&Dm?PQPUHEC;=s}kwpwoSne->su{9*Z-!bh| z51w}Qtsd|Wmwx*F541^r?XKPRBj3(M{A0e&*AJ9Co=bWEe$om-`nefl({FI)!jz)3 z!h|$X_@XVRfx!A}_lPt?f3&{2c~>;9>-I(%GDfqIE99@bUQa87K77O9&e7-k-R^Fi zKu`+t`U~+X6Xx)7=$+{XU(RwALI7sJ+9sL{#AHwz0Rklk3X@c^K3}z$o_`c zg~0&9bET~*biOVdhbynhuAnb-=1pO@Nz}LQyZFD@dhc+y{`l`dBKD5hyMmxrsXY>{ zt;DEZ9hA^gv-S#V)u=ryRVl5awW&ReBDHIaT2-5(Mt|pX-`9Oz-~0Fb{pk;`oE+!8 zU*q|FKHkKlei~VO6uTNTTTu{doc~Z?590fu7cb;^`eSJLKqNXpD7Tz2v-7mP@5ktp zkkCZAL=ke%)e1LCuX7r`ukzxsHkp~&{5_!ica}#)fYV=;OK)5>q?jS4yTi~)VJ6XG zBa!0?#m)=qnMSrucm2n`r?~`%qFlhUnv3}S$)4Baog$mS9xubw#mtF9`iCiMDeyv5 z$L~D0#9IZG0Ti8*QhldR5#2@!Pqf4x6^S)lN%(8#6rP%LWgS3tP2()!m|AW&j`fy; z5uYot={<|JwO^3vopW=7m6}Muxk0%-qs968$o*xl-^s18C1>$4#Fwk21Wwy)h9)>! z6wps0tW0l0)y-7UNJ`xBXJUP3ru)o|waoeRPK0!vh_`Tru?v8M1Bitsm z)#p1HR*WnRI*+|EkN^;0vUgE&JTD1q-wX+oZ6nBtkz<1F>vZZsYAP3yQTbI39l|t& zk~0xv=wxhPLnj81rAng#_N}mEHlQt0e;F)%!141wrDCAukAu?^)_))$DM!sz3-Tzw zeKfORQG98#?f*yo41SFXxLg+e?UYnOhg?eEt9aTNN!V(WjkSngiWBx-%@Z<* z)xumAw9!75L7yfpox2464Q(oe+AbuUo0+fwrHFKUTC(&5_ zF213~;X2im70vB?^}K3dC8I%Ek>G~7JY4RbP~aS&j`~=GI%G5jo9E|~j;C1LXDwTT z_X-P@l&6wpmJ7vy*a6AwE!9C-=`4vtkSmG|)Qh4hZeNk*+}UTr01sdUCxTo!6f`Bkt*>eI^@Z6;jUZd#el|xw{*`h3D1@av0;*L zFGLe%xhmNEu zB}DJ%$(LWuirZSw2NH@6+{GAS*heUSxA^Np&M&Uy{bxI$W-ni?E;GpO|5P~0n^e5p z#YUz!UU(hveD(3W%!0o{58n$*g~8$#`J zAf4=-U$C4$kF?PQo|TRy_-ms_Y3Y9i&s09P5WdN zduFGj@#3b|il@JCMj_p&M_n;9)lXd9!)LEog{RBE3I|41FPjZ|!{Y31_D-^Q8r^5H z3;V6&uFUIEikVh!w_Pd4`BNWYAHtmjQfLIfoYIY0UJ0K1_sQSit7~}J*cd?jX=b1| zO5E_5jId@ksjHAzE1=khTr6Hh2VF(@aBiL#X#CAm2^;L$lPWr9)mLY2=|4&l(V> z`piGN?X{bkYX&*NJh(ZP-UNT&Mz|rFHcwmBdxv-002nibtG-?r^vQ)qn7V8Ksc(#s2&(-_Wg!07I1!56;P= zhtf0PxHR^0IyNrToCuZUqMOOU2Uuc|2oo#2gqD8(t-%o19tMQ50rf3($L!;|x#^~fJvR;$1Lt*q-zXOL zqoUpyr!IpEb1Nfuf?3xkGS9QJbTvD}?tXggDuSbeq-|=K{fcGeH+fNUwej>H$TPp3 z?_6u~$j55*I2spT({cP(D=rs8yK{#Wln-}&Jr0#YjivQhXO;Z&#rM{(x97rafGJ=o`5;mj;VPPmnosbPu2oMti zD)dH$&E&J*cO)co*8Up3Y24-tn3;WXlst6c>7*l)^LeL;qvUm*OB`oZNhu8KA&P%R z23T73Vl4VCQqtbTc{DL%@CV@-HI?Orl#y6oNsk3SuaTV2-^Q~IFXQxFAes!PzeJ5c ztCgy!e*b^lg2_cVh`}n@y|N_no=U5#&vhuz^#v=yjW(W!D&}JX_P*RY`K{jvRnu24 zRI&`;oaeteU!IzvD3fbWf@E#w?} zIbSK>a}ngQPU=Mw9GkTy?A>Ta?Q=gI`Mw-jPrp`I{fGpfTBPtBLHlYN%})_X!P^_I z{w^Yjnw*NMP6e&eg39Phb3Yz*n}cr(vyjW6v_={8vKYfP!LhvKEQJ^tq+JdKz9AgG z5YFFc1ECsq3g4>HBIVa6KO)(zZvj%siFyEuf>n2pa3`jqKIF>_9?udRG?0G`drwV{ zf;ch;5}qw~=_IQP7AmS`NqN&9KF^;SRjn18)_k^dJgdU;Dz#uum+5mJ@78SqPEsBm ze0X1O?~1Oo@qWyV+OzhCY)Sk3@a5xT;I#q*Sr@j%o_{Fn<=YANN^$SXR$5qYD_AXw zu}RI3ddK>kxd9H$FwF_&pNr%udMkMvFGpCE;<#&vnzg&4Y!}34CNg1QuHs#y2nypd2o<;Yr2P3@OnAXFnX2O!}C3j!$&6Yf^yl3ZX z4UwRhY5Q6e_sbNMv8g)NQLdDb*-%K*YE)(~;JRAfMl2VCpRWO-wSA|L7s*z#=6KJP zB|l2q)rF{KM#IX&(3n{oZxEH-|2-nO*XF}@DzX$dSo#lyJZ6>i_GZ@3JK0MHBAMvd z)$dfV+Kc;-srGl~+-Y#@>8#|?d?+a#dJxX|ra5lRYx9+EW z$u}03KLOB^NT7^i#3a>!y<+hX>Q~hp78+Eobbc7P#6Rb1TLI_kG_NX32@*yqg$At+ zQ}o-_djmNU$E=etX~Cg>mftD)KE5S{$q`&MqSO_oqJvSM>Yi&F1doMB){oApl%qeu z1N3(^!J5WzO!|8`Kezl*cwYax$#~L?0(HmyF2h{JU-`nn$N70|eQHydJgYv0X~;x#D@;)pqpk zo1fv2sHPG{t*)}s=!_5M9U>$)ai&4P1pQN|XA{bvOO_YZHa@P;4j`kKCu*kFyn--# zpm-32Z}yDInkAN+J6~&b1xUU4+|32d7Ym-;a^(`GG>wPqc#zTgg^G7y_csPyxpqd| zc`7PSgURX#o#+|upJ}z^+0*{ZUH-d0i!^H`ujMc5M(=h?0| zGuLvCa8*$9GomOSAqEEn&f7KUm1c8UzS%vAS)iHHRp4`OGQ$LigTzQblDvZ5^E0~R zm+7|cuJkNp%ypt3>?vn6bQHY-2#aA<$4cM6v;Y5`+{r4>E)V+tXlRvJ7pYsE zMx6kW8*|;mi#xSI8ul4riJrUS2sY+rKYfv~HE*!gi~>)^3Gt^!8R7}b=^QfSEOcLs ztp192G!)XWs7fxzd*n?@J*_~q4*tF_L8JGJ@~tFavKODw{?3gljupGIj?);XC%Rfg zJw>c-SuSuVWutMPgjM}OA^s2$z!*s!VL1)E>1k`EyE17|Cz)Zux3`QEqR!1DF*FEB>`@W4jeAJu@ye zE=r|&l+@%S9M%idpRpHpaOpmEo1$xb$i|xWv^-|!{=8=`I0OEdQTMHs&=N1$U+b%# z$*{*ccvLZXUMN`ecS8?Ox8MOEu^aoI|EEvU)?~xIEpCGsHv3$6S#0NT#N@(JqNbWJ zlplQOoH&0|xJR0~ud(x??Yme4Z_oc&8^qo7UJ<;Kv>W+9&hxX0#>@X%k=*P42Wsm3 z@3Q)XVg7{<-&AA!1ovq&b60{{$m+OEmo4Q-_03<6zuifZClM*9;bKHyqt{{@J3amR zjIKe1Wu3Ic-;|EA|as#0$fu-_9Jj38Qo% z50}>KA(@)}NVq0s&Q^6ESMN1XrJ1_+vluG)8CRTG57;#VLUjdqheJxmWmE{(?+dG4 z4kp%J3(R8w;64JYHUyhl8j?x|X!A)jSOR{Tg4p?uFamKsqkZU008A-{t=8xriNhPKZ7An zlSRUzPS{CqO=z1;$}&1!@4Tdi3;>8@#LnYPThp0Tc4Ux!3!HT-*|?!k^#=9vW)JH* zF;7hI*(V}>aJ>zlG$BuJp=y{#b#Fjb(9h~S6a>P&T3M4GG&}1+*Mx+BejRX&dSP}< zX7I;q`*vl(|7pzW+e`7pX>Z2Lt zXA-WQOGmli)f?)vZx9Dt{AjhOZTVp;x~h8hZB=I2DjSaxIUo_Y1l(TW@T5kZEl1x9 z>RK&da}fYL8b6qf5^_v`yOT6dl>t#IEk^j>0b7&lo8AU^a~zP5!O;&K<7qOT{m*5i;%g^?RE&xeF^w~K*lHm+rme1T_MA+(vVHYeLKFJ-m(e)8 zyQ`i=X=HIP9Yj8@7NqVl9XbQT%I1>AlVeC;q7C6u_y_ITi*g+Dzw=IR-4S}10o9)Z zUEU$*jL?twj3h@;%DyCUIzIA5G7Mu#x2}cHI`F2`e0+tZrea9P;u!FtD(X0Wxup40 z!2;W_IOl*3GE$eG{~~kJqjA6VQy)YUhA7IsbO77&T(x_iioK&HW1TLbXTY#=hGbS2 zZhk;yZ@XXE`j;N6n_1*H&GcQoeJ;ro>dthA?!)Yv5%c0_y~!pj;}zaFE@$Z-vVWlil^7L&-!5asfgjg$y&Y@+dg!2szXx@In6*U}>rK6aq*68@|BN`b52Kex8?zk>KZVlGZ{+FMx#TnPAziuGu1o{b z)}^yD;{6^YjYr$Lr(f(O0AqCJ!dj%*$f=VBLsc}b|H`iNd4=+Mg69;>ytdpF&)g`| z!b0*=i{gWqLN{A{KHfD?#psbGW3{Hwo7eE<8VE@Z;$q1s(PZ;>pL-B-y+^2q>rSDB zToJ;8%F$rAfC-B&^DqpyZkd;9`BS>Cg@3)Mk`&M+kKzbVG$Y&>d$CP^&_ zHHVZ|{$P`zc`%PMb?Jn2Rx^B=JA5RcizoFx4e6%|Qe2Tk`dV^4AFJXnePDm9K-Z}< z52tx6&r@3u2Cet{q9+i*^1h|cL zCo&0$b;I{Iu>1p2wGi#pET$%RY}M1J`JpqTrlo4M%(r+9I!9Q}`nqm=vYwg#nt0Vs zmP_YU?pYowZ$6E7gp-p3PQ>XjhddDX^vWZp$+>n ztGcABnOo}2c7V&O&Pk88QfVkX3E-+8Q$_BtbYJ;aKktk4rY`pndQVuzM?QQpsT|F8 zh~UMQChM~wvNOl^;aRrkD)+gFVG;-1F(g2OR!mV}%%@C=(Jyd7_{#_{*vRf#Z{us$ zS$DttWwk;rKba(FysnJG2%=`1AuQ>QK3J~c;X;|?3I|2LuTa?E&&7lRG$Ypx!t zQ)4#g_`RUM-;&ezb$s<6Z`=wsf#=SSjac84#OIjjyrZbVY;!x{bxDre^nd_x?>FiEdn zh9y<;*u9@t)6#j*q5u0EA`uA`mI*lN8)0f(%#c!YNM5x1(p9P2rX*qghFY05;~nMK zvs8q`K;22M_*~cz6XM=t+}_B!8qCo58T7(wosY?1Tva@er>4<$eph*});%+x4PvCw zA!p4a9cY(hYw)Mn zF{b*yd>)}Sh5>!C3&P%g>i1kz zJcqtczmJm87o|*NmO-VKSh*ES)YX=SIP+zYNh+4yJEW9ttA%9ddAqHN_T&`=Xy@w$ z;IIaPU~~R|Ag(}47mETU^wlJS>Bgh*zXT=#0FIprPjNJ&gFHx6!i5kq*Xw=cimGPp z(qB=tpWsT<#`bVki~WZhcgl3`$+48}vdaRLJPf=R>;d`%V9E~9F_c>Xw31yA2GMK( zOHCyq02e{4t(ZF=+kXUFvpnf` zd9w4`0K<2e5pnadyDh=qXsOk$P{gY3n_patB-?eH;`3MKq3xhRu@^Vfy2H3Gbk=(s zrdU>XZLBK7W>}$JOw-}M*Ta(TY6WyM)|QKE>ZiXYk!i&JeZM?HdbJin5$<(HYDvHR z&9*|h96_Q3qyumt1ErF`4zT0A58k_!+LOF@pg1B+rJurb-Ma9Kklg&{0`>Z*FCG7y z(Sw!X&2N6(PjdXfWMz%4K5P95_t8gonks`pFbfK(Z{(^#lmbFKLsa8q5aB`bMIV4E zTpQ`P3RdPBm)lfKs-Zsoy?{9v$tjWr>bw#_G*uVzRyT)z6Q$;s7sB~4u*4D%u`|xp z)a?8WSWwChdX_S8W>l_5?SvrUcn#N;Z^7H*JLMvLw@`+F!&cA%My{hzp$I5Q^|H5- z{Ce2Z6C5M9b`zNjfL94MAM0vTa9)&OaiQpg@p2bP=zAqO7Fs7Vvh8Sm(Rv!fa@!|LWq5tjvi_9GxD;%hYt%Or$stB)>bgTAg|M4JJ=14 zw@1f|Lx|*LWRPdcfe;k}R4yk62l&82;IVwK=-$GE29 zCEE->37YZLYztsBn$y2|goDa&ZlO}MY|o*&IL89cH0wsB9Db5?_3F} zi|qQ(xGVW}Wxf8i`~nR$h}f7N3N&H92H@hIB%i7oBtBA3H-B#$H&CBT>F6LwOSQ;n z16l#00mK0gly(V&+Q3-wXn;mk_VC)+2tBsk#^;!~2FB4o1c|qEK_SyqJWMfMPxOLp zJB+A?y+Ui4>|BMe{YU$@cKke^qamFt&|kj8a+O##&5m`#Qhn2lP$ArmiY}lY7lF`i@B=XFG>o{FCJJ6q%JtRE zT~ut&9l`IVR?0)7hQhTjOiX2aE>UF8J%PVOTl}>(=$7B`6nuR94#X5+*Mc!k)$Zmd zT+@%sfdgdbu@ZloU8EQl;Eb;qfBxegj0xX3s)^Jvo5ZFlFXe)mm2j!7brYh}&u6eI zX_FCAAK+k}x^cE?>7lOW`U=(blQE4HT*YdQf=At~{in1@CONihKaVbbm->Epbz2?=8!AV?9o~7wg4J0#QY#hon#GvjGKwLA z>T&_2eNKwDzZ<0WEg%&w5G@e_rsNSB4L1rRNUM>7`F9>9>w|n`k%nlgho=OY6ohb; zfUfnS+^bJYxfFjL1#TmXpFZdT4cMYBvv*>l0MNPOL9f~di0Ti(^x~q1I03N9kz4U( z+j7*>cSsuAak(aiX9hj$NM&-yc z);^q#hRNmdGpCJWak9lk>=Rw;@Ny(UNFG;|3W-2*_mEKNTAbl9`dR6bax{7rrHT8s zV6N?Y8>-s_F|H6QavdXpyF845FJK=#QB>MMuF1xOQl#lXDMeJE6a`$}{34+|qp7Cu z_NH!*9P9y<;y2DgO@kAZ24u(Fs59?qWIp5cN*=~l#FPBFFmU+m5)-}7`H&yi!VsM>PJ*y`*51I24&ghx4S zSXql^-%{$bs~@pQkO|ZBxzb3Kk002Hnqde9Iwo;{aDUn&)<4ef?+hupYT9{quCk6z z4Dq)g6WBCcBTRVju1F+B>cajWOK4{IjOEWltfxKu~cv@Y&c>>AEI6Znk~gC zD8d*B#PFoW3=qY=)^uvxKKpd2sre64Q+?of+-em+Me&zAjksW5sJjP29x zw@Oo+@zQZMH4MU2-zI*dsVZcHk>5ECPikaH--2M$1Es0w zKVgRwSvTzW+3p6;*QXvgp|h<_av;FUJgPk41_X>Ly~GHor&1MsAx3Vnb;i7yd*6N` zw$vP=dSmo3VL!-m-p*ci+S7&ls~h}sych|f9CKyw$*v@Hy|#3C#WZ}O01zz}B;20Q zN{L31_l&Z|qS?hDVETQ*8p?5c`_(J8Z0RV+vJP%o0F$m3`B16*e?&eKUO@g+xcCRYxZK$>sP^+A2w?7{wV#vkoTkalMA-mD>GIKxCd-mRy$#wPG7k}o1Kih! zbEzLW2l@$wV1gMK8>|!~XX9FaHC)ah!u*uS2`p*uY#Gn~Q4Hf|w&k-W#k)sG!ZTK42{?So5OGG`M z)Qv1KUYGNBnjG`90b82M+USz=X)p@dI*Z1TqLxz8e&#?BTf*}x%)LWRJBl6NarO=y zAo8k;IOCx_6K|fzPtclpKLuNPVPTjyM_`&QC)-wV{qnS-W{#!ZFt{mbh)hyMbHM3A z?-5g<8Op7T`hmjxJB8A&oOh+wg3ux}21YP^chjrC{WI7GcsuhEu77!Ww%YS*)*#;T z@+Yq2bvn!Zb;W~pMkrM~DIVljc&D`SAe}>Otg`qIu8cw>gLEqrZ{2X ziYyAa&08owLjtM)5GY5HCj_W#=lj6TbpSfp)!YZh;)ByxD`k(6)&fz!O#F+MQR@M# zp}2f-GFXhtZr6#@-W6)!8GES1Qg1sc|I4%fqGo`Q#bx%`Wk>scQjr!p@i3-`FFKzs zIw6TU%4r}%;})S;g5EKC0Lm^6kPdsPCh->W0!1Lz z%3;{VD1)n{s!31zl*Lw=>72Eg=>$A&{PhvkkZ(wNS9 z8YvdlmS!Nz;IG#rNTvxAFUUg>yadX4&<7*KbAsps8EN0W4YuVY9DUda?D41cnK!#i z)F#qs1sK!gU7^SJHf;P@m^?120NJj{fqM~%wi>IbF}Jlz(TyaBqmkcqm2iwOd{nsO z5^z#{ZLV&r7ErMG<)%O2`$&siSuc_UK*q5zmXwnvefh|*X@=8QCft&dqwK#y2RQ=t zAn-!sF)kU%LPE*NaTqSx1(5%!KKZ2EAy`W;O0LWQaxDT#RidX|-@`p{02R7IKJp}z zQd>dbDL{J-HE=!COJS)YD4@B#_0Z@eT)D{&as=PI&IsOV9ON0FK1Dp`OHL{(4#0o$ zc|xEEJ^*ZB@SK!&E1A2$Tpo*Yi3(%4C}!O^)I2g2Q+(NfVI+ycD9d_#SJTX!bZ~xT zJpH{&hO-}zX#=Y56q^3FK)m&rTUNognWyXIHHQuBAmW9R`7UGmk?GiWO*^jlub571zQ~RQ?8Kq+#1ov_4l1eHC6={Fnb=Ke?;gGXni6ym> z!CQ7_7czs-7e6(B{!&NGTwi}YIp~UvJ4^MFL7rNQ9Xd1B0_Ixk)ry-z?nS}%+aK?F z)}kT-BZoAKPoG9AKq24F?R87*s*!q^1iZZO_43XeO5M5A^mg8Nk(+E0ZS8G z45!6jDSLWwMVfbI1xPhy2Clm>fL4VGs9sC8XUf}Y77{sbb?s@~bS24!)&7%|#>cN=BLe&GkCz|;btsEx#dR6M zi*J1q{J4G@ieOHmBnBcdA7Z{he$qM7>c6-Z?m?qK8teF@IdgRROf!=>3Ql_9#vG9! zyW2+6{N)?BNH?#7Uk?zh@TuM}a?@=#Plrph-?s{68cqSqWod*xK5Qczr#IHE^zOJ3 zS(`ui&ez;q_EeCVR(?0&BeF(K6?^>FWF_htK2pw-)!E<-B~Cq>irPB|d=i|^c}}oj zE3N6ki$VN~`!ws14-l6oaA=v%Oaep~w3A-sQ*-`$R&`muRUcAs6;O?L1L86Cexs%d z7I+rN969pu5vYMZciT0|8=b(o7({H=N|(}{tF87N$D2s&qd*;eiR6Jwg0H77^IsdU z$q%Tz-ET>zOlo`nq9M<~U8GN{i&b91^2C*Sb+)R6wbDvAm)_vzfrj#)t!z-Ql0ov` zIU1aBVyCp0LNa4s9D$nZ7om_NAye5!6?Qa8ajs-hJ7D*Mu7nS6zyD(JxEZIGN=Km) zw%n&-Gb_I}7c*oiUp$bxOC8M6XM}k2VSaYbW=?WpGmAZ-n#OHB{k_OIcRcw-ZP!;Z zw~UXjRA;yQRjBDZ`(iG3YNN{1mEt~yS?%@V!sg#p$R-`^@-5jga4a<&#JuS=ovA2i z{c6qC0r>K>+8br_{kPi+JCw|lJcV`PN>94xec=q|ScKxRL}x<@MYFt}ZH&Fg`KOzr zd3CVSb~T?;0N|buj{aCKD(HBuKF$PxB&idx0GMrdzxk-oiSsj{EJ~i z^cr?p;p@d>hXl`;mHg`7Q?onSQvqG`E+Q9rI5j=}_tCNTXdV%oq@u{wPs?-8*?jl1 zNSCuNkaaY#@03yd;AJ^ub)|2}qVg^~yodYJloGDK1^oj_(0R(waV5;{M|PB--Z`H$ zRD3s-D=}GueX&U(f6wTsMeZzfkag2*)=lY~U2U)8t!L~mmUZqoSRXxL38zX*=a$8I z_TcL}Y{nmo>Za;VGuY5iJY24f_3Nj%^^%fP{$Yfx@yHs`JsE@D?A?EDxn@L(-Q`$a zkm{PzBhhcF^2Dis07u3*UeD5dC}t1>PQoy|i_!}@lDSNCLaNL4O%m@#LqbYnf8y!Q zqC8?6@{C2ZOy0jyx1PWC5&h7vu^J^Hz}~*NfPIzUi{btUx(jily+pu^K>4IdA>|AZ z8Up(ugRCO=P%FL8(8O^)hGjKBJu(ty_qq|6nk7apYW!&?;$y0Q&F1TI#^LX9f&q%0 zfA|bn)ze+=KbwH`6h#ZcAH=r;!n+OO#L|N&_Q{&p_2)7@3A^5BpTS%s4 zc*kiYnhVRpsdq@lEfP7?O=*Gh==vS72o9Gr1}W83K}+lx;z6FfNLnD$GEiq3C0*Mc z-783r<&cdhBlp0-Kczr;ZdKw*UC4T(O7vvLd%*qD%Fl6wh^A`CQoJ&+p`mW_8m`M! z-zba;$)|~6Gc*h$FarZcglw!FNntq&pFYIth6jcb{D7esi+oj;6q*i6zP5MI%I@G<2EgFfX&6F=?n5!0yg-wpb-To60o zG#XTJg3HWc<}@rQWrAOPSgZvn6_g5F$YFFNrY0lcZwL8HL>y+qZ9mwU<}(803Gssh z{UtF57u;8(-(Xv?YOxSCh#?)>S4%FN)bNvy72juC^au!i0S_N>h+Y?)<}Z$kzdAa? zz0rgrBe#%sN-(g|{$#k?5O|It?L9jgDR{T*n?O_%no3lFL&Ls?{U=O}VL(R{A!|c4 zPN;J?Pe;^&k)!;{He}tqX8wRaH8c3lH2Ps#*mgYGlpK_rA4}g?4#Go=ikvV^pyx0O z8!{EZRnV(KkOY|CiV?Y_A>9Nnhp9kN&{|~Sr-rJUC8Ia`2FY_sQN;PHEmTKCI$5be zVAKi|>gce2_|es`W`Wft#S+q_wyxP*zj*FF4R8-z)GzIN6YSyfut$}=<;%fwW%R=A z{5$g7WdjXt*ezDK{%eA-617H4Iza6lcb zvwFomSTAm>=uiATwX=%mBzl(>R67?6tz+n;g`d69&@<|iu#1vKxuB5nwt^xrSG~+z0?-utL zKstQtcga$DNXAqExT9k(peuYw6#qcqKSZvdbooUNpW=rM*xcKm4bG{OEzZ>m7?_-w z^XI!N!Ph{?P}j*TuP`yMU4+MrQ%i}xAR{i<8RY2T15wWj*LnS8c&QEP^Kh)&n8AM$e)tTwx+9!9 zm`Qzhj~sgLsL!pdMtMP-*u#}nFjh;xd$r!TXWQ47IRW5~WNo>+In5^7Xp3$(jHc%7 zpkO-sd&XVr6w8GOTaQ-0r=1O{GkQdY4nDQPFKHsmC=vbVq?30jf;=fbsWnG4faf8D z3i4cz^YMP+Qa$bJ)M{=P`SAO41}rZ)RlsqruD+v12g(TFr{yiZv4eG0c` z!?h;~J8~t)l6&RktD@<7S$CCfs5!up(wE(|h7nIfP8rCTRY{|(0WLOu?ee5yiNRCb z8pag0nEN(2zPYXC+Yn|;ZStgR@W}MneYF(mec3Ka!+nMr$*CNFSq2RpK5w!&AyWm` zAe*@K6_`Groe$3ybYH0Lhj70QUh=WIU-gccD*RmE)I9nU^>qV~FV1e_*?st6s`AUB z{D*wvEq%G}D^YvSl9If&7E|=12s-?&(+2oSxV&&=i>)+}Rq_1K@47(=xIo>ku0Hxd zLjmb%WTk(?*SXq}x#nH6HGA&)L2TT0rX4u}gWT(`7_I$Su~9mn2#w>7O@*Js;SjIA;DK$Yq%S{pNzy?r;Af)GXlo z)$R{3nb#*#|4FdYYMHNLoamx2`L1hY{8Nj(^y0xOPsi^wm!05M8sXpSy|@aYN1XzA z`L|@_@Q_g|DET!b{{F`O zcfd+=Y?t^B=Rfz;w9D`N0KJr{dZ7(X3enoky+$WH!$=EKxuZ3Zs4Oh$H_QP+aO8b(cij<#WX&vz}ow%3e{n#Sf%lSE{hwOJZjOKUaI z!%|q(iaxA~XdEKbCg}j0;K>;buMworl{VU{^?K_hE_`lt&hQ-V;EPMmfNO#x04!*~ zU?50uT4yvI9O%3do+^)1>uUkS`L=L*(%gC`rf5Gwe_Y-bG9b*^G;{G+2Bk2zW>btz zhdGxvVfS;rm-^S0qvS-Z$id1P6}I$eHk?cv3$5eI#>Yn=>$xz|kG%c>jmiSG1@wrQX*Q82h?d``=vB zF+()DL%l0mS}wUC?xB_l`zDg{CY7REDKtEd3y6C?dom8PY=P(r-R{LOjm-Dq!G8&M z2{Gsz#f$>o^LO&NkME6?EtcVF@DtoULo_o_m>7r(r!#}05APw}MvmSTH~N92)-^F+ z0Ok+Y#+hJWGGC^6%0%E93s*XpBbikT<0R$EB?WSK8H&-=oAI<|MgqQ1(OkaBYd%Ti zFlFMrN4ews+dl!fzq1^rgDVwt<1~Tavlirs({v`s>XPY4{Updzyq_3Rf2xlXVLh=$tHc(gGAT~E|y)oK*El^IC zk1t6p4O=uwcWNo@rKb&u>}eFZi8cJ4sOlh5uz-d^p&bh0mK_GCIQ=%2;D7x_lK zK%M8PZ0gaGZ2!FxT4Qq(qBm{^q?-XO@=tQwRTq8-Y0X|^sg>I#43+V`FkR-nSVZBY z9~YR5kqAIcyJo4bhRET?&f-5&PWhF_7?TT`HhV6fZ5dzO^0A&u4yN*EU|He4wx9Q8cB?Pj z8GBLw#j74l8St4OkwW{tXmZ6QYs5G<)S39FRna@-!zu7-w5t80C1$T}xBuW|K4@3u zO?Q>AUIJvhvwO+l2DQPb`1;ci^R1!E8Q1ZASjLFkmABSs)gKVK3wo|A*~ZFrH4Jr; zeX%VmF%W};o57A$FQ37*KkhNSkYe>`yHWiuShkxUIs$Vc?9QmpV(}?XY>2anU$l{0 zlS{H|0f@tzvs~>K6=SQTqML#zw-g0+Rm;D*2?(r{P8yeri0O{jIFH%^x2g2|!PiLb zyq5DqzK&?WiGd zQCI)O?aT9yGv;DOs@PO*!*i35&tk%xS3O5snLQ+(TQr%1fC#uI%67@RT6sLln2Ay8 z=7*P)mWirD6-vu|H}~poX%7AGbRY$tp+8I+zU%4zMPstCt+L*`{CoI=df~kauE1x{ z=-O{(x~rd8!0^%lZ-+4gM1SPk*LL}ZSfAe*dicW5YZtV{IyLzVGglsZYePQ@n(eEv ziQ6%|7Dv>eZ==s&{2Iz{d*~;9cr#Zus)4Q`GD+!AB1SX@R$Pn}F-LvnfJr>PWGW8h z?58?STCGYCzuWb6Alds*R?MNv``#Uste6YO)0mz!hOQtdMY7Iv#Vqzl`Ti!&nuabH zBm8@wj1x1po6OB74);TuRjt=%HCP+`fZ2|BtfxI&Z@&ES%^;up;Cf0Sdj8UE<#37y zOB{B3QS8RVV!XP+@#{C!Oa7!F-z5fGm8#KW6ZPj$QSWyU2t)~v-PeeF zM$>rSeezT>473)?*LliJ2feHw^b|UYQ?iIkF=YmU{lt1$Ei}3;qb~k|mcyVe^(%H` zT@6{F#`?3TIc6Uu)M0Yv%Bf)O0%Sz13c7a3Ro@)oWEa1JFkumidZ*~6#DhgZvL2gH z7Zvr{v1ib*_$e3LoejR@M+yG3fr2Kj;_CcL^;rQs>#1jA+uRbW0Gg^kqF8aILW0UZ z{TBodM^JI(3NcC#zaEHKheL_P;do zJi5+!JCgry-O1nG?0>)OUYRpf>$!uG=DU+vH6!(R z;T&@W(wZxC5_X(0xgjuZ*ONi^dLx%255X#TKWf1n~QC#!dw+c;O|HXgX? zDl3L7sk9+~TM9z&&vfD^wPvnE&0FaXV0h+fpolf7h z$ne!d_~KK-^~iX@U0;fDQrSkO5P2H(cP?=0hR|2x7@2V4h=!Rwi;VCzbC&L_XjBK$>h1ffy2NsC>Z&g=G2{ukUW3RH8ad5v2Tl!`Q)hDPy_l10JRuDUYz# z(rOs`8gfcNaTS1z?dkFwoa<3}YP5drFQ31~p~P#11?Zn|@ux^h*Y*|4y?gT;)|Rh}I9MTu@3I zf}yWcMmt8&<~_RaM%+LDkWWqP`$_}er-!p55AXZC0n&}9dvQv;Cbcla=I$?;6jj^n zA4o_qob-LWCUUjp2XK!60MWE~BqQLH{hmelwYlZVKyYE_nb&}70*y~q+Fatucq&FU z>s9mZ%fr*Ub#-&ep%01w{Ccx4>=jQgj!Uitnyznkws~*X3U&{xmEPX7=DTp(sQqI8 z_|TFVB4(UCw?M5c{MSnvbB8nEeX6qr`Xug@bfBW{Q&CUVb|%HI_w}$?4J5;4+`a1V ztA}m>4_9aX*7W=S@4*J6b9BRi(IHC1hSVl827-j5qAq5F$Jhf+`pceWBe)p#ZGXV5!$cvt!2eC| zzb~){!UuUO`%}>OtM0U?rD6(z_rYVT8| z=`X~ay3TgnKXpdlOpb>1V=E+n#w+Lzy1A`viw<6n^#uASy?-h5*49*-kh1)g?sq)@ z5yYg42xNLvt-q|egO#7fdEW80o^OtmE_S?!Q=5X-N2>6U$*XX@xH+R{0(AaQorf=V zdLb`oqUV%Fn;o_3`(b)nmq6XBTiL&BQ^VQsN9A6vQjS_{B#EhulK^eSAq4bd_Khl) zRM3|MoApjL%@yi)hvm%x%Na+bSd;30^B0s_+7a**e%b+;UUGovo_sKJPc>#g53+LG z!P#%AVRm-T*hc#?uyMK1Sn-9kqcnco5@dW)-~hx6f>MkWost_`mp60W zo15ZnMAIy-r4DzUd#@^92sak%lRfd9$fie^_k9kQ+;?DGF1fKkGUG=lJ=pi3ZQIF4 zV{H3FWmh!1@PV!Tw@kXky-Jx(bzT0C0yoTN9|6P6as8FE%O9|D8O;Y;lB-Gt5 zc-uid4(c3X~zLK`(LDj9?#M{ghzY8e;Q&#vsQD`jTcmsZx;CZveOqdveG!CX7Yv`X*|K|JpZ z#_?xZIe7F-G>}fhndLB4WEVsszgUrx4)BuLjp7apW%Cg2QNQ9_cJtQ^1?~tMw zq*&YwHkoKyN50rAB61ZJf;j-JiR4+REr2Z5cJU*$kFKnO6C5A@?`QRxP}yvv|AQ1S zvm_bF_VoQ1S)@u_4Y}r&0@Q$rrbc86DG@#^2F*EI7(%VxIf30H_DrkT>bYKS%DrrG9zQ}Yk5IkdQJkn6Iu|`LwN~CKtkJ2SvUzMn1HJM%sPnQEir2|{Y zCI5H=Hw6_5l{nNJMv4LPzeE$X=s<)PzwH-rgI5+q`6qxrGS~3M37rOR*|V(qVuJNS z<4bIJ-`yIOCPJqf8%=x>QSym&I}?!z6?L?CCO-f9Kl{77}+ZjYGpyn(ufx#7p)}i3A+zz>s>=YR}?7g zS(+Ir#@=G7$;8Dr=z~DOE{P@+&-#aX2WkJ1s5!}7TqVDAnsky}-_?bixxEtIOV0hL znn3rP6VyqNn?|S_M;CQp4F)_PD(bSKZF<^cWj&~Q`OQ2}bDIVGt{NE$=O9m(3;2BX zg?dr3$Y|>k>#>W}iCK^UrMT!WdDQAjH220;T8}97k3{d<{XZPI?a{Z8*=n@M1!yU4 z9N?|we9Pk)DSDLpV8u?VPdz=d>at1$HxGnY=4~F#DcOWB{!m#O-M}Sh zofh6Y_y6s_D>I<^mDP5QQCFhk5`a7OZl;8dOKE;DPf{Ve-GyFMFN(gJv0S+H)GfV- z?>7J9qj^o`_3BFbAL!7ryubOB`I2hiVxOh-9QIA(Rj^}N?{Zq$m{r&kSNUi|((jpK z$rk56)jMut9#S<*m9I~O%-?WePbRYle z5ISc+J?GxO=~6e2$!(|-M(8u4MFEfQpQ+x3L{<&KgRRd^WIpO0&GM`xAAhrl^fK6Z z7;juwgPRSGUf|TQA!~faEWnhx<$&*8difg=oBzL=EqtTfRjLav48Mlyng4FQOc|S1 zjXrpz#ue>}I}i&R-Cr7M;>Cx-5Rtfw0*DcX0#9v}RlA}Z=HrJI+beF5=ehGsvzGdb zoph9qkKhR5``LBmnn^dB%fD`ap$Hy(+TX^yXrtVeaePfdo3bo`tmZWH5myysgfk<)0F8K(p;%~qx5#Y zr?wjh#MaQrXABn*uCMmX1VI(Wp;0{jDTC&ancWT#OCo7jN>{pX* zEo320$^RPW7XNFQWB$K}`Fq0Ihvk!ar#)!zvu%eu=^OY?!!NY*xca(ZDtBj@$}7*E zQnTF@!xk5M+gXeVo{M4#DQMM-PGtsfZO^ud#eTRK(*y2TLyc`W-D#yiWxnFMH&2};Y@(cy zNE61c1~`eiyi$NZ{=0fNvmC)L;%hda!$(_*K^|XXK(h9VOJUl!N3;G|{k z$J8KM^91nRAu@_rz!&$|R$ShGc(O`66>ZzoRvXU4z2JHk~-!aqF$i# zuV;NR3_fMrPCekyoR-gARz7yV!rX*K?N>3PFi7$FNTbG=%Rnnfn}eWtVIN`q_8iOg z<~>13m3VK^%6je2CPMpiFd>nmEj!MP!Iz&~90tP_Uuv0V=&7R z6+mtwOFZ2^y|S^yO+3l*C8Yi;q~5{}9-R$|of+kC;1O`jYbWZzTX|l8a=9_G#v_ST zX8ajHdqGv2vdqYdabk3HeR|H-cOp?MT%(@;9GfYHC@du0Xj^;00>Sl>cw`kcZbx=QJ8WepeX9J^Y)}KVm0*UEGl$ z88^QW^Cf*M&V-N%%z+DcrBK>rFISR1V=p9y1|AavzN%scMP1IZ96TbC6R)gp=0H;F ziRJ{7>qN5Dg%l9f3JRfIpN;_L?O1j$EIBzI_B8@I(3ycGNo}8i0yE`8*6rv4c#;KD(a>%xaSSat*ASdIP-Df$^%aA3~g;f+?uTL@sU^_$sy|4n(CF zc6o(+-WsMcJTl*j{hJ;GLuiEyIkK0f3H;TL(s|}>3u~9THO|Ft5htNfnRD+J`bfdR zGk9^2amoLt*T_GR^q!mW6BqaA`=zu%V^AzzAL0ru@8$k$;i2Cu{~VX60dF(;%?*y* z)!^$<3X*IN`RLcUem@a*8?TQ+sT+`J_wy~$r|}AUk4f5iEy&ths&?1HVw!Vn7^V}n zBC|3!$Y=s9bGj$VRx3=~87y-!#E(L@Eyc$l`x$EnpC=VikC19%8Ht|yHhl`wdXS3f2&MgJMz?zBRgJY#tV`_-8%>1|<&Oh6-2gwf|Cw#C zLlUK_dF@ZHAD?D_{rIIs;}0O9a+rDTfPHb!Qffo!d7sAbVBzYIaK|ij| zzIl#EnMV#cS2pvhlAPF0MlraBTG1|EjRDKgR3N1C<_c_P->7o(4`dp4?P^;We^$JB zlGwKO75Ogv6aeVXh98w@=2`lrO(O2`BmRNdQAaNVwz!xCP}-(#6{G03fnCI zj5@5g^9%>Or>gpTcS}G2RA+}|{i_rM9P7*Ww;@@XiV8OVkARNyVZxHlEm0uqTb_{m ze58bbZ-=o>`}eGSexBRPvc%&bRE~s*l{g?Z98_aw@!d-H$Icvu@1(MIcFCjO#?4@z z9|CyUiu7<4w5+^8aeu03Cn=aMu6!ieYAms=9wK0IoZ#6(E?=LW!*`bn-@Neve%d-V zF94StE()BIL{YIC@GJDBBxr^19hqf}C#A+ik6|1|T#23o zn~B#*1k}$1L;paqc`1+QX4YRq{^x!kYX1manuY5UPLz+z?SztpElxl5Nag;Y`uX00 zt4k&N_yG0+;25MFXv%qx;+IA}-5xJZ6&W23v(<8o^ZW5IsY6I~yfxTP6Naz3J(Ef# z22W^icze6K&Pl(|Bhe+)r1s$ucEIrAmob1JdLa6L725p=9;?#ABf%pf!#0m5l*5Am z6rMjvYGDX8B#jdm%<(%rs9(xlB`vKPI~M+fvq1+jHDL=3;}Nc3XH1>4-)zuA-+1i& z&yk%8eidQM*wXxgzx0|jOS?~07Jv>k^}3q%eqmf}6Y;;Fl20vE-)zCVL`xH}z_t_& zD4f`u^H{&Mw6_Is_+G@BElq})dEsBbox80_>Dh8d(zqR@&J?@_Z~LPeve;0X-W7!7MV|3&F1&T2JkQePX5d#+MDq zq5i%|L<52992UfY2zovegNZnch{{l4RR4s1dh?OrN@gwbn zK{P++sGS|8xb`31$*2y3r`e51LHxOhhS_5Mq$c7P##Yqs(mcNVOI_Ia3SAIa6e_Dd zw4O;CQO_lY1Pvb%KAJ8#j8{vgyn59@hDX_~b5Rl!I8v%;e5WIlmtkx-kHbE`yJzwI z{G}%fQ=jQW1WCzOd_96up+(RN%z8O13>Ao~zYe4knPa~Wqa{YE24695p)3yxx2D5; z^cUU|?L$hwpEQkKSlv0e+Pr~^8y5mph5SxT4-J^7qcpaU`f8@S$1f}-*~K0de{RJ- zbnMxhj&KwekcX}y>BIWM!IP1_vP%{#*_Sg!Eq?9g`3U`WL8O^ItK&ZLSOz~PTiM3)GqTv3ja0=R|PmA;qxv6}Q! z6O~2P^7LiCYp;}&*=s$b524q$^46lOV-!#vAvU@?daz{r3N?^n{RP9Rgz)5%hS_IP z!(?daYE&jdvQ<*-h|7F3_LDGXLT@s%Ce0fee~Do1AUy0)T@7DHekUg*wITC|ak$tt zmarZ*WoIr;P*^hQkaGv|)qvG?Kv1C3w1e!Un;?NCBx4OL%KEjqJ#J;41AArjj4BQ| zHzP9EfVq%*N6N4<-cy<^Azf3P#=A&|RA@S!$K!G2p;h}!>H+uvxC*8ti&i5iq@HSE za9MBrbnPQ--fw;E&CA5qZ_A-q0}$B(#3{ZZKOtPh~G z`~6?;kAI-e8em?{8GnXjfi`fVdvn%BG^r^5deD+vPm1fjc5CaYu6)S%V1hl)4oKr$ z!3G*rs1J@pw(bFk#Cr)b>?JRwGFN&9O6(Q~P23poLbtSzS5tF#TaB95|+5l8q@!&%p za=8Iz0++COMn3Q#4SBI`JsY@HMlI-3F&IWgW#-HD))*^?Y*HQpfy4&@lFx@8h-#U{ z0aS;II{VaDj2?{WlS`zz>-G?NM9@>m%j-AXa*VFhe6tE)Qm;Z_Q?ltBNZ}cfVOJzL zWAiiF@O_Oz^BFhC+mS%Lk0zCUiq=Q@V$o--J!5~(-HiBnwlZ6-;{8&QdwG1+DfYHd z8H`bRQ!o;ZF6oMJz(%4DMZyP^2q4u}1a0F82`i7fKv zctOuZ(y)3gb4fPyQ|iEp`f=9fL@WlEA*}ru#8pVQ*L5kgXPRh9?QEpI%3>YkOywO{ z^WL~T7ee&p?*3}CH#7`zzqnU;Rl93uE_Q70DaFQ}J#oBTQ(1aeL{vs$`_heqi1&LK z-I7vnxmEW)QD*ejY1_M`Yy$vq@L3#@_}=pUJ&hDzz$ zkeb(B2b!-gvj2gutw=92TE4{HdwqVAb(RpziL&1Q(#`AI7=HD*JRdwk^qoq_q2LT< zg0y4~RRonpnroKsfOlN2hG`UwO>Me=3}Ri`P2ceQj;9+!ectb;_4e*gg^qo-36xaj z%v>qZN;?ye2{q#}&OdV~Q1&m`c5mNWf6@4g98k)_m-1ltuQB>l(!BPgVfy#CKMW(}vyd&JM$3=)M=5FtFsTCtFUX>jr74FC-qu9?eirCm5bl z#SHO1B79hBY@&MZa*H0FPl(m~;zWW>`V`HAQctwILV0_3VzqHy{a}iR4REf*7=*2VUsAJf5Th ztd%_-K~5h)NXV=f!IPkbGI`*k+m%|)8V4*iDV!jLLo!LXml1>RwPn%Lw$|L=yAA^ zYS>Lk`uAF4j20`dv`q_58maQ|h#=JT;E=6-uGMc#tSPr?_$=Xj^zoP#<d?Z;6t$RUA7COsHta zs(!aaMlQR3f`}0%@b;ZeOmdiv14p0&UH3kI(s~|TSzeT<3V_V!1+sz0+BOS;uT2|! z_r@lYw>(_b1$d8uVvk%Wie}a(cHVywH3!sm&Ck`EFeHGm-k0!pv@5(|!vG82K1?Lr z;3vwz;KWP$#?(hk1wDFfN^VHzIDVJP1msQ{4&fjT|C$`CK$>klXr^C;6|Q)7UPV%M zqzQDfD#}KT6sy8u`GpkhBDy5&C_8=JH~?B?f)6B8Q~@Wgf$*SFybw5u^a&PSc5X&m zY{@PXc`cZp)KDo^R+g3{KB37;W0%ZR1+$OXLK^XJ?I7d4VXTc&D}mJ>q%_(@lrt_z z{Oq%R1YcL=(+2X(0W>qC0?RdwiBedl!p>WPCfx&qyu|agVge@`i-A93^y6?(D%bHG zt@v56V5IBJr%fZ3aHi-dqneb23i_pl<4u(CtqlVyanu?`6iT!^fnTY*4{(b5N(#Rm z;{3D(<>BO-VZU}jX#aW8r9k56F3X3)KP{Ubs@;vU*O69-7J@k03o zIavg}`_0q;KK&xmmsdw{?KEG!_Uyvs*62d)BgOa;P94W1V4oMm8V^jzBh5Emn=+fY z=qlU_5(qq|PL?*zj6`C5S zyRB|y@Ru+Vpo$33M2Z6s|4kshZWme)DgN5OMG$=q9glSKG9mDjC@^jZVWq0ztmza) zI^fYboDc;A6#%5W(;zCko!?(#XKj0~-QB}?8${+RL`T|MO`qyFIlqqIKzA@_K0}in zLc6|Dp2>8Vu>bf%x@gc6lzp8SKPw>7;&UYIxu3RcN*cf8L+OYa$JWQde zTRQHKqmwdw56l}If2;LGvxt6m5uE?KQ`wU&tbN@)>a7mG-CP;-hib`RO)-8()j7~* zqcAX!Jm*$@K7X1P;x(mtx(M;xg@Lh5b9dd2_52EHF`?5v|w{QmxUVNevb1MJ2$5z`R{`Dud@MHN&a znx0;=onN1Z9DO@{5Wo8lxfl3%M|t`#byr5IJ@PE$=FCaLcSaJ z!LEz%ssNY)Z9x%*Q?|)`G|I-^4}^!3y=oeUD8AS)y2sVR{$`7j$f<@b>!guK()9m9 zsrrMB1)jeD4c&gjPqg&*;=zrjPm?xMt|Jw2-&}jNvTtmmq~Xgl&D`!-c<{lc6OAK8 zdo?1hH3RyY6ctI6QApF;+VE*3Ex$4bPI`A86?fH0$S0c0+DCARdKiLrGgO*Vi`Rr8 z=};?bZaM{Oqg%LVjD;kxX7LQ;i8m?WzA%=fZ9~X3ZMC*!22T?qVP1C*p)6wCTDM3= zTP6JFBXk`VvtpyvRjbw@MW~WkqXmC@XuW1p^u2JLg;F&LYw_+d!U{sue;aA@DX&<9 zRseMU+K-T&pD7p)q_J2k#iL~L!XEFJD<9RDhuu{ojf7F`9Pk$7NfN=l6Cgm1nVi6= zzNRcH$xy<4oIU@m`u4Sf#2>{g%{n~cQkzJFIB2)LYn{|1mNlTV1urA}b@1(tCf4^Gw%K>(i0pT`8j8=paX zSUk9`;~e|+sw~dJEzXtr9nVnr^DJBSPYt>1H8yZe)HY9(-+XTqMcexV~R~1BUF-I)U zNLQPuN-}g~X|bcJ7&mcCTp0#jikJ+tS_q~}FzDM6k{kw2E4;{oQQf-hL^U#__K zDRMIliG3hl#Ol<@=c%i|jTa-)Rmmb^=>%NgU^>x%bx1W6c-AO)F7S+f2T0m4t|Ul3 z&qAn*Um`hWR{b+9$N{i-slA`{`gn%Dy;^d8$f^*HkT5OOXXjbtryTSw#Zbg2Y$7?> zdGO%;>qP4B__O*8tbqbcMZqQti^7VYwh(TU(-3+5FA=nTL0EJX6`G$?Bb!k+WCTjw zi5kT?X9sgGo}|`g@6jn=uh~dzJdU9!zI+BjrN&@(w1Y|&_S*S|Y+8Dh00N8u;D`53 z);kDF6`TlY!>Gd-j>VU%Um6FL^(%dxQiH}f4Yf&1#!A)vbnRU)VySV2ziC4rmM;@E zxUYpL^NzVoGR-_c2v z^(gVJYoOF)L^ZVGK;ThicGZcvcG}e(#g9H>Lk)#vgV-I}^bBD=0?cBep9QTwstVSi)Zz zr^H_W(2mzm5@NZrrjoU&^9kz=l68(e;m=85W^)oKVwy^pz9EWWL(RM zB&AfHTI^-+^wQCXb)O!6l=K7+No_B2xVdgjIxAD?Mg@cJFNixR&7tM#^XL9j+gx|v zeu|7^C=);nQV4y3@ky&0tmFn7_tZXIsjJIX3c09}zYDLf!6h7tiIsm=?EDg!s=Rdf zIk)4};FbvMt-vgK2y!@e>NM`#k;lPc%CYL9o{6b8#KhuJMpcFrhfhxUhl z70&Bequ;2a9rxb8q2tdN{SQQa=G-&-beYwrXY15{aD=|j^*(K}j)y(qjIT*;JH_p` zZ!8*rI^milK?JXO>q(i+o5jQBK_ z5z&N$>$|c^2Me9L+qwK)W@~d!nvFQu$?KNNTFXuV&*{x4RD1Jv>BTl3_jo*SzuCDB zS+|k~fBgp%lVH-Ti=lNoNiAVKh>KMmPL(zZ>*7_B3P|~+@8}?^6>*UiA?rWPOip$D zE?S2C>~{Xy?da2p9`2>vNxwXC%V@{L%1lcuvjj9+HF-6D<`ccz-m}hY+@8)g_lf+w z1c6|6I)TzU4X*UMOnaQeb|Nj=-uGN3f02Ni{uaBa>Z5!2)S~5W?^*qBjNt%&v(hjU zm5%0TCxVeZjX7jY>)DA^edNV!k|9TJ3@|1IQT_4!UNZQ$A|V7pn~I>JJ3z806G09z zNP%)MNYo4q%0Ld_a)fa~nf4LvJU4(x%^D>mBY6ZvkS}4tah3LYibh=S&SeI5^ozDc zDy>Pzm9s<&Ww9bo3S_<}hFor3?=uPWd^neD0|^{>RyiCHGLcdF>d+t(khoUzGa_Qa zy%Lfg1Bv+y5YBIh+25^A6LV_8wcmB>Uql&x^LV4xrIoJG0b?1EV<$MmDYAekrpN}- z3^rQNaHFK2B};h&PamA-LcomfR#pf*VT>xGVyMVFT~s3X&Faa52goUT51Cp_B|>zf#b~qkD|PjG z4_W?t0y!N+$aBOvp}y)ks)01}Ng~K;!2{3Qho>37o+d}YQnOC6f)J4AQ*b_v*|Bb^ zi^&TxJ&QjYAMYPVh%<-)f8C&7Fy<>tm%n(>8<``=gy0sx0RT13Ue4Z0NI+*O!zh2S zaa$)+=5WaJW3`bCf(UvHnQ9_+jjbuQ1QL^Az+pf%GeR4QHb4?n!{ZrL`tU;W+j!88 z2C{@e)Pmy5w7eXO84@YC@PUw~PvB>c;=_PSCMfK~i*!I`r9mKrcn*MuHCd_j*$7c> zlIe|v3!#6^kVgpX@P{*@7GP8WrHDKe*%^go5z{p*H}=A_{sWC6!;8x!(%frE*fZ@T zo$+U=U!8IwA~Mv6gq#*&C8rK#@f%IBsx7g-7{V)7%Gy=$psYqK0ow*SNyKE7Vytwp z)P3r{#L1V7Z(Ux~2--P;NWE?#eWN~uDb*E4qHeabRL8`~40#Hf$7x{oUe%D3KaM!3 zp@QaL2a!z$QD?bT&PeT6IHDtO1~0^r@lNpFYr%cH#a+|oV!|o)x4==ZUKkX1lkvYW zuDsgm0B8@VBZhSQ_*YK9+2#~?#b zbiKF4kf)1j&uh7yy=vy4((%1Um8;!eE=Yd|2_4rbUr4BX7lO7Dx;|Oax*4_@md7~y zKxTi6);GP?jeV&(WmMCo99D2BK`h;`YB+olKmHGtM(5L_m!Q_taq8Rk+?Mo-Z4Ufu zCJsjR#2;gg=36GFwEWku>^?mEqDwh;QmsVT{>Px+o^J({dZ*kW0f>*MT$^35sd0KI zz5jN9iloKx=Qun!XJ1LZ3~d7FJffZQx+-70UGtymRBBVd;u-UiU+P~ilnQ~DD||V* z?OyC%bY>gNA~9eWr*dxk-89uvGwX4*GfU3*V++dAUpmsFb}$R!E};D(JH03RF2I(n zeR0ZI=uWNGY;}y3>bfvoKcfLE_z$G+eE=7>*%>Zu>SqmDzWxkV{v9SUcUrkDL%mq! zw6uNoYWBjIDFkqBvkpDJTm5A85u&)S40ZT&d@kvZd5x6iZAtm?8N)K!Y&ZporZRSw1Xo`*Na#q-)bEM&+_miqWn2mqQ5;s2 zs+jBeaqRe&6YP@4f9#i92Im?KUIOwK;7V5BbIx6{3 zsLaspo6cJ0p?t9Gjjo!h>!07MdxW3zm+`*AVTGy_>0*BGq+J#-ImoFGUETuVx!Z!d z*#}bdWgv~{t1V%1WiXugxdA7=4S`sixNYQjvJ~tQ$~0~2Ijm`C>Zsr0`4wLku@PAw zf-Z0J&kS^q@rskU=k*8Dbcfa4kemn_Ox>_*t=2`Wk1(!kGV!Wfof>V$QP(euEzQ~= zmHz_)i~h!6_86@Rq_B1s11Kd`7cO?{zPCNq>pU}09n!_z6)^IK&k@7r)BJsll&O*w zDJFn19&{i_&4VY@kSlH+qeaC%Ee=WbInxWWFOOi6*0vkXrMsC`LK9dg_wKP|#dhxd z9t#vZf!cFwC$e0kGS>?$(Ng{07=bU6qgk47MaL6o&xQIm1TQ@_80I~kJ%_+4p=XU7 zM_m6vAJ2lQw8Ng+jJ`9hQgH4qalPJAzDV@;_;5k8BrR+|HF6N#tYyM^_%ihGU&ZoI z9U%)s15*@0JP=RU&Z$hz3^22o%JY$2|pHVP?a4I`HNs9 zz@P?&kdQrOUl36t{KX3x<5(?%^u}bwQHLCoc65T`92kweuCXg`ZsWlq_d>AS8Nn4+ ziL4?cArdXUtgMa{sBnIaC{WqT8e;fryPo0laYShlc%LxR!mWObHl(2cuBT=Nl{U#1 zDw-spi^!uwG^DLI6hom&G~VNZt-_MER=Y2I=0gBdns)QQPmOap%=aJUsBy(hzs==$(df&FCy1MD3_m1L#`TgZV4?bUFE2V4S`8l8+qoPAWFbx;E7 zfKs$CKkJa+cKmoD6w}WtZO@cmz_^1-ngXP`RQaVCu-tSwn7@D&FV%Vn;UzU^ozjt6 z(F@_Bz%ZBT=*m<4Bw9KpJLYlY z2C`&+ssAEB3$+n3TauN_|0y*wUOuHzfR$Qa;%WS#Fen~a9nd5v()>_3|L(F}tAJaK zPI<_qPnA?l zfJTF)LhPS%4>EEMJW0F%7V<*RiX1J+UkJjmQos?eJP06MaxwusNU~%<1NxF_PM{|} zoRm)H`K7sdSR(Kt6ZwUYasD9}zk@ou(KRnQ#=Sd}d)g`uW%lisnuYsVm8&4;vNA@JWMXZK_XFxx30Z)|KTu^TPtYIQ)eC8! zuqVx-y%)Y>kD%Ml6v}9Mb&Am?%(l(cZo#OHfSU3Quas*)qi67shC$a~IM!}wEZSdG z%;3-a(eIGSJ=tlFM~&7DvExjo4+W#{YiKsdJ9o7+c3FD_P8C^7XZxBO)_>OfDdu`D z811ppax@q_lh=HrVpD%R@102B4-DVF>*bITu^P?0MXY&6*tKQ2WGXQxSvX$gLCtaN3GQ|6}853VM3^bH=XsWU%xQf(Df%($^W5Sw(nYe zf`n8XWNjUU!YsyBgm7U#GP!PZ&bciuvDvNm;6_CW(%`ys*4cBuampQ@HQh27e-ZpU ztzGLbBl|t8gZK|aQ#Kmk)RgO`{n7*eAomM;HC@eT`O4VRbDjQw zpp3Fwi{BSH^Z)$=CAd9VDG~E^^$zI{P#s~DN-)LPK6igj6|MwHPCeB9Lk!+L{d#}= zS}-u#CRzAa^^>rOWBadZ)tZ*&{qIBn;I>EdRBn}BPtg6!=DQ}wHH4xxbC?=|_>2au z?aQ(5>D%0}&mtR(QYGsbR!dQiYZ~^!x?&FfZl2=s(gh2zXJFDKu7zFV(%ddzHtSMi zc0fR8Sl?a7$?KbFK6)EB%8}kG%}XC_it(ws2_IuoO{F&a6S+!Sox0Au7ckv7r-WFG zy_tarVY3%p@UUdEPUAl?E)!JO-n_(MuA-xJ>Yg;UtCuwuM#k2W8j%GdD@cGI5W1UI zQ&CNp_rJ(_4T%dWsts%QLlC$h@e&>&> zzoqpZYSffh3{$4;lPsMOs&a+R6YW1If3ocUfnLo00~P(C_`$tJ+|f~h3=|}ig?q^2 zc{5S`oDgpg0`ypcgm6oVpuUH6uOA`pF(kKUqY>;}HUBCjnL@pVN)$2&;G&iuOgW$& zVJ&zD%Jw&cLh~n40NBVHf@gi1Ka+e|N4^hoM=nKxOR}Lh;bh>^D^)BLg0A?gijoHf zgB~Z+JjZ6&wWi%HMt8W{23%n8KkFXy!+)liuUG!Y_xc$p4ako)d{!4BlBYn*&lJ=* z!H|UvUqc9QPDa?Hp(2qNY~S5B5({rfXwj85RUHv5q{W;kY$h{46a!hIOjKH5c(OeT z*hg7C?rorsu3`xbDtZ~kp1O}9QT5-((+5F0()EZ$snlf!imfXcNLJQvI^w!E{UJb2 zMav=>I{PPq#vA0hiPrdMF#*x-;uJ_N&%wNDwJYMsH(-=lrRs_tMumq|0o8;II7m)` zDXcQZqt5#=~v1d-n08$n_jugb&8Z(ZUk(q$1K znq|4qB-1)1y!GUsS1{@uh16^>Fc@E_4a#1KMm9~_QUZ)3zmpNk&A|_J)r#@-Z%06? zE@UL_2-;R6@M_UCM0pw(T?B~&lU6ztFvjYm>%b!QOptwhs4TZ7*EwEi9oLKl5&qH| zGCGDP4J1;O6fgLM9oPXgBH0z_fzRTFd&QUL2YRk@ zSHv|{VAGioCF=A+ogfB;Iwn%OdB#v`$~<=lV8>UoQ-ZyWQK*CNrB^+%YUn*#iKzC5 zT{q5!pMT>^zw>C<5H-7Gq2;DJ?tD=;uS+nyU-HhJk#{C@9WS(L=PgEo9ei!23ESz5 zF>b!@cEeArB}z$ou2K`xf#w64V$VBReM%~R->l*Y!rseJnM+kqtFVBUV&2zJfjXST zZJrn1U*g*_f7}A7#{FjRw2B}DYmKn_!wJm%8NtL`kU5AJzk z#=3R7Rp&;U`Iyg*q4_9$`tuK+lsBh-d(!lF#(NUX!o;J!PX=Oc}!spyVFE(#dS zY31mwX!kby%c`67hL#lZHqAzijT(wL9fH1u6vvRq20)ioi@q!$y;I!V%oZq-@;L}L zS-G01JYq68M&_)W9HPtHQv}dfT0}xcl|KJh!T4SJgm-cMmxjycZ39C^y8Ur`J__ug z4Cmkf=ps2|sTR-?2W6ZX#81ofY%ZR3UD#5!@SSAal%K@UwzhhaGyh*PM%b!3y0YjN>t+H&-# zMX~b)J}cUh-@&-<6abJT)3t5l{WM_k!J`QdYOUxf)KV#Ip6q@=MJt_hhfIxYz)F^_ z15P^Oj`2rfq!R{BMTL98;LB5`w$mjOotF`Ow2?|Yi>P!|x^C&) z!$exD)lpi{p`ssv+H32P@$O8&D>oKRqSKH)>?fybC6S~AY3V1oXf@K1jO98lGz(c|X*HPFGEYVdoT#x}M+8dd&tL?W#EJ!K z$F9K2A}^(IhB@#JIqUHwy!2LJvKmaT#)#Yy!PA?Ygy!4ERuWg~%AH3H5`$W-Ck zLou)6NivjRae_} z9kZ%hYxT#7cGyMi=_p`^`ie20r^E_tngFMbcDp6-&V1(K6YxT;%|Fn8<#v6cQf=7X zrk)byM~A%TgFJ5cxCg*G@eSMa$?4cU=4w1B^mWq}hBjdLqPQh5{VbwZafll|q*~G8 zsTtUmp?o{x7y9aXymEQtN%u}tt?`meS*qt^UJ?0U(LW*4&y#%l427&58nbq^`(MnQ zUj4o}E_KpV`w8*0HYy7{q9XkwPFFm-z*55Fk)#*aGGTkb^AkEmTldEAW>|C+i2s?e znOxNanbQ{|4@5mXdz2$r5RLc@$A<#~NgmJWUaOmVg+M?Sdg_fQgr7Skp`y*e7QIi| zyXft9KtDy3mUTn(!?gMt!bAQT25x;WG{j#JByvkLDp>ney_b_pPwAsmbB?0F%chP- zX2rUu7G9~{>9k}wD{{KIRpW+t-?r(A>t9#y9KO9-N^O9-Tp4h*Y%6#ACODVRRZTH` zrloc&j<9h?NO6-m%7Yw}dMLtcdw2bp_{0PJhcEq3o(ClUz1LcI+o1Z^wrVxXOPim) zKZxa{=HH@S;JjT!4h3*~Z@VpMMLLh7-g`fm3;b7ro@oI}*0F`<-exbE#u;>U}Hk zz_mJ55kBSpLc4#K|M2Xt;8!+}p)4y6H5kKBxeQx%ses^~!3bj{%AX+5bq5H%Gleqj z*=MXC2%cJRTnyVNPj-S^9^u|XN+vx^Ja)L=|Bu$UHhVl@;^?}+CYgsh1 zxl(?=>U98F$V~61F@{b(?UAyiEfJY<3T(~qz>Q~AO9%x(xC@wJ20_oiFkI6%*-NLX zT8lySF|M}2_5Mw{-UJqZ(!<8LvhB3zoazmg__Wz}>#Rp5MrpuRC)7%7H>`^acpkp6 zZdeu5#g^@J2)%0CWud! zUA{HR$nIkG&mxog2!tM4nkQI=bP+6zsv-C(=OidX1R>p4?*}Aph5uW(Xs0EkLTQz0 zi8@gX7XkDwGVAh1X&ZQr*jGIr-o8kGSFzsLi;a=iCdG)aNZ=B8YX?cp5krX?RON%K z2~-#}+!F>bRV+DayVm0f`!E&i=e%B8U`GgA9Kfh^TTxNCF)l_EEG36D>;p4Xm7sJ7=0g~BjzW13!6_wY zJQD0#Eb0s0iC39=e>rO|3}fe_%qr6e|(2)v(0%%4#{YkQ@6vC z2-hWtZ80-a(Ltz24ymY=+J?eSP9x-SRpwABxrb7^BP3Bvau=o2!6~^ba+m7&`+WZa zkB42`_4&MC@8|3F`dV@XS=HcvUhr>Tia%F{s=POFm!MSQy<0-W+HwH0Ac_EW+p~IZ zQYioLSyYg$Pjrc4s#ljmjauz<=&j%QvD}c{h-@wOds!(-*o^Tm3<}D2= zH$bDYam+OOMX1Dp@0mR=)EJHL5$6WNiKpeHY=siIa_Xz3y+|89M~)&VT2|RE2du-( z7wre<%D(iS(c6?vsg4IUhoLHTmd`fklxnC#$sm5DXC4}NzaoC8M^q)W9CF`%qF=RT zDyO)VMtC5e*dVq**3wld6hOw8DVKB4lHwm3IdXlbt3oJSUvy9wXn0HJzCXCULfa&k z&bnsjX7_VUiVFk4c&A2VoZd!rH!k|GNBH2Dlgu~JGZEz_q0Vz~RPbAR63g(xnOnTi z29kXbj;nVZxtFu$xh<>d?j}nTY!;>_;h^_E{H<|hru3tG@{PjM>s4CK8^n)H-p@uU zgF=Xp`%mbrT|^9i(}<2abr|56yl}4B5f?-*MN^{$LmGKOyiQRFm(0=dB5o{t)4HqY zuFBfWo(=Xs%|tWj<%u-#aTYXb)qvPm<5X9s`V}UbMts|VF)>e8UJW(!18<;H39~q|Z7athhryXF!fPcnB^FR3HjxnaLnVlwF?R@|~L=R83e5|;8eE-%M zYh9*GKC^vL_!~|atel_d75(E z4HO<%`OSj-K^%FmWAPC6jNo;qRN-Y34BZ(K+8ZWbZAvLIHsx$Rv(hZp;NN^Wp6Z98 zp>*B+GUaWpM`}V-VreZCFU%umk)XoN64W_tB3ijzem$!ARVa5uTyDP4F1{ckr_QD& zO5Itbb+C8koK-YMiV486=U}xVDpy)WFyFU_rFUjg`4*Rk%4|$%LR+cqGKZ1h48dzr za?jYjj`4&b-FOw#G*om5&Egf|4dPi^mfQbcYh=A#GlQiekjl>JBr-qwhd`#D7zZTp z?!}f>GT(E_h3Jg$z19XO=9S|kC4uyEX6H$!Wk8Xhn58*p_j5>1{Rj(d8wN}bqY6%) z8i8xO=fj9(Q{4Bf^#df|d050WL0=V+DpGb!@QpydKA1n2>Tq(#!|=#Wd81rx(AQpP z(Jr*xSMzhIeW<}zNFPBzsw|@M);7uVv^%-QV$(sj<1yaCwK~rlZ-+AD-spre2=#Ao z%$=5M+>`jQfBp3?18bb1=D0|(lL?ZJ76f1z=Hum~rH};8P-Kv(TRh&Q0 zl}ulx49T26HVk-{Fv_6I%xYu-rP2^P(1WGQsFJ1|MU!UfuN8P9eNVJkiIMZ6vYuB#i{7IC#5Beu-Uboqw%4gI;Xfpla;katTzj%jyvVG%7eNZ<$x z3INya1+iW7fSG8+Dru37A!3Y6h{@v;HdopxtuEMynSsZ4^=y=N)tg^Ki!KQh2b5D( z&B#T*NBKef50$B$J?o>}+3qmC0Ww0;Fq-cQ6))13lsYS|cUmP!JQ^c+G}_?QXz zBFyEF^rH%cB?>+O$7BrV6;;`p?zbz0f+|aBxWt%J^Fc{Su~eFm1Mig(rgd?};g;vq zo(e%7l$k%qT#-(j&gT1QeODOF!vBW}(nL!4?tbvX{==J1&W6#(O>Xl)6cJ8*L9UH{ zP<|oc;^r6=4Y)fFW)im8`Q!!g{_OX|O3OqVSd`tBs;nw)DVg1f}%!Uo<@-qnlv1nfr|hSH(GR_ngG~138atl-^#})WYSc3nR=enVCw9N23+#| zi(58-VtpRCs)b7m=nDKXg?)2gUhsLXMsu7~SY66F$RxwF^$jiq!W52G%g=O>U-jB<0;6VG3fE2zTtr>DYTbgvDeaZ=Z_*&Tm z(79wY?V3YV@XLd3=q6oFaTaC5^(KEUp}(P&#Af15AiyD6YKjx3d=?{>mX5)51kkl}rZiL1PBVAY6i1 zCPp+6Bc@uCUaZrW_2#%fN>&N(x}INq#fuoP8~g3Siv6HG$+WRRMSU~cf&T!aU*N$8 zH3Ho;(hr~bblp_QqH7x8NAF>ZaHUfw8WAUjzLjBoBge&^?%9W?5OWFtywtkEb<$w2 zVTjJeXwY?O+NBIV^lWTHKX#@NF=V7p!5wT4!7Q2Ym?c2B^3J*7;c@}(jZKb)IldWs z$;GS)c=|KKfWNVPfas%s-K+UdV(gLX7&D1_-k0LZm}*{x3|pVqng4!6lW_#_Cce%d zAT)$J&ECvKaVOsf!#|ZmNKnZT0v0Vo8iRq@C-a%TrRcS4Q-4!SX94e59sTv7%+y?f zjIBYlId{78h1Y1yMncvmec7^y_m}wxI*2?^=LR8bbw&*sulVV@S6sD*3Fzr?_18d04 z5(-Og;bzh+i`HXp&oJqp$Ah$WbK~Zz2_c!8{gb?YSNA2dW*Mn1UEVaBX(8~{xU5h4EdRw^arb+j`f$%Y zH8whSXVeysp%)=nJ_V=jaNgMV>nJ~p=E58;7;NOQq|Kb zM63F`2bomP9uqUocl1T7)`&@Cy!mBOdmaQ(_IpN&a~lYnsrjHOt+lotn^Ey=00&}w z4Z%0PczLK*3JKf|WZncqV8tD@7_Rsrh6>0MpFo<{*R5ZEwtJ$H_%VqF2XIP{KBAFq zOC#ItLfH6jRcsZP zT-WDGSBYFiV{Xj|1sYA%YZRQs(B4F35c&EWN-HumWgJz|$m^$>MnilkV@!-POE6V3 zocrO_>yyG&+iq;IIDCDicERKJPQ-t+33GWD6FWZxXU|myz_l*NgVY(b|M6K8b6s?s znJ63d1rSxj5{rvR@eg&yKI)IpsB(MdFbXx6xXZ~ta3-5-AfGGzA4X%=hbc~)vQ4ab8ok3be5aSjf(8Vh~uzG5fx)@ zS>@n-Ub1FY!-U(e`Y3kV^d!^L;30v4%5Aa^{?5AutRCp`o!Lof^CJFq^ahUbgf>fC zd-oc&?ajYagcc3OAeQUsCa3jhlo6gZ;4zQBdSN1SXVBQR0%Ywc7( ze0x!pK?#~G!+^l(rC&l_sEpkD!<@9e`l1Wp>t1jpuD|Dw!bdB+jF6M9SSyAfeksM@ zU}5bsrD&Ocf-tZSN{a;1nzxqb-cJONpB%|9Q;zxLOr%U||0F$}l%RiJQv33c>svwA zW-^#?MniKh+caBPf(j%iqq(8GK91P{Qtamtwd-?;<8te*#_wd777i4udOKz*eIj_e zKw6}imVuKzSXLPKZ-U<`%_gx{E|=^)!wt-cv9|X;M+ntd2@8w#BNTsJ_n&cb-+U(h zAWef@gyB_fA5xLo%Jz=Nhmi6?KIG`I$RmT1+kkUP&LSS4M74pIykYC=T5kC62o{M^ zZ@Qiyj~q37H?p>N)AM_;QZuJmn$0`aPOW>8=5Wrr@X|s%(;~m39mvZvo{bG1;D5NI zijZFy%Q#=%Hc{(rdVCt7AlZ37tbfw33_EjZB(~KsinBq&2SsPSeBV6ZAAAzGsIh+* z+4aCOf*bUjku3(nGFNU6U_Tz062WRwMY4xRQNPR&nR(boU7oO)tWoNsHUw%%G%F>N z&e6fZ>S^A*w#=A|3r{X1w~c^@M{-@tA~7tuWZt{C!(yqFDcj6{!8h^ku!G~L;EalU z@8LyVbaTn0MznxeOQkjRbEc4#g*M&8El)dF8TcO0*Ck5SL)-d7SE1F`(Y|2dZ=rqO zBn5i#0KpcS0rsplqm6!xKTEd*jamh9V1VH6R~Eb4qx$yLa+PAH8?I14rPXu5BV*b$ zCq0>^?Eij7C!I4mC^>*wSzS7MXoqP?8Yo2v@1x{6_r` z`QkA@4P0MtO~PfqWy<_BJ3@4$8iRc?&I%;Tror!eUQsQSgu*`?wcsZ;D(~jeMtg~3 z%XPNHB5$5{(HziA3R~>bd65Hfb$bL~_=39tf1w^1=5#~sdtAc*!n?(94-eq!UGIK$ zDYpOm%Wu?idevxRbVn?`FJ;oM4F*xAEv>X-MFrPIO}?z={qW}GXY$8i>CAc~`-p2( zNY3DH5vD}MnMD{j9I0Ul?=^q_3zw7f+ZwY=Aj7)(=U>-c>zvN$&}5o=t^_5E2R{SW zt!t1qo#Ibn5m3@b`npVg$!hBQ`sB?=Ct&lPBdLGR+@L8R3m0eRPNA5!g`i2U_(3L@ zR$XDWbX%@zqTZs4310(FBE})KKtopeKYt$pyI>C;L#@k2B)1{$-Ylhg7LF)`ilVd@ zPj^bXqjrALsCFXW$V|tvI_|!cP|M53ZE8b~TSk4&m zx5OT7p&V=(nYY^1Uy4>~w4ca$nR4zIIRJC)Jdw#f%4S$iZ2k2~svUEbuc?PdJ$$kx z)DN?crkbxDOkMST>*^gp3e{W1>6i6YTu(FAkMU{BAPP4cLh>$>9j6DUwQm>FnQXN0 zEeO>*7u!&~+HB+d8jNe5ZN!*l=yHoG0l1ly(5sWcp!lcKim)s1Tk>AB)A#y{S=uie zmk{N|cH@qEvqLm(Ns^0#PBu{3eG<|V(UKj#d@6koz*N6id=53~AZ@SRnChYkI5w*4 zp+P%C-3fBL!kVX;%6!lgqmol+C&CFLU6XBcAwU{xtM<&Qj8hf$*na zE9gu!YJtbGJB+yz@%0yL-#elc7n4|;c&(p9n*E=A+6g&r<2Vrme;wrpSW<%ezoDfG zf5l(8@3y<%s$V%^lLT9}%N5K_beOgAU zM#)pI_1^8M19(5tIEGkj~HY2bjr7uZht zma(flZ>cYqu50W7A`dM>9@jDRDwn(<>CEn@%&3Ah)Z>Zi%YX0#%#X{p1Vf>uqIj3L z|Dso2lNFJz`vapxNQHG8LX+{b#IAyM^-Ep5Q-s}vQp50Z?^+oDcLRZ1w=#fSA@0UPk=+`& zo%RUYli2KdzKEbUXySzv4~sbTY2Qctg!rnGcZ+BqWBKkBrg`*I@juuPBnq!96HUFc zj23);wU(LWZSvx?-@OIvJ?|S15Z$*;GDf(yoL;o>k|moEO%ErRpmpESqlUkw*!z`o ztptj&;|YVEt%&@t^uXiOHbr{1G|J)oLA1+cqlhz)ax+s|81yh1vidL!*Q_an4x!Db zf*;&Z(4aZyBN{q4f(tG`WExkTc9RqDjSh-4f3F&oV~uiAbSFbnuls`kM+1?~b-Sbe zPS5K1($B{T_pEXC705Dzg*&@hXe~n=B!Q_2wW+SEPcpG}S5kv<3(F~UxP8abDP+T5 zW`dRf7*X7IethV!8}PxLG=qMBCL;^C@&FPRupt`G za8W@0+^pA$Q^?lcq8D>zg#Q$_z8z?Lt*+n2(NHX}PO`kJ&9&~2*4vv#N)skn-@);& zwdiwr2FXqS@@bXM^iVKosmoIl1m%C#gr5>U!a-O?OcCTA6voLSzZ|{te8K)RC*(v{ zZN(f3TqCA5_-Ty9ZL7mS& zZQFNn(x6Pm7Y9?-o*>lY*Wf#rK`IKICm_@bHPf#fb^l;CIr@%EYM#`+7SF*Q%%EzK zPY87RA{#Aia8eMWm=tR1G}8(M!u6}b=z$CxByOEWNkD9xSv^9`>f87Mwf5nv#Qj|< z#Q26|W)YUWIh}^qnVS(iCFJixWVTzyq&=Z?wT<`lIzgD)*pTk)l8;PG0)}sUwb)ku zxEvRFkxf(z7!<=505s-MxH{U^PS|G)DA&T$Qk2JgS*L2wYp@3;*{^772X3u6)eH?5 zG+PB=Vc#-J2YR^Y_dK*P1Mis{7PIlu%FiR6M2Y9<7wtjFj1sQUW_pO49E)g^^z>XO zY4cgi%3_~SX{7HL8lYt$kJUNZ54zQ*v#uS#y?)4BXlw^Bgk_+6L(UMQ%^(WtLsA(A zqy4i-Jl&I*e`^2-_4~Ys_bk-e@FPCH;Rt>{m(V@=!7r9!0={$Zqs>pbfBM#YLA^A+ z4O(|eJDVkiKX!R3tss>zFN4l~^_hT4V0XYql+1v8@`DiH>cP~xXC`t2MQA6yplp8x zt_G0Bp&6RqCTr!Sv)G>URpwjK`~K(9?q?6@myKFJXIkyE;H9SB>+=DD@kxEaU=kA$ z)v)(_h{3(XU=NSt+x?wil>{Wgmj#?hc6Lm>ZHOdjixVDk$yKwHu3Q&G8z^%(8)oK_k+JbmBp)2t@gm^67>Ftn+ zrMo^Z%zpx*kIK$}NJVv@>Xwmyw;Td*+JDNF9&BL;zvgeU=gq6f)`3=+&d69dsj~YF zdQGK)^OY(IwDsp=d2YqWB+W;R1zLkbE3LI7sivc?PovN7pMJ1@A(^5QH{qUxOP!xV zQYtz(A6aGjQXSj2tQlIhe8W|nt`-AIP+INIS%my(M=}&1K_i+Ein9kWVTonRI#}4^ z3An2#eKI|TY;0RbWb?bBIqE5mOHyK}X~KK@EOPqfkRX`K_8)VtBSbyT%#DW1^N30f zgh#(hLR;UbA1VDx9-RWH%N)#}0tx;?y`C-wU_DVGuN4=G;r${Iy?)q)goL&v@HDE* zFU4-Jl(Yd#w1tf)x49BDxipSKlm6bn&&Vm89iy( z!dI*H%+y0uZLWV6%W*QRXh>eKEC?d4Ool3Izt_=@Dz-k6sn(y@k{#_k0M>)|kNjS7 z(`Lo`_y2}j-=M2KM$(@g26-4D=>wD@FJviYbVJ3>mvPPYd^#?Prt$kZS|GxB)Fks+ z*5`L}*)F1Rp>@=QgN?640lEFAoI*+Nub9ODV^o2GA{Cg(as{SNwYMq+O1c+9BrYjf znRd~v7N##L!5#P{?~dHIWp{Z9*y2^XEdk)^yn5UOrU zH#c&;z$l}fM1Wsyrtmx8pmK;>+F=h8ABAdv{a1$R%_621F-2=UFe8@xQpYwu(!>t5e@!=am^Ck8D zC5$4lCEO2dW+r+OE}01}vOU8xZPu>kC~M(=2rWI$Xh+}iw@$Vuy`A@LdTexMH`5}~ zg4;Vpb2%+n*34%q8@k6r7v7r-QtF^y*8$9aPOyIilrk>VdpHEC$w{;Mu^6_zooJ0F!;Z2MJb(RL$nrpVX=D*RHz zvu8DBZfhbw6FZi63%MV|AzzJXvr7*3gll94Fl(h0gEFIS` z$8*$Y5c`NIwAzQOGz;q*nuxJq5wtMc!fYkLyQ0*bU&oS*n0IKnylM-!fGzM{F+{A@ zC=fM6<@rviXI+LpnCUl8GWB;Sq4}}fca;99?oxP}iR@?)Gnv2AydCfKtONDTsOk~V z&%&qQQH7WTH_&`j??})C_NVW!+=oltb%WQfJ4)tQv~+8R$kz&WQJ6qUKNKq_XvCxX zkR#e${2;C4yEkVRKJz{bOQtUrrXpGwcv_Y7szL#YVvso|(Hm{RyJw=r&+Qnpo`Hf8 zy)v07)Al~UXIP9i;i)&^3-u|D>RjTq$1<6fvSuMob8!Is1f-j+j8?kUQHHmpVHQRt zaTb;sHQdg>G2SIq-h4A?<_Y_I1<|v}M)CRPKI!soCcI=#y&GusR=*fvM-7tagveWKeT$ zap#plCE4YA=Zqp_mpb5W6h2RxZ!D6T?#2cyy@jvnTi>pc3c$`^+eA`zW@wS7cg)oE z7*Y)x3+e`&r~Ka{ej^88wiVFzn1cgQ~ifh&QQgoLb5lQ|SY{d{%e-D+bm_9QzK zJ((8-;*7KsEz~?{+@ocr0<#lkqMuB&Cx1qJ_(p5^$RH9OUpoVXvwZ8g?#Z9ELCwr# z9UgQ=5MpFukcbNQW3vdEsJ-i??i@>tm%GYiSo>KlO~cGPToU`ohWY^g0yP0|UTa@t zlT1=gJwB<6lMKh{ZeSwK%A!O=AC~UlJ>qtNhXAtETt=9ZA4xhnX+FO*WOuRx@mr65 z2^S>IAe(!q=HRC_Zh>%iVJd8BC)rb%MYwiH6Umc?oZV%8>+dxSe63WV?Ua;f5tCsS z^s{ld$Xu_C92H!V%;w$cVba44|3VHuf3f5~VruMs-rPN%uzg%apZ*`dKrI<{oz#Xz z<$h4HlsM>-8Q^Z4Maty$nFuw;FhI`KNay%YM8K~)vkD~A%9E1YLl}Zj?OWvjXE$1G zOi7!!%(&w#Tclo_fOP*7+6+n3Y9C;7dcmIZ6N$k;u(vf~-OUNiXteo6kt)~F4(Z4M zQO9gFht8<0xWFO{L&(Yq=cBh!BLgiAp>%EyAWaL*B$gU~)ke+0hSd`?Ldz%PKTLTo zhU{O0aG_N|0b8T=juPN_;)g}q19le#o;)Dqk7f z^;-0_F|rm)*SaXl?$5$J@&!>Pg)lYTEY=eEFWsPi(_5 ztW1QOWlI12V3IT)SXdVESMH$5WggwOk7+b4>T$0WOOQNYg$aiNsN!bqAOZKY8(-Nj zB%#|>NGxm@SZceS6zgS}iA7AEyTI&-x&p79L!JZd130SqY=!?jvcR%@Yn8VVPfI8 zU|a&A!)}o#h%wjtFBbmlDzp(QZ6gO}!VAy%!A;zUPp06L_G&`C05d;~%mT(;$W~F9 z9CED#3`fDQg}2`(Taw=Fjk@-QUT&6ZNET$0p@l3g!@u8uP~vMrI%35KQ#WYI4$S&2 z9kZ|TDzqTb2~*$G_zCMDsJ^q>!5)zWKRgnzWXd^xfhf9>7~dBBHf!Hv@MlE5IH4Kh zjh2x~Ls&Z``WabxW5SVbR~?V|zHJ>Aot~gk95rbwvzja9*k=b(a_X?SnhN7~i)qq} zAm1zciqXca&u?|>AWzRHxK3KyCX7jz5}QU8vUE-NHMPyez`i#ZTLah!w`#u)evF(t z_-xmpv~8pd&m56do)`ZD7cTb!gpn3`C8>+=?Fo7x?ck$xNcfAdP}}*9AZqQJ-OqXO z7+>RED7ci}scX`WIe}-ejS~f>=`ljP<-xVI^BAcAAj;O4Qc3u~qcNf)O=DQM3~F4> zMY1q#mjN6;ZeC~f2r^&)&Z1}H1KZYrSnT?K+A@{_Sd|qL$?dN|xu9Qf6gj|7MUG9{ zgA%t!^-g}O8;}bc8`yOF@FPC@Sghi{?P@zgwHAuYBW^bD3 z17hh>1EF|w!xfpDwXwN=2HNuD{*tTdkf`X_pxU@3?b1#&?;)-0^y|it91OB3X)zA4 z+P`)%>0!9|oT=y3R6F6H%T4#=?_XDshAqX5{?Qc2sqcI!T%2x>BRiP0v~CD=KDG4Z z;|=SGv{#ksw=0BI74!}h@mAWAK5O(G^s|1g9fFthSCyc}1&FbO!MNB`h<)Xrj_3Fk zqtyi$G>|)J##}RAPyBOe*}A&}ji;9T8t*vxaGsVwk}w5#EobA~G4ixa?>F;vx^d4u zy$HiIEgs9&n`G9xc``oscQWOWlioLUME(0E#XG!t5hnn?_u$3-p!7*2K~iUR`cYwslmTV^c36jXVk z85iI!mNB$$%psbiH05(^(X&>8Jky~lOHRHCh@(BEwye1J3^v+ckdKozh7Caf)N;9e zG=fpCPk3)_HxWgEx)j@DZW_mZiPKHESF|ET^4c6k3-&;Ir=>W}2EG`yq;^yJQtRp{ zFgacQ0!FpB$wNMiQKEhQ!ET z-|veSQE9*CLI{VSMZfV&>pED9qW)aW1WSu-+5e93!=>zU_VAza9wP5J!FHNM61y+; zJC3|yllMh)z#jFs!mq9s*vM5Rn5rHL8R1*u-}Ansl2%)iQnV6Whi}H|+OMIhyu0uI z2;L*ZdvN$TroGLljd8U)BYeseH2r)6aysw4hu{Pr&Jg$-)s^96K`EN)2c}$;EZVb^ zr4^{Gx=gSORQuV34}MT8o#y`a6p#Y0f5BpL&ZOE68pds2r8+}e?;y`2Xt?}hsw{vq zhbz*%YQPHmki??x9{4`7)46;W)U3R|IwT#|fFXL_Z8~%_8d1I416sN0qC~ zpp;3QW})*W4EomIDZJhhUkC&!45a$?d5_~gr)QAh-69ju-yLudk*Rt?>0fl)BHG&$ zRWLaGwGCsms=Oej&hGd2zq0VvKz&^3C73|(6rLHF0jP7^!6|NV6Y(xf6YIR&cNQtS zD}AuxkG8xwJp7(;q2&#ZW<5I6YT|%!oKUJM%zl)tT(#3z8&_T6o>h-t;$(Iuq1YGL zEC~DnAuL>L)Fjd>Q)>0A!~Uufb?pJX%eIRzZ0H2z6GvPptx}>w?t9>{zXCuu>H$5V zDMd-sbvd?dy)5Oc2F>dqN6(yY{<$m1{9p8feyyEroqhbKcv9R8ZERbw#J`znmkOWS zVj?c7sKYoHBE^@&m-Z&Tq>ge3cSllb4Cw$)39q?A3OFes4#F$jaiFP#bf_E3EYi}Q z2O)RjoWCnY+2P_u{5QUXJQwsOCd$;J6VS2Y)=znav~D1Izybkh=%^yRuyR~9W!Fw< zxq2h!%l0V#wbl?)Lv+F}PtIDF-g38>t;gop4mgKe`W~7^P9BdYH#i5bj3(q^janoR z&YrolTsdXeE(@~OGrrIJ0P|0^gA(Ty6}5TI4lSc1eD*>XK~tgdds@Fc2%&pn6r9ap z$=u{S{d_f3<4#Re2Z=Wu)%SQ2EKRk8rKAoen&!d)7R-U{B9#x4MVlAV8ynjH-smA@ z8i&@K&%iAP$AdtK_mG+@-l5=78RSm+AH8M4?Vr+M>cJ$-Ep%Y#J&=L!+jAA1Rv1+b zU>akRe)=hyC+>{CrxgD0Hf^`@jKFZW5H;J<(^5=_y{|&)?+G~E?7)(cTv<5}ROP56 zkN!XcEGC)8T1{S92Eb>@V`2~-yzc(Y96~Rw?bp;YP$=`t4Z$zeup2|=O5n;NwKb_w zvSLTl%-;2WvNZZRTNwcm+kwdGHTQw*wRd0bEXQI~S-Ecpnm(dv9SZR&t{PVa5g&h7 zgygQ}FnO|-b$~T+oTZ)ddvawB$!&XD|D|j5=#_u?rd?Cc-hFl~?Th4`n+m2zSQbX@ zIod2W_Cf}$$M>1D)IPkQ$ypJd^;15@Gr^#Bdag{9uy|P0DT{1wVh7B2X9p~b(k{bm zE9c2_#^vcChU#0EhO0*;`2S0FS4c6_SvW_#LD7mK^__nYijVgJgPgI$9KwKu zs&3A~MKZ4YBg8DPb(2iaaRKP*WCCn-6LGxN9x-<&43^{lBp-|Vhvp_?o;zt(cbWx}uxLe9ljwipOKPt|R2~>?_;aDYM$5EXTURej zMUW9()Og3(A2;moSJ~F8Vf;zgynZNzaiIM158^_g# zNT*wTw93wvKPGj@_86W|HS7F$D&V)Yaz z9q$T_OYV)WN>jDq<<}Yt4bMDJeLK6e^MxL1Er{)w-vG;KLEmx;$N!<3tI#Uym5tSk zkY#nA`HLxamU^Sf#K!8B$;$H*f2VDO2W7T&FNojF=%XQ@R59ot!C%1lF|&#VClCl8 zuxp*MF0e7chC=G0LJ+`J0F~lp(Ec#sjSm--%GLWs_$7Vi)SR;^6#s{AQ@THemQFyc z@`5Atk;DrlXu_gonCC z%po4$vd%-U%s-MxAH@8@H~F8vP;EEJf4?nN9}!IvMJ}^�*>u3Ue92%OUZlV3Ol! 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 X - - - + + + @@ -21,44 +21,47 @@ - + - - + + - + - - + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + -

Blast your Startup to the Cosmos

QAComet: Subscription-Based Quality Assurance for your SaaS

We've Revamped QA

Now it's an Asnyc Workflow
Orbiting around your Product

Schedule

Subscribe to our service and submit as many tickets as you want on our Github Project board.

Receive

You'll see a response with a full QA report, test code, etc. within 2-3 business days

Update

We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.

Recent QA Work

Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier.Ali B.

Subscription Benefits

A Constellation of QA and Testing Services for Robust Launches of New Products and Features

Sales Funnel Testing

Find bugs before potential customers leave from frustration

Usability Testing

Extensive usability tests for those hard to find edge cases and bugs

E2E Testing

We'll test user workflows guaranteeing minimal functionality before deployment

Multi-Browser Support

We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac

Regression Testing

Make sure bug fixes don't revert, especially for core functionality

Integration Testing

Ensure your systems are coordinating together

Clear Pricing

Building great products is hard,
pricing shouldn't be

$4,999/mo

Billed monthly
no contracts, no commitments

Pause or cancel anytime

Signup
1 request at a time
2 week $50 trial
2-3 business day delivery
Unlimited users
No contracts, pause or cancel anytime
Curious how QAComet will work for you?
Book a call

FAQ's

Why wouldn't I just hire a full-time QA engineer?
Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.
Which frameworks do you use for testing?
We mainly write tests in javascript using Playwright. We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.
What kind of platforms do you offer testing on?
We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.
How can I run these tests?
Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.
How quickly will tests be ready?
We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.
Can we use another project management tool?
We can, but that's an add on cost since it slows down our workflow.
How are projects split up?
You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.
How can I get started?
You can click on the "Start Today" button in the navbar and it will take you to the registration section.
Do you offer yearly pricing?
Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!
Can I get a refund if I'm not satisfied?
We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.

Book a call and see if QAComet works for you

Receive a guided tour through our QA process and find out how your company can benefit from QAComet.

Book a call
- \ No newline at end of file + +

Blast your Startup to the Cosmos

QAComet: Subscription-Based Quality Assurance for your SaaS

We've Revamped QA

Now it's an Asnyc Workflow
Orbiting around your Product

Schedule

Subscribe to our service and submit as many tickets as you want on our Github Project board.

Receive

You'll see a response with a full QA report, test code, etc. within 2-3 business days

Update

We can tweak and toggle updates/fixes as much as you like. No matter the feature change, we can make sure your product usability is top tier.

Recent QA Work

Lucas at QAComet really blew us away in multiple areas. Not only did he write numerous tests and find many bugs and edge cases, he also helped setup our CI pipeline in Github, helping ensure our development process is top-tier.Ali B.

Subscription Benefits

A Constellation of QA and Testing Services for Robust Launches of New Products and Features

Reduce Churn

Find bugs before potential customers leave from frustration

Usability Testing

Extensive usability tests for those hard to find edge cases and bugs

E2E Testing

We'll automate the testing of core user workflows guaranteeing they're functional before deployment

Multi-Browser Support

We test using multiple browsers and platforms: Chrome, Firefox, Edge, Safari on Windows and Mac

Regression Testing

Make sure bug fixes don't revert, especially for core functionality

Integration Testing

Ensure your systems are coordinating together correctly before reaching production.

Clear Pricing

Building great products is hard,
pricing shouldn't be

$4,999/mo

Billed monthly
no contracts, no commitments

Pause or cancel anytime

Signup
1 request at a time
2 week $50 trial
2-3 business day delivery
Unlimited users
No contracts, pause or cancel anytime
Curious how QAComet will work for you?
Book a call

FAQ's

Why wouldn't I just hire a full-time QA engineer?
Great question! Having a full-time QA engineer will be much more costly than signing up for our service. This means you'd be spending $140k or more a year vs $60k, which is an $80k difference! Moreover, while hiring there's hurdles trying to find the right talent, going through salary and benefits negotiations, and (generally) having to give away equity for talent. Our service cuts through this cruft through easy monthly payments.
Which frameworks do you use for testing?
We mainly write tests in javascript using Playwright. We've found it to be robust and our preferred option for testing web applications. Although, if needed, we can write tests using Jest, Cypress, Mocha, Tape, Jasmine, NightwatchJS, or whatever framework you use, but this will be at the expensive of productivity improvements.
What kind of platforms do you offer testing on?
We do usability testing on all types of applications, mobile, desktop, or web, but only write automated tests for web applications. Now, theses automated tests can be ran on mobile browsers.
How can I run these tests?
Playwright can be run on a number of configurations, whether it's through some CI setup or through Selenium Grid, it offers wide testing availability.
How quickly will tests be ready?
We will have test code ready between 2-3 business days depending on the scope of the ticket we're working on.
Can we use another project management tool?
We can, but that's an add on cost since it slows down our workflow.
How are projects split up?
You can write tickets as vague or abstract as you want, and we will split them up into actionable chunks which are workable within the 2-3 business day timeframe.
How can I get started?
You can click on the "Start Today" button in the navbar and it will take you to the registration section.
Do you offer yearly pricing?
Yes! We have a 15% off discount for yearly pricing. Check out our plans above and start today!
Can I get a refund if I'm not satisfied?
We offer a $50 trial for the first 14 days of service for monthly plans only. If you aren't satisfied, you can cancel and we will not charge you further.

Book a call and see if QAComet works for you

Receive a guided tour through our QA process and find out how your company can benefit from QAComet.

Book a call
+ \ No newline at end of file diff --git a/playwright/_payload.json b/playwright/_payload.json index 55819c8..ab0dfe4 100644 --- a/playwright/_payload.json +++ b/playwright/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":22},["Reactive",2],{"playwright-posts":3},[4,14],{"title":5,"shortDescription":6,"created":7,"link":13},"How importing from Playwright works","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":8,"number":9,"month":10,"day":11,"year":12},"March 13, 2024",1710309600000,"Mar",13,2024,"/playwright/how-playwright-initializes",{"title":15,"link":16,"created":17,"shortDescription":21},"Architecture of Playwright","/playwright/architecture",{"string":18,"number":19,"month":10,"day":20,"year":12},"March 11, 2024",1710136800000,11,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",1714258642226] \ No newline at end of file +[{"data":1,"prerenderedAt":22},["Reactive",2],{"playwright-posts":3},[4,14],{"title":5,"shortDescription":6,"created":7,"link":13},"How importing from Playwright works","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":8,"number":9,"month":10,"day":11,"year":12},"March 13, 2024",1710309600000,"Mar",13,2024,"/playwright/how-playwright-initializes",{"title":15,"link":16,"created":17,"shortDescription":21},"Architecture of Playwright","/playwright/architecture",{"string":18,"number":19,"month":10,"day":20,"year":12},"March 11, 2024",1710136800000,11,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",1717143074726] \ No newline at end of file diff --git a/playwright/architecture/_payload.json b/playwright/architecture/_payload.json index e8fca51..6f71437 100644 --- a/playwright/architecture/_payload.json +++ b/playwright/architecture/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1344},["Reactive",2],{"blog-post-playwright/architecture":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"link":4,"created":17,"shortDescription":23,"body":24,"_type":1339,"_id":1340,"_source":1341,"_file":1342,"_extension":1343},"/playwright/architecture","playwright",false,"","Architecture of Playwright","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"Architecture","/playwright/architecture/",{"string":18,"number":19,"month":20,"day":21,"year":22},"March 11, 2024",1710136800000,"Mar",11,2024,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",{"type":25,"children":26,"toc":1327},"root",[27,38,46,71,116,121,127,132,195,208,301,343,412,418,423,430,435,483,514,520,542,573,579,601,632,638,652,716,722,727,766,824,852,886,918,929,996,1008,1196,1253,1305,1311,1316,1321],{"type":28,"tag":29,"props":30,"children":31},"element","p",{},[32],{"type":28,"tag":33,"props":34,"children":37},"img",{"alt":35,"src":36},"Diagram of Playwright's architecture","/img/playwright/architecture_diagram.jpg",[],{"type":28,"tag":39,"props":40,"children":42},"h2",{"id":41},"intro",[43],{"type":44,"value":45},"text","Intro",{"type":28,"tag":29,"props":47,"children":48},{},[49,51,60,62,69],{"type":44,"value":50},"When you load up the ",{"type":28,"tag":52,"props":53,"children":57},"a",{"href":54,"rel":55},"https://github.com/microsoft/playwright",[56],"nofollow",[58],{"type":44,"value":59},"repository",{"type":44,"value":61}," for the Playwright library, you may be overwhelmed by the numerous packages living both inside the ",{"type":28,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":44,"value":68},"packages",{"type":44,"value":70}," folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import",{"type":28,"tag":72,"props":73,"children":78},"pre",{"className":74,"code":75,"filename":76,"language":77,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { test, chromium } from \"@playwright/test\";\n","example-script.ts","ts",[79],{"type":28,"tag":63,"props":80,"children":81},{"__ignoreMap":7},[82],{"type":28,"tag":83,"props":84,"children":87},"span",{"class":85,"line":86},"line",1,[88,94,100,105,111],{"type":28,"tag":83,"props":89,"children":91},{"style":90},"--shiki-default:#F97583",[92],{"type":44,"value":93},"import",{"type":28,"tag":83,"props":95,"children":97},{"style":96},"--shiki-default:#E1E4E8",[98],{"type":44,"value":99}," { test, chromium } ",{"type":28,"tag":83,"props":101,"children":102},{"style":90},[103],{"type":44,"value":104},"from",{"type":28,"tag":83,"props":106,"children":108},{"style":107},"--shiki-default:#9ECBFF",[109],{"type":44,"value":110}," \"@playwright/test\"",{"type":28,"tag":83,"props":112,"children":113},{"style":96},[114],{"type":44,"value":115},";\n",{"type":28,"tag":29,"props":117,"children":118},{},[119],{"type":44,"value":120},"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.",{"type":28,"tag":39,"props":122,"children":124},{"id":123},"root-directory",[125],{"type":44,"value":126},"Root directory",{"type":28,"tag":29,"props":128,"children":129},{},[130],{"type":44,"value":131},"In the root directory we find the following folders",{"type":28,"tag":72,"props":133,"children":138},{"className":134,"code":135,"filename":136,"language":137,"meta":7,"style":7},"language-console shiki shiki-themes github-dark","browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","playwright/","console",[139],{"type":28,"tag":63,"props":140,"children":141},{"__ignoreMap":7},[142,150,159,168,177,186],{"type":28,"tag":83,"props":143,"children":144},{"class":85,"line":86},[145],{"type":28,"tag":83,"props":146,"children":147},{},[148],{"type":44,"value":149},"browser_patches/\n",{"type":28,"tag":83,"props":151,"children":153},{"class":85,"line":152},2,[154],{"type":28,"tag":83,"props":155,"children":156},{},[157],{"type":44,"value":158},"docs/\n",{"type":28,"tag":83,"props":160,"children":162},{"class":85,"line":161},3,[163],{"type":28,"tag":83,"props":164,"children":165},{},[166],{"type":44,"value":167},"examples/\n",{"type":28,"tag":83,"props":169,"children":171},{"class":85,"line":170},4,[172],{"type":28,"tag":83,"props":173,"children":174},{},[175],{"type":44,"value":176},"packages/\n",{"type":28,"tag":83,"props":178,"children":180},{"class":85,"line":179},5,[181],{"type":28,"tag":83,"props":182,"children":183},{},[184],{"type":44,"value":185},"tests/\n",{"type":28,"tag":83,"props":187,"children":189},{"class":85,"line":188},6,[190],{"type":28,"tag":83,"props":191,"children":192},{},[193],{"type":44,"value":194},"utils/\n",{"type":28,"tag":29,"props":196,"children":197},{},[198,200,206],{"type":44,"value":199},"along with the ",{"type":28,"tag":63,"props":201,"children":203},{"className":202},[],[204],{"type":44,"value":205},"package.json",{"type":44,"value":207}," which includes the following keys",{"type":28,"tag":72,"props":209,"children":213},{"className":210,"code":211,"filename":205,"language":212,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","json",[214],{"type":28,"tag":63,"props":215,"children":216},{"__ignoreMap":7},[217,225,249,270,293],{"type":28,"tag":83,"props":218,"children":219},{"class":85,"line":86},[220],{"type":28,"tag":83,"props":221,"children":222},{"style":96},[223],{"type":44,"value":224},"{\n",{"type":28,"tag":83,"props":226,"children":227},{"class":85,"line":152},[228,234,239,244],{"type":28,"tag":83,"props":229,"children":231},{"style":230},"--shiki-default:#79B8FF",[232],{"type":44,"value":233}," \"name\"",{"type":28,"tag":83,"props":235,"children":236},{"style":96},[237],{"type":44,"value":238},": ",{"type":28,"tag":83,"props":240,"children":241},{"style":107},[242],{"type":44,"value":243},"\"playwright-internal\"",{"type":28,"tag":83,"props":245,"children":246},{"style":96},[247],{"type":44,"value":248},",\n",{"type":28,"tag":83,"props":250,"children":251},{"class":85,"line":161},[252,257,261,266],{"type":28,"tag":83,"props":253,"children":254},{"style":230},[255],{"type":44,"value":256}," \"private\"",{"type":28,"tag":83,"props":258,"children":259},{"style":96},[260],{"type":44,"value":238},{"type":28,"tag":83,"props":262,"children":263},{"style":230},[264],{"type":44,"value":265},"true",{"type":28,"tag":83,"props":267,"children":268},{"style":96},[269],{"type":44,"value":248},{"type":28,"tag":83,"props":271,"children":272},{"class":85,"line":170},[273,278,283,288],{"type":28,"tag":83,"props":274,"children":275},{"style":230},[276],{"type":44,"value":277}," \"workspaces\"",{"type":28,"tag":83,"props":279,"children":280},{"style":96},[281],{"type":44,"value":282},": [",{"type":28,"tag":83,"props":284,"children":285},{"style":107},[286],{"type":44,"value":287},"\"packages/*\"",{"type":28,"tag":83,"props":289,"children":290},{"style":96},[291],{"type":44,"value":292},"]\n",{"type":28,"tag":83,"props":294,"children":295},{"class":85,"line":179},[296],{"type":28,"tag":83,"props":297,"children":298},{"style":96},[299],{"type":44,"value":300},"}\n",{"type":28,"tag":29,"props":302,"children":303},{},[304,306,311,313,319,321,326,328,334,336,341],{"type":44,"value":305},"The ",{"type":28,"tag":63,"props":307,"children":309},{"className":308},[],[310],{"type":44,"value":205},{"type":44,"value":312}," gives us the hint the core functionality is within the ",{"type":28,"tag":63,"props":314,"children":316},{"className":315},[],[317],{"type":44,"value":318},"packages/",{"type":44,"value":320}," directory since the root ",{"type":28,"tag":63,"props":322,"children":324},{"className":323},[],[325],{"type":44,"value":205},{"type":44,"value":327}," file is labelled private, has \"internal\" in its name, and uses the ",{"type":28,"tag":63,"props":329,"children":331},{"className":330},[],[332],{"type":44,"value":333},"\"workspaces\"",{"type":44,"value":335}," key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the ",{"type":28,"tag":63,"props":337,"children":339},{"className":338},[],[340],{"type":44,"value":318},{"type":44,"value":342}," folder",{"type":28,"tag":344,"props":345,"children":346},"ul",{},[347,359,379,390,401],{"type":28,"tag":348,"props":349,"children":350},"li",{},[351,357],{"type":28,"tag":63,"props":352,"children":354},{"className":353},[],[355],{"type":44,"value":356},"browser_patches",{"type":44,"value":358}," - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows.",{"type":28,"tag":348,"props":360,"children":361},{},[362,368,370,377],{"type":28,"tag":63,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"docs",{"type":44,"value":369}," - The docs folder contains markdown files which compile to the documentation found on ",{"type":28,"tag":52,"props":371,"children":374},{"href":372,"rel":373},"https://playwright.dev/docs/intro",[56],[375],{"type":44,"value":376},"the Playwright docs",{"type":44,"value":378},".",{"type":28,"tag":348,"props":380,"children":381},{},[382,388],{"type":28,"tag":63,"props":383,"children":385},{"className":384},[],[386],{"type":44,"value":387},"examples",{"type":44,"value":389}," - Here are examples of test scripts to refer to, while getting started with using the Playwright project.",{"type":28,"tag":348,"props":391,"children":392},{},[393,399],{"type":28,"tag":63,"props":394,"children":396},{"className":395},[],[397],{"type":44,"value":398},"tests",{"type":44,"value":400}," - Even testing libraries should have automated tests, which are written in Playwright.",{"type":28,"tag":348,"props":402,"children":403},{},[404,410],{"type":28,"tag":63,"props":405,"children":407},{"className":406},[],[408],{"type":44,"value":409},"utils",{"type":44,"value":411}," - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more.",{"type":28,"tag":39,"props":413,"children":415},{"id":414},"packages-directory",[416],{"type":44,"value":417},"Packages directory",{"type":28,"tag":29,"props":419,"children":420},{},[421],{"type":44,"value":422},"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions.",{"type":28,"tag":424,"props":425,"children":427},"h3",{"id":426},"test-reportinggeneration-packages",[428],{"type":44,"value":429},"Test reporting/generation packages",{"type":28,"tag":29,"props":431,"children":432},{},[433],{"type":44,"value":434},"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is",{"type":28,"tag":72,"props":436,"children":439},{"className":134,"code":437,"filename":438,"language":137,"meta":7,"style":7},"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","playwright/packages",[440],{"type":28,"tag":63,"props":441,"children":442},{"__ignoreMap":7},[443,451,459,467,475],{"type":28,"tag":83,"props":444,"children":445},{"class":85,"line":86},[446],{"type":28,"tag":83,"props":447,"children":448},{},[449],{"type":44,"value":450},"html-reporter/\n",{"type":28,"tag":83,"props":452,"children":453},{"class":85,"line":152},[454],{"type":28,"tag":83,"props":455,"children":456},{},[457],{"type":44,"value":458},"recorder/\n",{"type":28,"tag":83,"props":460,"children":461},{"class":85,"line":161},[462],{"type":28,"tag":83,"props":463,"children":464},{},[465],{"type":44,"value":466},"trace-viewer/\n",{"type":28,"tag":83,"props":468,"children":469},{"class":85,"line":170},[470],{"type":28,"tag":83,"props":471,"children":472},{},[473],{"type":44,"value":474},"trace/\n",{"type":28,"tag":83,"props":476,"children":477},{"class":85,"line":179},[478],{"type":28,"tag":83,"props":479,"children":480},{},[481],{"type":44,"value":482},"web/\n",{"type":28,"tag":29,"props":484,"children":485},{},[486,488,495,497,504,506,512],{"type":44,"value":487},"which contains the code associated with either handling test reports or ",{"type":28,"tag":52,"props":489,"children":492},{"href":490,"rel":491},"https://playwright.dev/docs/codegen-intro",[56],[493],{"type":44,"value":494},"generating",{"type":44,"value":496}," them with the recorder package. In addition, there is the ",{"type":28,"tag":52,"props":498,"children":501},{"href":499,"rel":500},"https://playwright.dev/docs/trace-viewer",[56],[502],{"type":44,"value":503},"trace and trace viewer",{"type":44,"value":505}," which can be recorded during playwright test runs. In addition, the ",{"type":28,"tag":63,"props":507,"children":509},{"className":508},[],[510],{"type":44,"value":511},"web/",{"type":44,"value":513}," package provides utilities shared across the various web-based tools listed here.",{"type":28,"tag":424,"props":515,"children":517},{"id":516},"browser-specialized-packages",[518],{"type":44,"value":519},"Browser specialized packages",{"type":28,"tag":29,"props":521,"children":522},{},[523,525,531,533,540],{"type":44,"value":524},"Each of the packages here are simply exports of the ",{"type":28,"tag":63,"props":526,"children":528},{"className":527},[],[529],{"type":44,"value":530},"playwright-core",{"type":44,"value":532}," package along with an install script for the associated browser only. You can find them on npmjs, for example, ",{"type":28,"tag":52,"props":534,"children":537},{"href":535,"rel":536},"https://www.npmjs.com/package/playwright-chromium",[56],[538],{"type":44,"value":539},"playwright-chromium",{"type":44,"value":541}," is its own package which has playwright specialized for only automating chromium.",{"type":28,"tag":72,"props":543,"children":545},{"className":134,"code":544,"filename":438,"language":137,"meta":7,"style":7},"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n",[546],{"type":28,"tag":63,"props":547,"children":548},{"__ignoreMap":7},[549,557,565],{"type":28,"tag":83,"props":550,"children":551},{"class":85,"line":86},[552],{"type":28,"tag":83,"props":553,"children":554},{},[555],{"type":44,"value":556},"playwright-chromium/\n",{"type":28,"tag":83,"props":558,"children":559},{"class":85,"line":152},[560],{"type":28,"tag":83,"props":561,"children":562},{},[563],{"type":44,"value":564},"playwright-firefox/\n",{"type":28,"tag":83,"props":566,"children":567},{"class":85,"line":161},[568],{"type":28,"tag":83,"props":569,"children":570},{},[571],{"type":44,"value":572},"playwright-webkit/\n",{"type":28,"tag":424,"props":574,"children":576},{"id":575},"browser-installation-packages",[577],{"type":44,"value":578},"Browser installation packages",{"type":28,"tag":29,"props":580,"children":581},{},[582,584,591,593,599],{"type":44,"value":583},"The packages listed here only include install scripts for each of the browsers. For example, ",{"type":28,"tag":52,"props":585,"children":588},{"href":586,"rel":587},"https://www.npmjs.com/package/@playwright/browser-chromium",[56],[589],{"type":44,"value":590},"playwright-browser-chromium",{"type":44,"value":592}," corresponds to the ",{"type":28,"tag":63,"props":594,"children":596},{"className":595},[],[597],{"type":44,"value":598},"@playwright/browser-chromium",{"type":44,"value":600}," package on npmjs.",{"type":28,"tag":72,"props":602,"children":604},{"className":134,"code":603,"filename":438,"language":137,"meta":7,"style":7},"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n",[605],{"type":28,"tag":63,"props":606,"children":607},{"__ignoreMap":7},[608,616,624],{"type":28,"tag":83,"props":609,"children":610},{"class":85,"line":86},[611],{"type":28,"tag":83,"props":612,"children":613},{},[614],{"type":44,"value":615},"playwright-browser-chromium/\n",{"type":28,"tag":83,"props":617,"children":618},{"class":85,"line":152},[619],{"type":28,"tag":83,"props":620,"children":621},{},[622],{"type":44,"value":623},"playwright-browser-firefox/\n",{"type":28,"tag":83,"props":625,"children":626},{"class":85,"line":161},[627],{"type":28,"tag":83,"props":628,"children":629},{},[630],{"type":44,"value":631},"playwright-browser-webkit/\n",{"type":28,"tag":424,"props":633,"children":635},{"id":634},"component-testing-packages",[636],{"type":44,"value":637},"Component testing packages",{"type":28,"tag":29,"props":639,"children":640},{},[641,643,650],{"type":44,"value":642},"These packages are all associated to the ",{"type":28,"tag":52,"props":644,"children":647},{"href":645,"rel":646},"https://playwright.dev/docs/test-components",[56],[648],{"type":44,"value":649},"experimental component testing framework",{"type":44,"value":651}," in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries.",{"type":28,"tag":72,"props":653,"children":655},{"className":134,"code":654,"filename":438,"language":137,"meta":7,"style":7},"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n",[656],{"type":28,"tag":63,"props":657,"children":658},{"__ignoreMap":7},[659,667,675,683,691,699,707],{"type":28,"tag":83,"props":660,"children":661},{"class":85,"line":86},[662],{"type":28,"tag":83,"props":663,"children":664},{},[665],{"type":44,"value":666},"playwright-ct-core/\n",{"type":28,"tag":83,"props":668,"children":669},{"class":85,"line":152},[670],{"type":28,"tag":83,"props":671,"children":672},{},[673],{"type":44,"value":674},"playwright-ct-react/\n",{"type":28,"tag":83,"props":676,"children":677},{"class":85,"line":161},[678],{"type":28,"tag":83,"props":679,"children":680},{},[681],{"type":44,"value":682},"playwright-ct-react17/\n",{"type":28,"tag":83,"props":684,"children":685},{"class":85,"line":170},[686],{"type":28,"tag":83,"props":687,"children":688},{},[689],{"type":44,"value":690},"playwright-ct-solid/\n",{"type":28,"tag":83,"props":692,"children":693},{"class":85,"line":179},[694],{"type":28,"tag":83,"props":695,"children":696},{},[697],{"type":44,"value":698},"playwright-ct-svelte/\n",{"type":28,"tag":83,"props":700,"children":701},{"class":85,"line":188},[702],{"type":28,"tag":83,"props":703,"children":704},{},[705],{"type":44,"value":706},"playwright-ct-vue/\n",{"type":28,"tag":83,"props":708,"children":710},{"class":85,"line":709},7,[711],{"type":28,"tag":83,"props":712,"children":713},{},[714],{"type":44,"value":715},"playwright-ct-vue2/\n",{"type":28,"tag":424,"props":717,"children":719},{"id":718},"core-functionality-packages",[720],{"type":44,"value":721},"Core functionality packages",{"type":28,"tag":29,"props":723,"children":724},{},[725],{"type":44,"value":726},"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project.",{"type":28,"tag":72,"props":728,"children":730},{"className":134,"code":729,"filename":438,"language":137,"meta":7,"style":7},"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n",[731],{"type":28,"tag":63,"props":732,"children":733},{"__ignoreMap":7},[734,742,750,758],{"type":28,"tag":83,"props":735,"children":736},{"class":85,"line":86},[737],{"type":28,"tag":83,"props":738,"children":739},{},[740],{"type":44,"value":741},"playwright-core/\n",{"type":28,"tag":83,"props":743,"children":744},{"class":85,"line":152},[745],{"type":28,"tag":83,"props":746,"children":747},{},[748],{"type":44,"value":749},"playwright-test/\n",{"type":28,"tag":83,"props":751,"children":752},{"class":85,"line":161},[753],{"type":28,"tag":83,"props":754,"children":755},{},[756],{"type":44,"value":757},"playwright/\n",{"type":28,"tag":83,"props":759,"children":760},{"class":85,"line":170},[761],{"type":28,"tag":83,"props":762,"children":763},{},[764],{"type":44,"value":765},"protocol/\n",{"type":28,"tag":29,"props":767,"children":768},{},[769,771,777,779,784,786,791,793,799,801,807,809,815,817,822],{"type":44,"value":770},"Note the ",{"type":28,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":44,"value":776},"playwright-test",{"type":44,"value":778}," folder is simply a wrapper for binding ",{"type":28,"tag":63,"props":780,"children":782},{"className":781},[],[783],{"type":44,"value":530},{"type":44,"value":785}," and ",{"type":28,"tag":63,"props":787,"children":789},{"className":788},[],[790],{"type":44,"value":5},{"type":44,"value":792}," together in the ",{"type":28,"tag":63,"props":794,"children":796},{"className":795},[],[797],{"type":44,"value":798},"@playwright/test",{"type":44,"value":800}," package installable through npm. If you look in the ",{"type":28,"tag":63,"props":802,"children":804},{"className":803},[],[805],{"type":44,"value":806},"index.js",{"type":44,"value":808}," file, all you'll see is an export of ",{"type":28,"tag":63,"props":810,"children":812},{"className":811},[],[813],{"type":44,"value":814},"playwright/test",{"type":44,"value":816},", which lives in the ",{"type":28,"tag":63,"props":818,"children":820},{"className":819},[],[821],{"type":44,"value":5},{"type":44,"value":823}," package.",{"type":28,"tag":29,"props":825,"children":826},{},[827,829,835,837,842,844,850],{"type":44,"value":828},"Another package to look at briefly is the ",{"type":28,"tag":63,"props":830,"children":832},{"className":831},[],[833],{"type":44,"value":834},"protocol",{"type":44,"value":836}," package which has automatically generated code through some of the build scripts in the ",{"type":28,"tag":63,"props":838,"children":840},{"className":839},[],[841],{"type":44,"value":409},{"type":44,"value":843}," directory of the root directory of the playwright project. This simply contains a YAML file, ",{"type":28,"tag":63,"props":845,"children":847},{"className":846},[],[848],{"type":44,"value":849},"protocol.yml",{"type":44,"value":851},", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.",{"type":28,"tag":29,"props":853,"children":854},{},[855,857,862,863,869,871,876,878,884],{"type":44,"value":856},"Now, the two main packages of the entire playwright library are the ",{"type":28,"tag":63,"props":858,"children":860},{"className":859},[],[861],{"type":44,"value":5},{"type":44,"value":785},{"type":28,"tag":63,"props":864,"children":866},{"className":865},[],[867],{"type":44,"value":868},"playwrite-core",{"type":44,"value":870}," packages. The first of which is a wrapper around ",{"type":28,"tag":63,"props":872,"children":874},{"className":873},[],[875],{"type":44,"value":530},{"type":44,"value":877}," and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the ",{"type":28,"tag":63,"props":879,"children":881},{"className":880},[],[882],{"type":44,"value":883},"playwright.config.ts",{"type":44,"value":885}," file, or any of the associated test running code, such as",{"type":28,"tag":72,"props":887,"children":890},{"className":74,"code":888,"filename":889,"language":77,"meta":7,"style":7},"import { test } from \"@playwright/test\";\n","my-test.spec.ts",[891],{"type":28,"tag":63,"props":892,"children":893},{"__ignoreMap":7},[894],{"type":28,"tag":83,"props":895,"children":896},{"class":85,"line":86},[897,901,906,910,914],{"type":28,"tag":83,"props":898,"children":899},{"style":90},[900],{"type":44,"value":93},{"type":28,"tag":83,"props":902,"children":903},{"style":96},[904],{"type":44,"value":905}," { test } ",{"type":28,"tag":83,"props":907,"children":908},{"style":90},[909],{"type":44,"value":104},{"type":28,"tag":83,"props":911,"children":912},{"style":107},[913],{"type":44,"value":110},{"type":28,"tag":83,"props":915,"children":916},{"style":96},[917],{"type":44,"value":115},{"type":28,"tag":29,"props":919,"children":920},{},[921,923,928],{"type":44,"value":922},"then you are likely importing code from the ",{"type":28,"tag":63,"props":924,"children":926},{"className":925},[],[927],{"type":44,"value":5},{"type":44,"value":823},{"type":28,"tag":29,"props":930,"children":931},{},[932,934,939,941,947,949,955,957,962,964,970,972,979,981,987,989,994],{"type":44,"value":933},"The other main package is ",{"type":28,"tag":63,"props":935,"children":937},{"className":936},[],[938],{"type":44,"value":530},{"type":44,"value":940}," which contains all of the browser automation functionality. This functionality is split up into two main components, the ",{"type":28,"tag":63,"props":942,"children":944},{"className":943},[],[945],{"type":44,"value":946},"client",{"type":44,"value":948}," library and the ",{"type":28,"tag":63,"props":950,"children":952},{"className":951},[],[953],{"type":44,"value":954},"server",{"type":44,"value":956}," library. The ",{"type":28,"tag":63,"props":958,"children":960},{"className":959},[],[961],{"type":44,"value":954},{"type":44,"value":963}," library, found in ",{"type":28,"tag":63,"props":965,"children":967},{"className":966},[],[968],{"type":44,"value":969},"packages/playwright-core/src/server",{"type":44,"value":971},", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the ",{"type":28,"tag":52,"props":973,"children":976},{"href":974,"rel":975},"https://chromedevtools.github.io/devtools-protocol/",[56],[977],{"type":44,"value":978},"Chrome Devtools Protocol",{"type":44,"value":980}," (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '",{"type":28,"tag":52,"props":982,"children":985},{"href":983,"rel":984},"https://news.ycombinator.com",[56],[986],{"type":44,"value":983},{"type":44,"value":988},"'\". The ",{"type":28,"tag":63,"props":990,"children":992},{"className":991},[],[993],{"type":44,"value":954},{"type":44,"value":995}," library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.",{"type":28,"tag":29,"props":997,"children":998},{},[999,1001,1006],{"type":44,"value":1000},"On the other hand, the ",{"type":28,"tag":63,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":44,"value":946},{"type":44,"value":1007}," library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like",{"type":28,"tag":72,"props":1009,"children":1012},{"className":74,"code":1010,"filename":1011,"language":77,"meta":7,"style":7},"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","my-automation-script.ts",[1013],{"type":28,"tag":63,"props":1014,"children":1015},{"__ignoreMap":7},[1016,1040,1049,1072,1121,1156,1188],{"type":28,"tag":83,"props":1017,"children":1018},{"class":85,"line":86},[1019,1023,1028,1032,1036],{"type":28,"tag":83,"props":1020,"children":1021},{"style":90},[1022],{"type":44,"value":93},{"type":28,"tag":83,"props":1024,"children":1025},{"style":96},[1026],{"type":44,"value":1027}," { chromium } ",{"type":28,"tag":83,"props":1029,"children":1030},{"style":90},[1031],{"type":44,"value":104},{"type":28,"tag":83,"props":1033,"children":1034},{"style":107},[1035],{"type":44,"value":110},{"type":28,"tag":83,"props":1037,"children":1038},{"style":96},[1039],{"type":44,"value":115},{"type":28,"tag":83,"props":1041,"children":1042},{"class":85,"line":152},[1043],{"type":28,"tag":83,"props":1044,"children":1046},{"emptyLinePlaceholder":1045},true,[1047],{"type":44,"value":1048},"\n",{"type":28,"tag":83,"props":1050,"children":1051},{"class":85,"line":161},[1052,1057,1062,1067],{"type":28,"tag":83,"props":1053,"children":1054},{"style":96},[1055],{"type":44,"value":1056},"(",{"type":28,"tag":83,"props":1058,"children":1059},{"style":90},[1060],{"type":44,"value":1061},"async",{"type":28,"tag":83,"props":1063,"children":1064},{"style":90},[1065],{"type":44,"value":1066}," function",{"type":28,"tag":83,"props":1068,"children":1069},{"style":96},[1070],{"type":44,"value":1071}," () {\n",{"type":28,"tag":83,"props":1073,"children":1074},{"class":85,"line":170},[1075,1080,1085,1090,1095,1100,1106,1111,1116],{"type":28,"tag":83,"props":1076,"children":1077},{"style":90},[1078],{"type":44,"value":1079}," const",{"type":28,"tag":83,"props":1081,"children":1082},{"style":230},[1083],{"type":44,"value":1084}," browser",{"type":28,"tag":83,"props":1086,"children":1087},{"style":90},[1088],{"type":44,"value":1089}," =",{"type":28,"tag":83,"props":1091,"children":1092},{"style":90},[1093],{"type":44,"value":1094}," await",{"type":28,"tag":83,"props":1096,"children":1097},{"style":96},[1098],{"type":44,"value":1099}," chromium.",{"type":28,"tag":83,"props":1101,"children":1103},{"style":1102},"--shiki-default:#B392F0",[1104],{"type":44,"value":1105},"launch",{"type":28,"tag":83,"props":1107,"children":1108},{"style":96},[1109],{"type":44,"value":1110},"({ headless: ",{"type":28,"tag":83,"props":1112,"children":1113},{"style":230},[1114],{"type":44,"value":1115},"false",{"type":28,"tag":83,"props":1117,"children":1118},{"style":96},[1119],{"type":44,"value":1120}," });\n",{"type":28,"tag":83,"props":1122,"children":1123},{"class":85,"line":179},[1124,1128,1133,1137,1141,1146,1151],{"type":28,"tag":83,"props":1125,"children":1126},{"style":90},[1127],{"type":44,"value":1079},{"type":28,"tag":83,"props":1129,"children":1130},{"style":230},[1131],{"type":44,"value":1132}," page",{"type":28,"tag":83,"props":1134,"children":1135},{"style":90},[1136],{"type":44,"value":1089},{"type":28,"tag":83,"props":1138,"children":1139},{"style":90},[1140],{"type":44,"value":1094},{"type":28,"tag":83,"props":1142,"children":1143},{"style":96},[1144],{"type":44,"value":1145}," browser.",{"type":28,"tag":83,"props":1147,"children":1148},{"style":1102},[1149],{"type":44,"value":1150},"newPage",{"type":28,"tag":83,"props":1152,"children":1153},{"style":96},[1154],{"type":44,"value":1155},"();\n",{"type":28,"tag":83,"props":1157,"children":1158},{"class":85,"line":188},[1159,1164,1169,1174,1178,1183],{"type":28,"tag":83,"props":1160,"children":1161},{"style":90},[1162],{"type":44,"value":1163}," await",{"type":28,"tag":83,"props":1165,"children":1166},{"style":96},[1167],{"type":44,"value":1168}," page.",{"type":28,"tag":83,"props":1170,"children":1171},{"style":1102},[1172],{"type":44,"value":1173},"goto",{"type":28,"tag":83,"props":1175,"children":1176},{"style":96},[1177],{"type":44,"value":1056},{"type":28,"tag":83,"props":1179,"children":1180},{"style":107},[1181],{"type":44,"value":1182},"\"https://playwright.dev\"",{"type":28,"tag":83,"props":1184,"children":1185},{"style":96},[1186],{"type":44,"value":1187},");\n",{"type":28,"tag":83,"props":1189,"children":1190},{"class":85,"line":709},[1191],{"type":28,"tag":83,"props":1192,"children":1193},{"style":96},[1194],{"type":44,"value":1195},"})();\n",{"type":28,"tag":29,"props":1197,"children":1198},{},[1199,1201,1207,1209,1215,1217,1223,1224,1230,1232,1237,1239,1244,1246,1251],{"type":44,"value":1200},"really you are importing ",{"type":28,"tag":63,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":44,"value":1206},"chromium",{"type":44,"value":1208}," from an instance of the class in ",{"type":28,"tag":63,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":44,"value":1214},"playwright-core/client/playwright",{"type":44,"value":1216},". Then, calling ",{"type":28,"tag":63,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":44,"value":1222},"browser.newPage",{"type":44,"value":785},{"type":28,"tag":63,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":44,"value":1229},"page.goto",{"type":44,"value":1231}," is making requests to interfaces in the ",{"type":28,"tag":63,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":44,"value":954},{"type":44,"value":1238}," library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the ",{"type":28,"tag":63,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":44,"value":954},{"type":44,"value":1245}," library in the ",{"type":28,"tag":63,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":44,"value":530},{"type":44,"value":1252}," package since it provides a comprehensive and battle tested API for this kind of functionality.",{"type":28,"tag":29,"props":1254,"children":1255},{},[1256,1258,1265,1267,1274,1275,1282,1284,1290,1292,1297,1299,1304],{"type":44,"value":1257},"This splitting of responsibility design pattern works well because it allows for ",{"type":28,"tag":52,"props":1259,"children":1262},{"href":1260,"rel":1261},"https://github.com/microsoft/playwright-python",[56],[1263],{"type":44,"value":1264},"supporting",{"type":44,"value":1266}," ",{"type":28,"tag":52,"props":1268,"children":1271},{"href":1269,"rel":1270},"https://github.com/microsoft/playwright-java/",[56],[1272],{"type":44,"value":1273},"multiple",{"type":44,"value":1266},{"type":28,"tag":52,"props":1276,"children":1279},{"href":1277,"rel":1278},"https://github.com/microsoft/playwright-dotnet",[56],[1280],{"type":44,"value":1281},"languages",{"type":44,"value":1283}," which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ",{"type":28,"tag":63,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":44,"value":1289},"ChannelOwner",{"type":44,"value":1291},") as you would in the the ",{"type":28,"tag":63,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":44,"value":946},{"type":44,"value":1298}," library found in ",{"type":28,"tag":63,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":44,"value":530},{"type":44,"value":378},{"type":28,"tag":39,"props":1306,"children":1308},{"id":1307},"looking-beyond",[1309],{"type":44,"value":1310},"Looking beyond",{"type":28,"tag":29,"props":1312,"children":1313},{},[1314],{"type":44,"value":1315},"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.",{"type":28,"tag":29,"props":1317,"children":1318},{},[1319],{"type":44,"value":1320},"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.",{"type":28,"tag":1322,"props":1323,"children":1324},"style",{},[1325],{"type":44,"value":1326},"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);}",{"title":7,"searchDepth":152,"depth":152,"links":1328},[1329,1330,1331,1338],{"id":41,"depth":152,"text":45},{"id":123,"depth":152,"text":126},{"id":414,"depth":152,"text":417,"children":1332},[1333,1334,1335,1336,1337],{"id":426,"depth":161,"text":429},{"id":516,"depth":161,"text":519},{"id":575,"depth":161,"text":578},{"id":634,"depth":161,"text":637},{"id":718,"depth":161,"text":721},{"id":1307,"depth":152,"text":1310},"markdown","content:playwright:architecture.md","content","playwright/architecture.md","md",1714258649810] \ No newline at end of file +[{"data":1,"prerenderedAt":1344},["Reactive",2],{"blog-post-playwright/architecture":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"link":4,"created":17,"shortDescription":23,"body":24,"_type":1339,"_id":1340,"_source":1341,"_file":1342,"_extension":1343},"/playwright/architecture","playwright",false,"","Architecture of Playwright","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"Architecture","/playwright/architecture/",{"string":18,"number":19,"month":20,"day":21,"year":22},"March 11, 2024",1710136800000,"Mar",11,2024,"Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components.",{"type":25,"children":26,"toc":1327},"root",[27,38,46,71,116,121,127,132,195,208,301,343,412,418,423,430,435,483,514,520,542,573,579,601,632,638,652,716,722,727,766,824,852,886,918,929,996,1008,1196,1253,1305,1311,1316,1321],{"type":28,"tag":29,"props":30,"children":31},"element","p",{},[32],{"type":28,"tag":33,"props":34,"children":37},"img",{"alt":35,"src":36},"Diagram of Playwright's architecture","/img/playwright/architecture_diagram.jpg",[],{"type":28,"tag":39,"props":40,"children":42},"h2",{"id":41},"intro",[43],{"type":44,"value":45},"text","Intro",{"type":28,"tag":29,"props":47,"children":48},{},[49,51,60,62,69],{"type":44,"value":50},"When you load up the ",{"type":28,"tag":52,"props":53,"children":57},"a",{"href":54,"rel":55},"https://github.com/microsoft/playwright",[56],"nofollow",[58],{"type":44,"value":59},"repository",{"type":44,"value":61}," for the Playwright library, you may be overwhelmed by the numerous packages living both inside the ",{"type":28,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":44,"value":68},"packages",{"type":44,"value":70}," folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import",{"type":28,"tag":72,"props":73,"children":78},"pre",{"className":74,"code":75,"filename":76,"language":77,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { test, chromium } from \"@playwright/test\";\n","example-script.ts","ts",[79],{"type":28,"tag":63,"props":80,"children":81},{"__ignoreMap":7},[82],{"type":28,"tag":83,"props":84,"children":87},"span",{"class":85,"line":86},"line",1,[88,94,100,105,111],{"type":28,"tag":83,"props":89,"children":91},{"style":90},"--shiki-default:#F97583",[92],{"type":44,"value":93},"import",{"type":28,"tag":83,"props":95,"children":97},{"style":96},"--shiki-default:#E1E4E8",[98],{"type":44,"value":99}," { test, chromium } ",{"type":28,"tag":83,"props":101,"children":102},{"style":90},[103],{"type":44,"value":104},"from",{"type":28,"tag":83,"props":106,"children":108},{"style":107},"--shiki-default:#9ECBFF",[109],{"type":44,"value":110}," \"@playwright/test\"",{"type":28,"tag":83,"props":112,"children":113},{"style":96},[114],{"type":44,"value":115},";\n",{"type":28,"tag":29,"props":117,"children":118},{},[119],{"type":44,"value":120},"making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.",{"type":28,"tag":39,"props":122,"children":124},{"id":123},"root-directory",[125],{"type":44,"value":126},"Root directory",{"type":28,"tag":29,"props":128,"children":129},{},[130],{"type":44,"value":131},"In the root directory we find the following folders",{"type":28,"tag":72,"props":133,"children":138},{"className":134,"code":135,"filename":136,"language":137,"meta":7,"style":7},"language-console shiki shiki-themes github-dark","browser_patches/\ndocs/\nexamples/\npackages/\ntests/\nutils/\n","playwright/","console",[139],{"type":28,"tag":63,"props":140,"children":141},{"__ignoreMap":7},[142,150,159,168,177,186],{"type":28,"tag":83,"props":143,"children":144},{"class":85,"line":86},[145],{"type":28,"tag":83,"props":146,"children":147},{},[148],{"type":44,"value":149},"browser_patches/\n",{"type":28,"tag":83,"props":151,"children":153},{"class":85,"line":152},2,[154],{"type":28,"tag":83,"props":155,"children":156},{},[157],{"type":44,"value":158},"docs/\n",{"type":28,"tag":83,"props":160,"children":162},{"class":85,"line":161},3,[163],{"type":28,"tag":83,"props":164,"children":165},{},[166],{"type":44,"value":167},"examples/\n",{"type":28,"tag":83,"props":169,"children":171},{"class":85,"line":170},4,[172],{"type":28,"tag":83,"props":173,"children":174},{},[175],{"type":44,"value":176},"packages/\n",{"type":28,"tag":83,"props":178,"children":180},{"class":85,"line":179},5,[181],{"type":28,"tag":83,"props":182,"children":183},{},[184],{"type":44,"value":185},"tests/\n",{"type":28,"tag":83,"props":187,"children":189},{"class":85,"line":188},6,[190],{"type":28,"tag":83,"props":191,"children":192},{},[193],{"type":44,"value":194},"utils/\n",{"type":28,"tag":29,"props":196,"children":197},{},[198,200,206],{"type":44,"value":199},"along with the ",{"type":28,"tag":63,"props":201,"children":203},{"className":202},[],[204],{"type":44,"value":205},"package.json",{"type":44,"value":207}," which includes the following keys",{"type":28,"tag":72,"props":209,"children":213},{"className":210,"code":211,"filename":205,"language":212,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n \"name\": \"playwright-internal\",\n \"private\": true,\n \"workspaces\": [\"packages/*\"]\n}\n","json",[214],{"type":28,"tag":63,"props":215,"children":216},{"__ignoreMap":7},[217,225,249,270,293],{"type":28,"tag":83,"props":218,"children":219},{"class":85,"line":86},[220],{"type":28,"tag":83,"props":221,"children":222},{"style":96},[223],{"type":44,"value":224},"{\n",{"type":28,"tag":83,"props":226,"children":227},{"class":85,"line":152},[228,234,239,244],{"type":28,"tag":83,"props":229,"children":231},{"style":230},"--shiki-default:#79B8FF",[232],{"type":44,"value":233}," \"name\"",{"type":28,"tag":83,"props":235,"children":236},{"style":96},[237],{"type":44,"value":238},": ",{"type":28,"tag":83,"props":240,"children":241},{"style":107},[242],{"type":44,"value":243},"\"playwright-internal\"",{"type":28,"tag":83,"props":245,"children":246},{"style":96},[247],{"type":44,"value":248},",\n",{"type":28,"tag":83,"props":250,"children":251},{"class":85,"line":161},[252,257,261,266],{"type":28,"tag":83,"props":253,"children":254},{"style":230},[255],{"type":44,"value":256}," \"private\"",{"type":28,"tag":83,"props":258,"children":259},{"style":96},[260],{"type":44,"value":238},{"type":28,"tag":83,"props":262,"children":263},{"style":230},[264],{"type":44,"value":265},"true",{"type":28,"tag":83,"props":267,"children":268},{"style":96},[269],{"type":44,"value":248},{"type":28,"tag":83,"props":271,"children":272},{"class":85,"line":170},[273,278,283,288],{"type":28,"tag":83,"props":274,"children":275},{"style":230},[276],{"type":44,"value":277}," \"workspaces\"",{"type":28,"tag":83,"props":279,"children":280},{"style":96},[281],{"type":44,"value":282},": [",{"type":28,"tag":83,"props":284,"children":285},{"style":107},[286],{"type":44,"value":287},"\"packages/*\"",{"type":28,"tag":83,"props":289,"children":290},{"style":96},[291],{"type":44,"value":292},"]\n",{"type":28,"tag":83,"props":294,"children":295},{"class":85,"line":179},[296],{"type":28,"tag":83,"props":297,"children":298},{"style":96},[299],{"type":44,"value":300},"}\n",{"type":28,"tag":29,"props":302,"children":303},{},[304,306,311,313,319,321,326,328,334,336,341],{"type":44,"value":305},"The ",{"type":28,"tag":63,"props":307,"children":309},{"className":308},[],[310],{"type":44,"value":205},{"type":44,"value":312}," gives us the hint the core functionality is within the ",{"type":28,"tag":63,"props":314,"children":316},{"className":315},[],[317],{"type":44,"value":318},"packages/",{"type":44,"value":320}," directory since the root ",{"type":28,"tag":63,"props":322,"children":324},{"className":323},[],[325],{"type":44,"value":205},{"type":44,"value":327}," file is labelled private, has \"internal\" in its name, and uses the ",{"type":28,"tag":63,"props":329,"children":331},{"className":330},[],[332],{"type":44,"value":333},"\"workspaces\"",{"type":44,"value":335}," key, which tells node this project has multiple packages. Let's go over the other top-level directories real quick before diving into the ",{"type":28,"tag":63,"props":337,"children":339},{"className":338},[],[340],{"type":44,"value":318},{"type":44,"value":342}," folder",{"type":28,"tag":344,"props":345,"children":346},"ul",{},[347,359,379,390,401],{"type":28,"tag":348,"props":349,"children":350},"li",{},[351,357],{"type":28,"tag":63,"props":352,"children":354},{"className":353},[],[355],{"type":44,"value":356},"browser_patches",{"type":44,"value":358}," - This folder contains browser patches improving adding additional controls and features to some of the browser engines used within this project. Interestingly, this give a patch to webkit so it can run within Windows.",{"type":28,"tag":348,"props":360,"children":361},{},[362,368,370,377],{"type":28,"tag":63,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"docs",{"type":44,"value":369}," - The docs folder contains markdown files which compile to the documentation found on ",{"type":28,"tag":52,"props":371,"children":374},{"href":372,"rel":373},"https://playwright.dev/docs/intro",[56],[375],{"type":44,"value":376},"the Playwright docs",{"type":44,"value":378},".",{"type":28,"tag":348,"props":380,"children":381},{},[382,388],{"type":28,"tag":63,"props":383,"children":385},{"className":384},[],[386],{"type":44,"value":387},"examples",{"type":44,"value":389}," - Here are examples of test scripts to refer to, while getting started with using the Playwright project.",{"type":28,"tag":348,"props":391,"children":392},{},[393,399],{"type":28,"tag":63,"props":394,"children":396},{"className":395},[],[397],{"type":44,"value":398},"tests",{"type":44,"value":400}," - Even testing libraries should have automated tests, which are written in Playwright.",{"type":28,"tag":348,"props":402,"children":403},{},[404,410],{"type":28,"tag":63,"props":405,"children":407},{"className":406},[],[408],{"type":44,"value":409},"utils",{"type":44,"value":411}," - The utils directory contains miscellaneous tools used during build time, docker images, functionality for Azure, a types file generator, and more.",{"type":28,"tag":39,"props":413,"children":415},{"id":414},"packages-directory",[416],{"type":44,"value":417},"Packages directory",{"type":28,"tag":29,"props":419,"children":420},{},[421],{"type":44,"value":422},"The packages directory contains over 20 separate packages, making it more difficult to understand. We will split up this list into easy-to-understand partitions.",{"type":28,"tag":424,"props":425,"children":427},"h3",{"id":426},"test-reportinggeneration-packages",[428],{"type":44,"value":429},"Test reporting/generation packages",{"type":28,"tag":29,"props":431,"children":432},{},[433],{"type":44,"value":434},"Playwright contains many different test reporting packages each with their own set of functionalities. Briefly, the list of packages in this category is",{"type":28,"tag":72,"props":436,"children":439},{"className":134,"code":437,"filename":438,"language":137,"meta":7,"style":7},"html-reporter/\nrecorder/\ntrace-viewer/\ntrace/\nweb/\n","playwright/packages",[440],{"type":28,"tag":63,"props":441,"children":442},{"__ignoreMap":7},[443,451,459,467,475],{"type":28,"tag":83,"props":444,"children":445},{"class":85,"line":86},[446],{"type":28,"tag":83,"props":447,"children":448},{},[449],{"type":44,"value":450},"html-reporter/\n",{"type":28,"tag":83,"props":452,"children":453},{"class":85,"line":152},[454],{"type":28,"tag":83,"props":455,"children":456},{},[457],{"type":44,"value":458},"recorder/\n",{"type":28,"tag":83,"props":460,"children":461},{"class":85,"line":161},[462],{"type":28,"tag":83,"props":463,"children":464},{},[465],{"type":44,"value":466},"trace-viewer/\n",{"type":28,"tag":83,"props":468,"children":469},{"class":85,"line":170},[470],{"type":28,"tag":83,"props":471,"children":472},{},[473],{"type":44,"value":474},"trace/\n",{"type":28,"tag":83,"props":476,"children":477},{"class":85,"line":179},[478],{"type":28,"tag":83,"props":479,"children":480},{},[481],{"type":44,"value":482},"web/\n",{"type":28,"tag":29,"props":484,"children":485},{},[486,488,495,497,504,506,512],{"type":44,"value":487},"which contains the code associated with either handling test reports or ",{"type":28,"tag":52,"props":489,"children":492},{"href":490,"rel":491},"https://playwright.dev/docs/codegen-intro",[56],[493],{"type":44,"value":494},"generating",{"type":44,"value":496}," them with the recorder package. In addition, there is the ",{"type":28,"tag":52,"props":498,"children":501},{"href":499,"rel":500},"https://playwright.dev/docs/trace-viewer",[56],[502],{"type":44,"value":503},"trace and trace viewer",{"type":44,"value":505}," which can be recorded during playwright test runs. In addition, the ",{"type":28,"tag":63,"props":507,"children":509},{"className":508},[],[510],{"type":44,"value":511},"web/",{"type":44,"value":513}," package provides utilities shared across the various web-based tools listed here.",{"type":28,"tag":424,"props":515,"children":517},{"id":516},"browser-specialized-packages",[518],{"type":44,"value":519},"Browser specialized packages",{"type":28,"tag":29,"props":521,"children":522},{},[523,525,531,533,540],{"type":44,"value":524},"Each of the packages here are simply exports of the ",{"type":28,"tag":63,"props":526,"children":528},{"className":527},[],[529],{"type":44,"value":530},"playwright-core",{"type":44,"value":532}," package along with an install script for the associated browser only. You can find them on npmjs, for example, ",{"type":28,"tag":52,"props":534,"children":537},{"href":535,"rel":536},"https://www.npmjs.com/package/playwright-chromium",[56],[538],{"type":44,"value":539},"playwright-chromium",{"type":44,"value":541}," is its own package which has playwright specialized for only automating chromium.",{"type":28,"tag":72,"props":543,"children":545},{"className":134,"code":544,"filename":438,"language":137,"meta":7,"style":7},"playwright-chromium/\nplaywright-firefox/\nplaywright-webkit/\n",[546],{"type":28,"tag":63,"props":547,"children":548},{"__ignoreMap":7},[549,557,565],{"type":28,"tag":83,"props":550,"children":551},{"class":85,"line":86},[552],{"type":28,"tag":83,"props":553,"children":554},{},[555],{"type":44,"value":556},"playwright-chromium/\n",{"type":28,"tag":83,"props":558,"children":559},{"class":85,"line":152},[560],{"type":28,"tag":83,"props":561,"children":562},{},[563],{"type":44,"value":564},"playwright-firefox/\n",{"type":28,"tag":83,"props":566,"children":567},{"class":85,"line":161},[568],{"type":28,"tag":83,"props":569,"children":570},{},[571],{"type":44,"value":572},"playwright-webkit/\n",{"type":28,"tag":424,"props":574,"children":576},{"id":575},"browser-installation-packages",[577],{"type":44,"value":578},"Browser installation packages",{"type":28,"tag":29,"props":580,"children":581},{},[582,584,591,593,599],{"type":44,"value":583},"The packages listed here only include install scripts for each of the browsers. For example, ",{"type":28,"tag":52,"props":585,"children":588},{"href":586,"rel":587},"https://www.npmjs.com/package/@playwright/browser-chromium",[56],[589],{"type":44,"value":590},"playwright-browser-chromium",{"type":44,"value":592}," corresponds to the ",{"type":28,"tag":63,"props":594,"children":596},{"className":595},[],[597],{"type":44,"value":598},"@playwright/browser-chromium",{"type":44,"value":600}," package on npmjs.",{"type":28,"tag":72,"props":602,"children":604},{"className":134,"code":603,"filename":438,"language":137,"meta":7,"style":7},"playwright-browser-chromium/\nplaywright-browser-firefox/\nplaywright-browser-webkit/\n",[605],{"type":28,"tag":63,"props":606,"children":607},{"__ignoreMap":7},[608,616,624],{"type":28,"tag":83,"props":609,"children":610},{"class":85,"line":86},[611],{"type":28,"tag":83,"props":612,"children":613},{},[614],{"type":44,"value":615},"playwright-browser-chromium/\n",{"type":28,"tag":83,"props":617,"children":618},{"class":85,"line":152},[619],{"type":28,"tag":83,"props":620,"children":621},{},[622],{"type":44,"value":623},"playwright-browser-firefox/\n",{"type":28,"tag":83,"props":625,"children":626},{"class":85,"line":161},[627],{"type":28,"tag":83,"props":628,"children":629},{},[630],{"type":44,"value":631},"playwright-browser-webkit/\n",{"type":28,"tag":424,"props":633,"children":635},{"id":634},"component-testing-packages",[636],{"type":44,"value":637},"Component testing packages",{"type":28,"tag":29,"props":639,"children":640},{},[641,643,650],{"type":44,"value":642},"These packages are all associated to the ",{"type":28,"tag":52,"props":644,"children":647},{"href":645,"rel":646},"https://playwright.dev/docs/test-components",[56],[648],{"type":44,"value":649},"experimental component testing framework",{"type":44,"value":651}," in playwright. These give functionality to playwright similar to how Jest can render individual components for different libraries.",{"type":28,"tag":72,"props":653,"children":655},{"className":134,"code":654,"filename":438,"language":137,"meta":7,"style":7},"playwright-ct-core/\nplaywright-ct-react/\nplaywright-ct-react17/\nplaywright-ct-solid/\nplaywright-ct-svelte/\nplaywright-ct-vue/\nplaywright-ct-vue2/\n",[656],{"type":28,"tag":63,"props":657,"children":658},{"__ignoreMap":7},[659,667,675,683,691,699,707],{"type":28,"tag":83,"props":660,"children":661},{"class":85,"line":86},[662],{"type":28,"tag":83,"props":663,"children":664},{},[665],{"type":44,"value":666},"playwright-ct-core/\n",{"type":28,"tag":83,"props":668,"children":669},{"class":85,"line":152},[670],{"type":28,"tag":83,"props":671,"children":672},{},[673],{"type":44,"value":674},"playwright-ct-react/\n",{"type":28,"tag":83,"props":676,"children":677},{"class":85,"line":161},[678],{"type":28,"tag":83,"props":679,"children":680},{},[681],{"type":44,"value":682},"playwright-ct-react17/\n",{"type":28,"tag":83,"props":684,"children":685},{"class":85,"line":170},[686],{"type":28,"tag":83,"props":687,"children":688},{},[689],{"type":44,"value":690},"playwright-ct-solid/\n",{"type":28,"tag":83,"props":692,"children":693},{"class":85,"line":179},[694],{"type":28,"tag":83,"props":695,"children":696},{},[697],{"type":44,"value":698},"playwright-ct-svelte/\n",{"type":28,"tag":83,"props":700,"children":701},{"class":85,"line":188},[702],{"type":28,"tag":83,"props":703,"children":704},{},[705],{"type":44,"value":706},"playwright-ct-vue/\n",{"type":28,"tag":83,"props":708,"children":710},{"class":85,"line":709},7,[711],{"type":28,"tag":83,"props":712,"children":713},{},[714],{"type":44,"value":715},"playwright-ct-vue2/\n",{"type":28,"tag":424,"props":717,"children":719},{"id":718},"core-functionality-packages",[720],{"type":44,"value":721},"Core functionality packages",{"type":28,"tag":29,"props":723,"children":724},{},[725],{"type":44,"value":726},"Finally, we reach the core packages provided in playwright, which contain all of the main functionality of the playwright project.",{"type":28,"tag":72,"props":728,"children":730},{"className":134,"code":729,"filename":438,"language":137,"meta":7,"style":7},"playwright-core/\nplaywright-test/\nplaywright/\nprotocol/\n",[731],{"type":28,"tag":63,"props":732,"children":733},{"__ignoreMap":7},[734,742,750,758],{"type":28,"tag":83,"props":735,"children":736},{"class":85,"line":86},[737],{"type":28,"tag":83,"props":738,"children":739},{},[740],{"type":44,"value":741},"playwright-core/\n",{"type":28,"tag":83,"props":743,"children":744},{"class":85,"line":152},[745],{"type":28,"tag":83,"props":746,"children":747},{},[748],{"type":44,"value":749},"playwright-test/\n",{"type":28,"tag":83,"props":751,"children":752},{"class":85,"line":161},[753],{"type":28,"tag":83,"props":754,"children":755},{},[756],{"type":44,"value":757},"playwright/\n",{"type":28,"tag":83,"props":759,"children":760},{"class":85,"line":170},[761],{"type":28,"tag":83,"props":762,"children":763},{},[764],{"type":44,"value":765},"protocol/\n",{"type":28,"tag":29,"props":767,"children":768},{},[769,771,777,779,784,786,791,793,799,801,807,809,815,817,822],{"type":44,"value":770},"Note the ",{"type":28,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":44,"value":776},"playwright-test",{"type":44,"value":778}," folder is simply a wrapper for binding ",{"type":28,"tag":63,"props":780,"children":782},{"className":781},[],[783],{"type":44,"value":530},{"type":44,"value":785}," and ",{"type":28,"tag":63,"props":787,"children":789},{"className":788},[],[790],{"type":44,"value":5},{"type":44,"value":792}," together in the ",{"type":28,"tag":63,"props":794,"children":796},{"className":795},[],[797],{"type":44,"value":798},"@playwright/test",{"type":44,"value":800}," package installable through npm. If you look in the ",{"type":28,"tag":63,"props":802,"children":804},{"className":803},[],[805],{"type":44,"value":806},"index.js",{"type":44,"value":808}," file, all you'll see is an export of ",{"type":28,"tag":63,"props":810,"children":812},{"className":811},[],[813],{"type":44,"value":814},"playwright/test",{"type":44,"value":816},", which lives in the ",{"type":28,"tag":63,"props":818,"children":820},{"className":819},[],[821],{"type":44,"value":5},{"type":44,"value":823}," package.",{"type":28,"tag":29,"props":825,"children":826},{},[827,829,835,837,842,844,850],{"type":44,"value":828},"Another package to look at briefly is the ",{"type":28,"tag":63,"props":830,"children":832},{"className":831},[],[833],{"type":44,"value":834},"protocol",{"type":44,"value":836}," package which has automatically generated code through some of the build scripts in the ",{"type":28,"tag":63,"props":838,"children":840},{"className":839},[],[841],{"type":44,"value":409},{"type":44,"value":843}," directory of the root directory of the playwright project. This simply contains a YAML file, ",{"type":28,"tag":63,"props":845,"children":847},{"className":846},[],[848],{"type":44,"value":849},"protocol.yml",{"type":44,"value":851},", which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.",{"type":28,"tag":29,"props":853,"children":854},{},[855,857,862,863,869,871,876,878,884],{"type":44,"value":856},"Now, the two main packages of the entire playwright library are the ",{"type":28,"tag":63,"props":858,"children":860},{"className":859},[],[861],{"type":44,"value":5},{"type":44,"value":785},{"type":28,"tag":63,"props":864,"children":866},{"className":865},[],[867],{"type":44,"value":868},"playwrite-core",{"type":44,"value":870}," packages. The first of which is a wrapper around ",{"type":28,"tag":63,"props":872,"children":874},{"className":873},[],[875],{"type":44,"value":530},{"type":44,"value":877}," and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the ",{"type":28,"tag":63,"props":879,"children":881},{"className":880},[],[882],{"type":44,"value":883},"playwright.config.ts",{"type":44,"value":885}," file, or any of the associated test running code, such as",{"type":28,"tag":72,"props":887,"children":890},{"className":74,"code":888,"filename":889,"language":77,"meta":7,"style":7},"import { test } from \"@playwright/test\";\n","my-test.spec.ts",[891],{"type":28,"tag":63,"props":892,"children":893},{"__ignoreMap":7},[894],{"type":28,"tag":83,"props":895,"children":896},{"class":85,"line":86},[897,901,906,910,914],{"type":28,"tag":83,"props":898,"children":899},{"style":90},[900],{"type":44,"value":93},{"type":28,"tag":83,"props":902,"children":903},{"style":96},[904],{"type":44,"value":905}," { test } ",{"type":28,"tag":83,"props":907,"children":908},{"style":90},[909],{"type":44,"value":104},{"type":28,"tag":83,"props":911,"children":912},{"style":107},[913],{"type":44,"value":110},{"type":28,"tag":83,"props":915,"children":916},{"style":96},[917],{"type":44,"value":115},{"type":28,"tag":29,"props":919,"children":920},{},[921,923,928],{"type":44,"value":922},"then you are likely importing code from the ",{"type":28,"tag":63,"props":924,"children":926},{"className":925},[],[927],{"type":44,"value":5},{"type":44,"value":823},{"type":28,"tag":29,"props":930,"children":931},{},[932,934,939,941,947,949,955,957,962,964,970,972,979,981,987,989,994],{"type":44,"value":933},"The other main package is ",{"type":28,"tag":63,"props":935,"children":937},{"className":936},[],[938],{"type":44,"value":530},{"type":44,"value":940}," which contains all of the browser automation functionality. This functionality is split up into two main components, the ",{"type":28,"tag":63,"props":942,"children":944},{"className":943},[],[945],{"type":44,"value":946},"client",{"type":44,"value":948}," library and the ",{"type":28,"tag":63,"props":950,"children":952},{"className":951},[],[953],{"type":44,"value":954},"server",{"type":44,"value":956}," library. The ",{"type":28,"tag":63,"props":958,"children":960},{"className":959},[],[961],{"type":44,"value":954},{"type":44,"value":963}," library, found in ",{"type":28,"tag":63,"props":965,"children":967},{"className":966},[],[968],{"type":44,"value":969},"packages/playwright-core/src/server",{"type":44,"value":971},", contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the ",{"type":28,"tag":52,"props":973,"children":976},{"href":974,"rel":975},"https://chromedevtools.github.io/devtools-protocol/",[56],[977],{"type":44,"value":978},"Chrome Devtools Protocol",{"type":44,"value":980}," (CDP), or something similar to it, which tells the browser to perform actions like \"click the login button\", \"input 'Hello' into the text form\", or \"navigate to '",{"type":28,"tag":52,"props":982,"children":985},{"href":983,"rel":984},"https://news.ycombinator.com",[56],[986],{"type":44,"value":983},{"type":44,"value":988},"'\". The ",{"type":28,"tag":63,"props":990,"children":992},{"className":991},[],[993],{"type":44,"value":954},{"type":44,"value":995}," library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.",{"type":28,"tag":29,"props":997,"children":998},{},[999,1001,1006],{"type":44,"value":1000},"On the other hand, the ",{"type":28,"tag":63,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":44,"value":946},{"type":44,"value":1007}," library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like",{"type":28,"tag":72,"props":1009,"children":1012},{"className":74,"code":1010,"filename":1011,"language":77,"meta":7,"style":7},"import { chromium } from \"@playwright/test\";\n\n(async function () {\n const browser = await chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n})();\n","my-automation-script.ts",[1013],{"type":28,"tag":63,"props":1014,"children":1015},{"__ignoreMap":7},[1016,1040,1049,1072,1121,1156,1188],{"type":28,"tag":83,"props":1017,"children":1018},{"class":85,"line":86},[1019,1023,1028,1032,1036],{"type":28,"tag":83,"props":1020,"children":1021},{"style":90},[1022],{"type":44,"value":93},{"type":28,"tag":83,"props":1024,"children":1025},{"style":96},[1026],{"type":44,"value":1027}," { chromium } ",{"type":28,"tag":83,"props":1029,"children":1030},{"style":90},[1031],{"type":44,"value":104},{"type":28,"tag":83,"props":1033,"children":1034},{"style":107},[1035],{"type":44,"value":110},{"type":28,"tag":83,"props":1037,"children":1038},{"style":96},[1039],{"type":44,"value":115},{"type":28,"tag":83,"props":1041,"children":1042},{"class":85,"line":152},[1043],{"type":28,"tag":83,"props":1044,"children":1046},{"emptyLinePlaceholder":1045},true,[1047],{"type":44,"value":1048},"\n",{"type":28,"tag":83,"props":1050,"children":1051},{"class":85,"line":161},[1052,1057,1062,1067],{"type":28,"tag":83,"props":1053,"children":1054},{"style":96},[1055],{"type":44,"value":1056},"(",{"type":28,"tag":83,"props":1058,"children":1059},{"style":90},[1060],{"type":44,"value":1061},"async",{"type":28,"tag":83,"props":1063,"children":1064},{"style":90},[1065],{"type":44,"value":1066}," function",{"type":28,"tag":83,"props":1068,"children":1069},{"style":96},[1070],{"type":44,"value":1071}," () {\n",{"type":28,"tag":83,"props":1073,"children":1074},{"class":85,"line":170},[1075,1080,1085,1090,1095,1100,1106,1111,1116],{"type":28,"tag":83,"props":1076,"children":1077},{"style":90},[1078],{"type":44,"value":1079}," const",{"type":28,"tag":83,"props":1081,"children":1082},{"style":230},[1083],{"type":44,"value":1084}," browser",{"type":28,"tag":83,"props":1086,"children":1087},{"style":90},[1088],{"type":44,"value":1089}," =",{"type":28,"tag":83,"props":1091,"children":1092},{"style":90},[1093],{"type":44,"value":1094}," await",{"type":28,"tag":83,"props":1096,"children":1097},{"style":96},[1098],{"type":44,"value":1099}," chromium.",{"type":28,"tag":83,"props":1101,"children":1103},{"style":1102},"--shiki-default:#B392F0",[1104],{"type":44,"value":1105},"launch",{"type":28,"tag":83,"props":1107,"children":1108},{"style":96},[1109],{"type":44,"value":1110},"({ headless: ",{"type":28,"tag":83,"props":1112,"children":1113},{"style":230},[1114],{"type":44,"value":1115},"false",{"type":28,"tag":83,"props":1117,"children":1118},{"style":96},[1119],{"type":44,"value":1120}," });\n",{"type":28,"tag":83,"props":1122,"children":1123},{"class":85,"line":179},[1124,1128,1133,1137,1141,1146,1151],{"type":28,"tag":83,"props":1125,"children":1126},{"style":90},[1127],{"type":44,"value":1079},{"type":28,"tag":83,"props":1129,"children":1130},{"style":230},[1131],{"type":44,"value":1132}," page",{"type":28,"tag":83,"props":1134,"children":1135},{"style":90},[1136],{"type":44,"value":1089},{"type":28,"tag":83,"props":1138,"children":1139},{"style":90},[1140],{"type":44,"value":1094},{"type":28,"tag":83,"props":1142,"children":1143},{"style":96},[1144],{"type":44,"value":1145}," browser.",{"type":28,"tag":83,"props":1147,"children":1148},{"style":1102},[1149],{"type":44,"value":1150},"newPage",{"type":28,"tag":83,"props":1152,"children":1153},{"style":96},[1154],{"type":44,"value":1155},"();\n",{"type":28,"tag":83,"props":1157,"children":1158},{"class":85,"line":188},[1159,1164,1169,1174,1178,1183],{"type":28,"tag":83,"props":1160,"children":1161},{"style":90},[1162],{"type":44,"value":1163}," await",{"type":28,"tag":83,"props":1165,"children":1166},{"style":96},[1167],{"type":44,"value":1168}," page.",{"type":28,"tag":83,"props":1170,"children":1171},{"style":1102},[1172],{"type":44,"value":1173},"goto",{"type":28,"tag":83,"props":1175,"children":1176},{"style":96},[1177],{"type":44,"value":1056},{"type":28,"tag":83,"props":1179,"children":1180},{"style":107},[1181],{"type":44,"value":1182},"\"https://playwright.dev\"",{"type":28,"tag":83,"props":1184,"children":1185},{"style":96},[1186],{"type":44,"value":1187},");\n",{"type":28,"tag":83,"props":1189,"children":1190},{"class":85,"line":709},[1191],{"type":28,"tag":83,"props":1192,"children":1193},{"style":96},[1194],{"type":44,"value":1195},"})();\n",{"type":28,"tag":29,"props":1197,"children":1198},{},[1199,1201,1207,1209,1215,1217,1223,1224,1230,1232,1237,1239,1244,1246,1251],{"type":44,"value":1200},"really you are importing ",{"type":28,"tag":63,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":44,"value":1206},"chromium",{"type":44,"value":1208}," from an instance of the class in ",{"type":28,"tag":63,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":44,"value":1214},"playwright-core/client/playwright",{"type":44,"value":1216},". Then, calling ",{"type":28,"tag":63,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":44,"value":1222},"browser.newPage",{"type":44,"value":785},{"type":28,"tag":63,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":44,"value":1229},"page.goto",{"type":44,"value":1231}," is making requests to interfaces in the ",{"type":28,"tag":63,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":44,"value":954},{"type":44,"value":1238}," library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the ",{"type":28,"tag":63,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":44,"value":954},{"type":44,"value":1245}," library in the ",{"type":28,"tag":63,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":44,"value":530},{"type":44,"value":1252}," package since it provides a comprehensive and battle tested API for this kind of functionality.",{"type":28,"tag":29,"props":1254,"children":1255},{},[1256,1258,1265,1267,1274,1275,1282,1284,1290,1292,1297,1299,1304],{"type":44,"value":1257},"This splitting of responsibility design pattern works well because it allows for ",{"type":28,"tag":52,"props":1259,"children":1262},{"href":1260,"rel":1261},"https://github.com/microsoft/playwright-python",[56],[1263],{"type":44,"value":1264},"supporting",{"type":44,"value":1266}," ",{"type":28,"tag":52,"props":1268,"children":1271},{"href":1269,"rel":1270},"https://github.com/microsoft/playwright-java/",[56],[1272],{"type":44,"value":1273},"multiple",{"type":44,"value":1266},{"type":28,"tag":52,"props":1276,"children":1279},{"href":1277,"rel":1278},"https://github.com/microsoft/playwright-dotnet",[56],[1280],{"type":44,"value":1281},"languages",{"type":44,"value":1283}," which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ",{"type":28,"tag":63,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":44,"value":1289},"ChannelOwner",{"type":44,"value":1291},") as you would in the the ",{"type":28,"tag":63,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":44,"value":946},{"type":44,"value":1298}," library found in ",{"type":28,"tag":63,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":44,"value":530},{"type":44,"value":378},{"type":28,"tag":39,"props":1306,"children":1308},{"id":1307},"looking-beyond",[1309],{"type":44,"value":1310},"Looking beyond",{"type":28,"tag":29,"props":1312,"children":1313},{},[1314],{"type":44,"value":1315},"Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.",{"type":28,"tag":29,"props":1317,"children":1318},{},[1319],{"type":44,"value":1320},"In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.",{"type":28,"tag":1322,"props":1323,"children":1324},"style",{},[1325],{"type":44,"value":1326},"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);}",{"title":7,"searchDepth":152,"depth":152,"links":1328},[1329,1330,1331,1338],{"id":41,"depth":152,"text":45},{"id":123,"depth":152,"text":126},{"id":414,"depth":152,"text":417,"children":1332},[1333,1334,1335,1336,1337],{"id":426,"depth":161,"text":429},{"id":516,"depth":161,"text":519},{"id":575,"depth":161,"text":578},{"id":634,"depth":161,"text":637},{"id":718,"depth":161,"text":721},{"id":1307,"depth":152,"text":1310},"markdown","content:playwright:architecture.md","content","playwright/architecture.md","md",1717143082873] \ No newline at end of file diff --git a/playwright/architecture/index.html b/playwright/architecture/index.html index 2d6907d..b62a519 100644 --- a/playwright/architecture/index.html +++ b/playwright/architecture/index.html @@ -21,50 +21,51 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Diagram of Playwright's architecture

Intro

When you load up the repository for the Playwright library, you may be overwhelmed by the numerous packages living both inside the packages folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import

example-script.ts
import { test, chromium } from "@playwright/test";
+
+

Diagram of Playwright's architecture

Intro

When you load up the repository for the Playwright library, you may be overwhelmed by the numerous packages living both inside the packages folder, and within the root folder. In addition, if you try and trace the code used by a Playwright test, you will likely be befuddled by the many folders in the package which may or may not contain the code you are looking for, such as finding the definitions of the code in the import

example-script.ts
import { test, chromium } from "@playwright/test";
 

making it much more difficult to understand the core architecture of the playwright project. In this post we aim to remedy this problem by giving a high-level overview of the project and its architecture. This includes a description of what features and facets are contained within the various directories of the project, helping guide you to further your understanding of the project.

Root directory

In the root directory we find the following folders

playwright/
browser_patches/
 docs/
 examples/
 packages/
 tests/
 utils/
-

along with the package.json which includes the following keys

package.json
{
+

along with the package.json which includes the following keys

package.json
{
   "name": "playwright-internal",
   "private": true,
   "workspaces": ["packages/*"]
@@ -91,13 +92,13 @@
 playwright-test/
 playwright/
 protocol/
-

Note the playwright-test folder is simply a wrapper for binding playwright-core and playwright together in the @playwright/test package installable through npm. If you look in the index.js file, all you'll see is an export of playwright/test, which lives in the playwright package.

Another package to look at briefly is the protocol package which has automatically generated code through some of the build scripts in the utils directory of the root directory of the playwright project. This simply contains a YAML file, protocol.yml, which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.

Now, the two main packages of the entire playwright library are the playwright and playwrite-core packages. The first of which is a wrapper around playwright-core and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the playwright.config.ts file, or any of the associated test running code, such as

my-test.spec.ts
import { test } from "@playwright/test";
-

then you are likely importing code from the playwright package.

The other main package is playwright-core which contains all of the browser automation functionality. This functionality is split up into two main components, the client library and the server library. The server library, found in packages/playwright-core/src/server, contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the Chrome Devtools Protocol (CDP), or something similar to it, which tells the browser to perform actions like "click the login button", "input 'Hello' into the text form", or "navigate to 'https://news.ycombinator.com'". The server library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.

On the other hand, the client library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like

my-automation-script.ts
import { chromium } from "@playwright/test";
+

Note the playwright-test folder is simply a wrapper for binding playwright-core and playwright together in the @playwright/test package installable through npm. If you look in the index.js file, all you'll see is an export of playwright/test, which lives in the playwright package.

Another package to look at briefly is the protocol package which has automatically generated code through some of the build scripts in the utils directory of the root directory of the playwright project. This simply contains a YAML file, protocol.yml, which lists out all the interfaces used by playwright's protocol. If you ever wanted to build a driver for playwright in another language, this is one of the core files to consult while building this library.

Now, the two main packages of the entire playwright library are the playwright and playwrite-core packages. The first of which is a wrapper around playwright-core and is responsible for managing all the testing logic. This includes starting up test workers, running test executions, reporting test results, managing retries, and test assertions. A good heuristic for the code contained in this package is any kind of configuration logic you would find in the playwright.config.ts file, or any of the associated test running code, such as

my-test.spec.ts
import { test } from "@playwright/test";
+

then you are likely importing code from the playwright package.

The other main package is playwright-core which contains all of the browser automation functionality. This functionality is split up into two main components, the client library and the server library. The server library, found in packages/playwright-core/src/server, contains all the logic responsible for the browser automation actions. This means it will dispatch actions over the Chrome Devtools Protocol (CDP), or something similar to it, which tells the browser to perform actions like "click the login button", "input 'Hello' into the text form", or "navigate to 'https://news.ycombinator.com'". The server library contains implementations for each of the supported browsers and provides a unified API provided by a websocket server for other processes to access this automation functionality.

On the other hand, the client library contains all the user facing API's you would access while writing any browser automation scripts. So if you have a script like

my-automation-script.ts
import { chromium } from "@playwright/test";
 
 (async function () {
   const browser = await chromium.launch({ headless: false });
   const page = await browser.newPage();
   await page.goto("https://playwright.dev");
 })();
-

really you are importing chromium from an instance of the class in playwright-core/client/playwright. Then, calling browser.newPage and page.goto is making requests to interfaces in the server library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the server library in the playwright-core package since it provides a comprehensive and battle tested API for this kind of functionality.

This splitting of responsibility design pattern works well because it allows for supporting multiple languages which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ChannelOwner) as you would in the the client library found in playwright-core.

Looking beyond

Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.

In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.

- \ No newline at end of file +

really you are importing chromium from an instance of the class in playwright-core/client/playwright. Then, calling browser.newPage and page.goto is making requests to interfaces in the server library, which communicates with the browsers over CDP or something similar. This means if you ever wanted to write your own browser automation tool which is browser-independent, a useful starting point would be to use the server library in the playwright-core package since it provides a comprehensive and battle tested API for this kind of functionality.

This splitting of responsibility design pattern works well because it allows for supporting multiple languages which can use Playwright's browser automation API. In fact, if you look at other implementations of the Playwright library, you will find the same design patterns (such as ChannelOwner) as you would in the the client library found in playwright-core.

Looking beyond

Hopefully you have a clearer picture about how the Playwright project is structured and have some intuition about where you can look if you ever want to extend its functionality or use it as a base library for some other browser-automation project.

In later posts we will deep dive into more of the specific design patterns used in Playwright's codebase which allow it to work so well, enriching your understanding of how the library works.

+ \ No newline at end of file diff --git a/playwright/how-playwright-initializes/_payload.json b/playwright/how-playwright-initializes/_payload.json index edf962f..c494255 100644 --- a/playwright/how-playwright-initializes/_payload.json +++ b/playwright/how-playwright-initializes/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":7009},["Reactive",2],{"blog-post-playwright/how-playwright-initializes":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"image":17,"shortDescription":18,"created":19,"link":4,"body":25,"_type":7004,"_id":7005,"_source":7006,"_file":7007,"_extension":7008},"/playwright/how-playwright-initializes","playwright",false,"","How importing from Playwright works","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"How Playwright Initializes","/playwright/how-playwright-initializes/","img","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":20,"number":21,"month":22,"day":23,"year":24},"March 13, 2024",1710309600000,"Mar",13,2024,{"type":26,"children":27,"toc":6988},"root",[28,38,46,51,258,263,268,288,359,379,430,530,560,566,697,702,708,727,1718,1752,1784,1804,1865,1870,1931,1943,2131,2166,2172,2221,2274,2469,2474,2574,2631,2637,2669,3353,3372,3378,3406,3471,3533,3545,4208,4298,4305,4317,4545,4624,4630,4649,4763,4804,4810,4851,5053,5101,5143,5163,5449,5504,5537,5571,5762,5781,6222,6306,6312,6332,6450,6485,6541,6554,6729,6741,6747,6752,6964,6982],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":29,"tag":17,"props":34,"children":37},{"alt":35,"src":36},"Diagram of playwright-core initialization process","/img/playwright/playwright-core_initialization_diagram.jpg",[],{"type":29,"tag":39,"props":40,"children":42},"h2",{"id":41},"peering-into-playwrights-import-process",[43],{"type":44,"value":45},"text","Peering into Playwright's import process",{"type":29,"tag":30,"props":47,"children":48},{},[49],{"type":44,"value":50},"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet",{"type":29,"tag":52,"props":53,"children":57},"pre",{"className":54,"code":55,"language":56,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","ts",[58],{"type":29,"tag":59,"props":60,"children":61},"code",{"__ignoreMap":7},[62,91,101,136,176,211,249],{"type":29,"tag":63,"props":64,"children":67},"span",{"class":65,"line":66},"line",1,[68,74,80,85],{"type":29,"tag":63,"props":69,"children":71},{"style":70},"--shiki-default:#F97583",[72],{"type":44,"value":73},"import",{"type":29,"tag":63,"props":75,"children":77},{"style":76},"--shiki-default:#E1E4E8",[78],{"type":44,"value":79}," { chromium } ",{"type":29,"tag":63,"props":81,"children":82},{"style":70},[83],{"type":44,"value":84},"from",{"type":29,"tag":63,"props":86,"children":88},{"style":87},"--shiki-default:#9ECBFF",[89],{"type":44,"value":90}," '@playwright/test'\n",{"type":29,"tag":63,"props":92,"children":94},{"class":65,"line":93},2,[95],{"type":29,"tag":63,"props":96,"children":98},{"emptyLinePlaceholder":97},true,[99],{"type":44,"value":100},"\n",{"type":29,"tag":63,"props":102,"children":104},{"class":65,"line":103},3,[105,110,115,121,126,131],{"type":29,"tag":63,"props":106,"children":107},{"style":70},[108],{"type":44,"value":109},"async",{"type":29,"tag":63,"props":111,"children":112},{"style":70},[113],{"type":44,"value":114}," function",{"type":29,"tag":63,"props":116,"children":118},{"style":117},"--shiki-default:#B392F0",[119],{"type":44,"value":120}," main",{"type":29,"tag":63,"props":122,"children":123},{"style":76},[124],{"type":44,"value":125}," () ",{"type":29,"tag":63,"props":127,"children":128},{"style":70},[129],{"type":44,"value":130},"=>",{"type":29,"tag":63,"props":132,"children":133},{"style":76},[134],{"type":44,"value":135}," {\n",{"type":29,"tag":63,"props":137,"children":139},{"class":65,"line":138},4,[140,145,151,156,161,166,171],{"type":29,"tag":63,"props":141,"children":142},{"style":117},[143],{"type":44,"value":144}," const",{"type":29,"tag":63,"props":146,"children":148},{"style":147},"--shiki-default:#FFAB70",[149],{"type":44,"value":150}," browser",{"type":29,"tag":63,"props":152,"children":153},{"style":70},[154],{"type":44,"value":155}," =",{"type":29,"tag":63,"props":157,"children":158},{"style":70},[159],{"type":44,"value":160}," await",{"type":29,"tag":63,"props":162,"children":163},{"style":76},[164],{"type":44,"value":165}," chromium.",{"type":29,"tag":63,"props":167,"children":168},{"style":117},[169],{"type":44,"value":170},"launch",{"type":29,"tag":63,"props":172,"children":173},{"style":76},[174],{"type":44,"value":175},"()\n",{"type":29,"tag":63,"props":177,"children":179},{"class":65,"line":178},5,[180,184,189,193,197,202,207],{"type":29,"tag":63,"props":181,"children":182},{"style":117},[183],{"type":44,"value":144},{"type":29,"tag":63,"props":185,"children":186},{"style":147},[187],{"type":44,"value":188}," page",{"type":29,"tag":63,"props":190,"children":191},{"style":70},[192],{"type":44,"value":155},{"type":29,"tag":63,"props":194,"children":195},{"style":70},[196],{"type":44,"value":160},{"type":29,"tag":63,"props":198,"children":199},{"style":76},[200],{"type":44,"value":201}," browser.",{"type":29,"tag":63,"props":203,"children":204},{"style":117},[205],{"type":44,"value":206},"newPage",{"type":29,"tag":63,"props":208,"children":209},{"style":76},[210],{"type":44,"value":175},{"type":29,"tag":63,"props":212,"children":214},{"class":65,"line":213},6,[215,220,224,229,234,239,244],{"type":29,"tag":63,"props":216,"children":217},{"style":117},[218],{"type":44,"value":219}," await",{"type":29,"tag":63,"props":221,"children":222},{"style":117},[223],{"type":44,"value":188},{"type":29,"tag":63,"props":225,"children":226},{"style":76},[227],{"type":44,"value":228},".",{"type":29,"tag":63,"props":230,"children":231},{"style":117},[232],{"type":44,"value":233},"goto",{"type":29,"tag":63,"props":235,"children":236},{"style":76},[237],{"type":44,"value":238},"(",{"type":29,"tag":63,"props":240,"children":241},{"style":87},[242],{"type":44,"value":243},"\"https://qacomet.com\"",{"type":29,"tag":63,"props":245,"children":246},{"style":76},[247],{"type":44,"value":248},")\n",{"type":29,"tag":63,"props":250,"children":252},{"class":65,"line":251},7,[253],{"type":29,"tag":63,"props":254,"children":255},{"style":76},[256],{"type":44,"value":257},"}\n",{"type":29,"tag":30,"props":259,"children":260},{},[261],{"type":44,"value":262},"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.",{"type":29,"tag":30,"props":264,"children":265},{},[266],{"type":44,"value":267},"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.",{"type":29,"tag":269,"props":270,"children":272},"h3",{"id":271},"merging-playwright-and-playwright-core",[273,275,280,282],{"type":44,"value":274},"Merging ",{"type":29,"tag":59,"props":276,"children":278},{"className":277},[],[279],{"type":44,"value":5},{"type":44,"value":281}," and ",{"type":29,"tag":59,"props":283,"children":285},{"className":284},[],[286],{"type":44,"value":287},"playwright-core",{"type":29,"tag":30,"props":289,"children":290},{},[291,293,299,301,307,308,314,316,322,324,329,331,337,339,344,346,351,353,358],{"type":44,"value":292},"Internally, when you import from ",{"type":29,"tag":59,"props":294,"children":296},{"className":295},[],[297],{"type":44,"value":298},"@playwright/test",{"type":44,"value":300},", there is an underlying call to import from two merged packages, ",{"type":29,"tag":59,"props":302,"children":304},{"className":303},[],[305],{"type":44,"value":306},"packages/playwright-core",{"type":44,"value":281},{"type":29,"tag":59,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"packages/playwright",{"type":44,"value":315},". This merge happens in ",{"type":29,"tag":59,"props":317,"children":319},{"className":318},[],[320],{"type":44,"value":321},"packages/playwright/test",{"type":44,"value":323},", since ",{"type":29,"tag":59,"props":325,"children":327},{"className":326},[],[328],{"type":44,"value":298},{"type":44,"value":330}," is just an outward facinging export of ",{"type":29,"tag":59,"props":332,"children":334},{"className":333},[],[335],{"type":44,"value":336},"require('playwright/test')",{"type":44,"value":338},", an alias for ",{"type":29,"tag":59,"props":340,"children":342},{"className":341},[],[343],{"type":44,"value":321},{"type":44,"value":345},". This is where the test execution API's from ",{"type":29,"tag":59,"props":347,"children":349},{"className":348},[],[350],{"type":44,"value":313},{"type":44,"value":352}," are combined with the browser automation API's from ",{"type":29,"tag":59,"props":354,"children":356},{"className":355},[],[357],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":30,"props":360,"children":361},{},[362,364,369,371,377],{"type":44,"value":363},"We will focus on the import from ",{"type":29,"tag":59,"props":365,"children":367},{"className":366},[],[368],{"type":44,"value":287},{"type":44,"value":370},", since it provides the core browser automation and is the code every other client library wraps. Looking at its ",{"type":29,"tag":59,"props":372,"children":374},{"className":373},[],[375],{"type":44,"value":376},"index.js",{"type":44,"value":378}," file",{"type":29,"tag":52,"props":380,"children":385},{"className":381,"code":382,"filename":383,"language":384,"meta":7,"style":7},"language-js shiki shiki-themes github-dark","module.exports = require(\"./lib/inprocess\");\n","packages/playwright-core/index.js","js",[386],{"type":29,"tag":59,"props":387,"children":388},{"__ignoreMap":7},[389],{"type":29,"tag":63,"props":390,"children":391},{"class":65,"line":66},[392,398,402,407,411,416,420,425],{"type":29,"tag":63,"props":393,"children":395},{"style":394},"--shiki-default:#79B8FF",[396],{"type":44,"value":397},"module",{"type":29,"tag":63,"props":399,"children":400},{"style":76},[401],{"type":44,"value":228},{"type":29,"tag":63,"props":403,"children":404},{"style":394},[405],{"type":44,"value":406},"exports",{"type":29,"tag":63,"props":408,"children":409},{"style":70},[410],{"type":44,"value":155},{"type":29,"tag":63,"props":412,"children":413},{"style":117},[414],{"type":44,"value":415}," require",{"type":29,"tag":63,"props":417,"children":418},{"style":76},[419],{"type":44,"value":238},{"type":29,"tag":63,"props":421,"children":422},{"style":87},[423],{"type":44,"value":424},"\"./lib/inprocess\"",{"type":29,"tag":63,"props":426,"children":427},{"style":76},[428],{"type":44,"value":429},");\n",{"type":29,"tag":30,"props":431,"children":432},{},[433,435,441,443,449,451,457,459,465,467,473,475,481,483,489,491,497,499,505,507,512,514,520,522,528],{"type":44,"value":434},"gives an export from its ",{"type":29,"tag":59,"props":436,"children":438},{"className":437},[],[439],{"type":44,"value":440},"lib/inprocess.ts",{"type":44,"value":442}," file (note the ",{"type":29,"tag":59,"props":444,"children":446},{"className":445},[],[447],{"type":44,"value":448},"src",{"type":44,"value":450}," directory is compiled to the ",{"type":29,"tag":59,"props":452,"children":454},{"className":453},[],[455],{"type":44,"value":456},"lib",{"type":44,"value":458}," directory after playwright runs its build script, and is what's found in ",{"type":29,"tag":59,"props":460,"children":462},{"className":461},[],[463],{"type":44,"value":464},"node_modules/playwright-core",{"type":44,"value":466},", hence the require imports from ",{"type":29,"tag":59,"props":468,"children":470},{"className":469},[],[471],{"type":44,"value":472},"./lib/",{"type":44,"value":474}," and not ",{"type":29,"tag":59,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":480},"./src/",{"type":44,"value":482},"). The ",{"type":29,"tag":59,"props":484,"children":486},{"className":485},[],[487],{"type":44,"value":488},"inprocess.ts",{"type":44,"value":490}," file just imports from the adjacent ",{"type":29,"tag":59,"props":492,"children":494},{"className":493},[],[495],{"type":44,"value":496},"inProcessFactory.ts",{"type":44,"value":498}," and executes the function from there, called ",{"type":29,"tag":59,"props":500,"children":502},{"className":501},[],[503],{"type":44,"value":504},"createInProcessPlaywright",{"type":44,"value":506},". We include the source below in its own section but note ",{"type":29,"tag":59,"props":508,"children":510},{"className":509},[],[511],{"type":44,"value":504},{"type":44,"value":513}," dynamically intiailizes the interface between the client library, defined in ",{"type":29,"tag":59,"props":515,"children":517},{"className":516},[],[518],{"type":44,"value":519},"src/client",{"type":44,"value":521},", and the server library, defined in ",{"type":29,"tag":59,"props":523,"children":525},{"className":524},[],[526],{"type":44,"value":527},"src/server",{"type":44,"value":529},". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.",{"type":29,"tag":30,"props":531,"children":532},{},[533,535,544,546,551,553,558],{"type":44,"value":534},"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the ",{"type":29,"tag":536,"props":537,"children":541},"a",{"href":538,"rel":539},"https://github.com/microsoft/playwright-python",[540],"nofollow",[542],{"type":44,"value":543},"playwright-python",{"type":44,"value":545}," source code, you will find the same design patterns and classes defined in ",{"type":29,"tag":59,"props":547,"children":549},{"className":548},[],[550],{"type":44,"value":287},{"type":44,"value":552},"'s ",{"type":29,"tag":59,"props":554,"children":556},{"className":555},[],[557],{"type":44,"value":519},{"type":44,"value":559}," library.",{"type":29,"tag":269,"props":561,"children":563},{"id":562},"rapid-overview-of-the-client-and-server-libraries",[564],{"type":44,"value":565},"Rapid overview of the client and server libraries",{"type":29,"tag":30,"props":567,"children":568},{},[569,571,576,578,583,584,589,591,597,599,605,607,612,614,620,622,628,630,635,637,643,645,651,653,658,659,665,667,672,674,680,682,688,690,695],{"type":44,"value":570},"In ",{"type":29,"tag":59,"props":572,"children":574},{"className":573},[],[575],{"type":44,"value":287},{"type":44,"value":577}," the main functionality can be found in the ",{"type":29,"tag":59,"props":579,"children":581},{"className":580},[],[582],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":585,"children":587},{"className":586},[],[588],{"type":44,"value":527},{"type":44,"value":590}," folders. The ",{"type":29,"tag":59,"props":592,"children":594},{"className":593},[],[595],{"type":44,"value":596},"client",{"type":44,"value":598}," folder contains classes, many of which are subclasses of the ",{"type":29,"tag":59,"props":600,"children":602},{"className":601},[],[603],{"type":44,"value":604},"ChannelOwner",{"type":44,"value":606}," class. This ",{"type":29,"tag":59,"props":608,"children":610},{"className":609},[],[611],{"type":44,"value":604},{"type":44,"value":613}," class is a client-side representation of a corresponding server-side ",{"type":29,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":44,"value":619},"Dispatcher",{"type":44,"value":621}," class in the ",{"type":29,"tag":59,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":627},"src/server/dispatchers",{"type":44,"value":629}," folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ",{"type":29,"tag":59,"props":631,"children":633},{"className":632},[],[634],{"type":44,"value":604},{"type":44,"value":636}," subclass called ",{"type":29,"tag":59,"props":638,"children":640},{"className":639},[],[641],{"type":44,"value":642},"Page",{"type":44,"value":644},", containing the client side APIs (such as ",{"type":29,"tag":59,"props":646,"children":648},{"className":647},[],[649],{"type":44,"value":650},"page.goto",{"type":44,"value":652},"), there is a corresponding ",{"type":29,"tag":59,"props":654,"children":656},{"className":655},[],[657],{"type":44,"value":619},{"type":44,"value":636},{"type":29,"tag":59,"props":660,"children":662},{"className":661},[],[663],{"type":44,"value":664},"PageDispatcher",{"type":44,"value":666},". When we call ",{"type":29,"tag":59,"props":668,"children":670},{"className":669},[],[671],{"type":44,"value":650},{"type":44,"value":673}," a message is send over the unique client ",{"type":29,"tag":59,"props":675,"children":677},{"className":676},[],[678],{"type":44,"value":679},"Connection",{"type":44,"value":681}," instance to the unique ",{"type":29,"tag":59,"props":683,"children":685},{"className":684},[],[686],{"type":44,"value":687},"DispatcherConnection",{"type":44,"value":689}," instance, which calls the corresponding ",{"type":29,"tag":59,"props":691,"children":693},{"className":692},[],[694],{"type":44,"value":664},{"type":44,"value":696},", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.",{"type":29,"tag":30,"props":698,"children":699},{},[700],{"type":44,"value":701},"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.",{"type":29,"tag":39,"props":703,"children":705},{"id":704},"playwrights-core-api-factory-createinprocessplaywright",[706],{"type":44,"value":707},"Playwright's core API factory, createInProcessPlaywright",{"type":29,"tag":30,"props":709,"children":710},{},[711,713,718,720,725],{"type":44,"value":712},"This file, ",{"type":29,"tag":59,"props":714,"children":716},{"className":715},[],[717],{"type":44,"value":496},{"type":44,"value":719},", contains only one function called ",{"type":29,"tag":59,"props":721,"children":723},{"className":722},[],[724],{"type":44,"value":504},{"type":44,"value":726},". We include it here as a reference:",{"type":29,"tag":52,"props":728,"children":731},{"className":54,"code":729,"filename":730,"language":56,"meta":7,"style":7},"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","packages/playwright-core/src/inProcessFactory.ts",[732],{"type":29,"tag":59,"props":733,"children":734},{"__ignoreMap":7},[735,771,797,805,858,866,873,921,940,985,993,1002,1039,1057,1089,1106,1114,1145,1153,1162,1181,1213,1222,1245,1272,1281,1290,1315,1324,1332,1357,1366,1374,1400,1408,1417,1449,1480,1512,1541,1549,1592,1601,1635,1665,1696,1710],{"type":29,"tag":63,"props":736,"children":737},{"class":65,"line":66},[738,743,747,752,757,762,767],{"type":29,"tag":63,"props":739,"children":740},{"style":70},[741],{"type":44,"value":742},"export",{"type":29,"tag":63,"props":744,"children":745},{"style":70},[746],{"type":44,"value":114},{"type":29,"tag":63,"props":748,"children":749},{"style":117},[750],{"type":44,"value":751}," createInProcessPlaywright",{"type":29,"tag":63,"props":753,"children":754},{"style":76},[755],{"type":44,"value":756},"()",{"type":29,"tag":63,"props":758,"children":759},{"style":70},[760],{"type":44,"value":761},":",{"type":29,"tag":63,"props":763,"children":764},{"style":117},[765],{"type":44,"value":766}," PlaywrightAPI",{"type":29,"tag":63,"props":768,"children":769},{"style":76},[770],{"type":44,"value":135},{"type":29,"tag":63,"props":772,"children":773},{"class":65,"line":93},[774,778,783,787,792],{"type":29,"tag":63,"props":775,"children":776},{"style":70},[777],{"type":44,"value":144},{"type":29,"tag":63,"props":779,"children":780},{"style":394},[781],{"type":44,"value":782}," playwright",{"type":29,"tag":63,"props":784,"children":785},{"style":70},[786],{"type":44,"value":155},{"type":29,"tag":63,"props":788,"children":789},{"style":117},[790],{"type":44,"value":791}," createPlaywright",{"type":29,"tag":63,"props":793,"children":794},{"style":76},[795],{"type":44,"value":796},"({\n",{"type":29,"tag":63,"props":798,"children":799},{"class":65,"line":103},[800],{"type":29,"tag":63,"props":801,"children":802},{"style":76},[803],{"type":44,"value":804}," sdkLanguage:\n",{"type":29,"tag":63,"props":806,"children":807},{"class":65,"line":138},[808,813,818,823,828,833,838,843,848,853],{"type":29,"tag":63,"props":809,"children":810},{"style":76},[811],{"type":44,"value":812}," (process.env.",{"type":29,"tag":63,"props":814,"children":815},{"style":394},[816],{"type":44,"value":817},"PW_LANG_NAME",{"type":29,"tag":63,"props":819,"children":820},{"style":70},[821],{"type":44,"value":822}," as",{"type":29,"tag":63,"props":824,"children":825},{"style":117},[826],{"type":44,"value":827}," Language",{"type":29,"tag":63,"props":829,"children":830},{"style":70},[831],{"type":44,"value":832}," |",{"type":29,"tag":63,"props":834,"children":835},{"style":394},[836],{"type":44,"value":837}," undefined",{"type":29,"tag":63,"props":839,"children":840},{"style":76},[841],{"type":44,"value":842},") ",{"type":29,"tag":63,"props":844,"children":845},{"style":70},[846],{"type":44,"value":847},"||",{"type":29,"tag":63,"props":849,"children":850},{"style":87},[851],{"type":44,"value":852}," \"javascript\"",{"type":29,"tag":63,"props":854,"children":855},{"style":76},[856],{"type":44,"value":857},",\n",{"type":29,"tag":63,"props":859,"children":860},{"class":65,"line":178},[861],{"type":29,"tag":63,"props":862,"children":863},{"style":76},[864],{"type":44,"value":865}," });\n",{"type":29,"tag":63,"props":867,"children":868},{"class":65,"line":213},[869],{"type":29,"tag":63,"props":870,"children":871},{"emptyLinePlaceholder":97},[872],{"type":44,"value":100},{"type":29,"tag":63,"props":874,"children":875},{"class":65,"line":251},[876,880,885,889,894,899,903,908,913,917],{"type":29,"tag":63,"props":877,"children":878},{"style":70},[879],{"type":44,"value":144},{"type":29,"tag":63,"props":881,"children":882},{"style":394},[883],{"type":44,"value":884}," clientConnection",{"type":29,"tag":63,"props":886,"children":887},{"style":70},[888],{"type":44,"value":155},{"type":29,"tag":63,"props":890,"children":891},{"style":70},[892],{"type":44,"value":893}," new",{"type":29,"tag":63,"props":895,"children":896},{"style":117},[897],{"type":44,"value":898}," Connection",{"type":29,"tag":63,"props":900,"children":901},{"style":76},[902],{"type":44,"value":238},{"type":29,"tag":63,"props":904,"children":905},{"style":394},[906],{"type":44,"value":907},"undefined",{"type":29,"tag":63,"props":909,"children":910},{"style":76},[911],{"type":44,"value":912},", ",{"type":29,"tag":63,"props":914,"children":915},{"style":394},[916],{"type":44,"value":907},{"type":29,"tag":63,"props":918,"children":919},{"style":76},[920],{"type":44,"value":429},{"type":29,"tag":63,"props":922,"children":924},{"class":65,"line":923},8,[925,930,935],{"type":29,"tag":63,"props":926,"children":927},{"style":76},[928],{"type":44,"value":929}," clientConnection.",{"type":29,"tag":63,"props":931,"children":932},{"style":117},[933],{"type":44,"value":934},"useRawBuffers",{"type":29,"tag":63,"props":936,"children":937},{"style":76},[938],{"type":44,"value":939},"();\n",{"type":29,"tag":63,"props":941,"children":943},{"class":65,"line":942},9,[944,948,953,957,961,966,970,975,981],{"type":29,"tag":63,"props":945,"children":946},{"style":70},[947],{"type":44,"value":144},{"type":29,"tag":63,"props":949,"children":950},{"style":394},[951],{"type":44,"value":952}," dispatcherConnection",{"type":29,"tag":63,"props":954,"children":955},{"style":70},[956],{"type":44,"value":155},{"type":29,"tag":63,"props":958,"children":959},{"style":70},[960],{"type":44,"value":893},{"type":29,"tag":63,"props":962,"children":963},{"style":117},[964],{"type":44,"value":965}," DispatcherConnection",{"type":29,"tag":63,"props":967,"children":968},{"style":76},[969],{"type":44,"value":238},{"type":29,"tag":63,"props":971,"children":972},{"style":394},[973],{"type":44,"value":974},"true",{"type":29,"tag":63,"props":976,"children":978},{"style":977},"--shiki-default:#6A737D",[979],{"type":44,"value":980}," /* local */",{"type":29,"tag":63,"props":982,"children":983},{"style":76},[984],{"type":44,"value":429},{"type":29,"tag":63,"props":986,"children":988},{"class":65,"line":987},10,[989],{"type":29,"tag":63,"props":990,"children":991},{"emptyLinePlaceholder":97},[992],{"type":44,"value":100},{"type":29,"tag":63,"props":994,"children":996},{"class":65,"line":995},11,[997],{"type":29,"tag":63,"props":998,"children":999},{"style":977},[1000],{"type":44,"value":1001}," // Dispatch synchronously at first.\n",{"type":29,"tag":63,"props":1003,"children":1005},{"class":65,"line":1004},12,[1006,1011,1016,1020,1025,1030,1034],{"type":29,"tag":63,"props":1007,"children":1008},{"style":76},[1009],{"type":44,"value":1010}," dispatcherConnection.",{"type":29,"tag":63,"props":1012,"children":1013},{"style":117},[1014],{"type":44,"value":1015},"onmessage",{"type":29,"tag":63,"props":1017,"children":1018},{"style":70},[1019],{"type":44,"value":155},{"type":29,"tag":63,"props":1021,"children":1022},{"style":76},[1023],{"type":44,"value":1024}," (",{"type":29,"tag":63,"props":1026,"children":1027},{"style":147},[1028],{"type":44,"value":1029},"message",{"type":29,"tag":63,"props":1031,"children":1032},{"style":76},[1033],{"type":44,"value":842},{"type":29,"tag":63,"props":1035,"children":1036},{"style":70},[1037],{"type":44,"value":1038},"=>\n",{"type":29,"tag":63,"props":1040,"children":1041},{"class":65,"line":23},[1042,1047,1052],{"type":29,"tag":63,"props":1043,"children":1044},{"style":76},[1045],{"type":44,"value":1046}," clientConnection.",{"type":29,"tag":63,"props":1048,"children":1049},{"style":117},[1050],{"type":44,"value":1051},"dispatch",{"type":29,"tag":63,"props":1053,"children":1054},{"style":76},[1055],{"type":44,"value":1056},"(message);\n",{"type":29,"tag":63,"props":1058,"children":1060},{"class":65,"line":1059},14,[1061,1065,1069,1073,1077,1081,1085],{"type":29,"tag":63,"props":1062,"children":1063},{"style":76},[1064],{"type":44,"value":929},{"type":29,"tag":63,"props":1066,"children":1067},{"style":117},[1068],{"type":44,"value":1015},{"type":29,"tag":63,"props":1070,"children":1071},{"style":70},[1072],{"type":44,"value":155},{"type":29,"tag":63,"props":1074,"children":1075},{"style":76},[1076],{"type":44,"value":1024},{"type":29,"tag":63,"props":1078,"children":1079},{"style":147},[1080],{"type":44,"value":1029},{"type":29,"tag":63,"props":1082,"children":1083},{"style":76},[1084],{"type":44,"value":842},{"type":29,"tag":63,"props":1086,"children":1087},{"style":70},[1088],{"type":44,"value":1038},{"type":29,"tag":63,"props":1090,"children":1092},{"class":65,"line":1091},15,[1093,1098,1102],{"type":29,"tag":63,"props":1094,"children":1095},{"style":76},[1096],{"type":44,"value":1097}," dispatcherConnection.",{"type":29,"tag":63,"props":1099,"children":1100},{"style":117},[1101],{"type":44,"value":1051},{"type":29,"tag":63,"props":1103,"children":1104},{"style":76},[1105],{"type":44,"value":1056},{"type":29,"tag":63,"props":1107,"children":1109},{"class":65,"line":1108},16,[1110],{"type":29,"tag":63,"props":1111,"children":1112},{"emptyLinePlaceholder":97},[1113],{"type":44,"value":100},{"type":29,"tag":63,"props":1115,"children":1117},{"class":65,"line":1116},17,[1118,1122,1127,1131,1135,1140],{"type":29,"tag":63,"props":1119,"children":1120},{"style":70},[1121],{"type":44,"value":144},{"type":29,"tag":63,"props":1123,"children":1124},{"style":394},[1125],{"type":44,"value":1126}," rootScope",{"type":29,"tag":63,"props":1128,"children":1129},{"style":70},[1130],{"type":44,"value":155},{"type":29,"tag":63,"props":1132,"children":1133},{"style":70},[1134],{"type":44,"value":893},{"type":29,"tag":63,"props":1136,"children":1137},{"style":117},[1138],{"type":44,"value":1139}," RootDispatcher",{"type":29,"tag":63,"props":1141,"children":1142},{"style":76},[1143],{"type":44,"value":1144},"(dispatcherConnection);\n",{"type":29,"tag":63,"props":1146,"children":1148},{"class":65,"line":1147},18,[1149],{"type":29,"tag":63,"props":1150,"children":1151},{"emptyLinePlaceholder":97},[1152],{"type":44,"value":100},{"type":29,"tag":63,"props":1154,"children":1156},{"class":65,"line":1155},19,[1157],{"type":29,"tag":63,"props":1158,"children":1159},{"style":977},[1160],{"type":44,"value":1161}," // Initialize Playwright channel.\n",{"type":29,"tag":63,"props":1163,"children":1165},{"class":65,"line":1164},20,[1166,1171,1176],{"type":29,"tag":63,"props":1167,"children":1168},{"style":70},[1169],{"type":44,"value":1170}," new",{"type":29,"tag":63,"props":1172,"children":1173},{"style":117},[1174],{"type":44,"value":1175}," PlaywrightDispatcher",{"type":29,"tag":63,"props":1177,"children":1178},{"style":76},[1179],{"type":44,"value":1180},"(rootScope, playwright);\n",{"type":29,"tag":63,"props":1182,"children":1184},{"class":65,"line":1183},21,[1185,1189,1194,1198,1203,1208],{"type":29,"tag":63,"props":1186,"children":1187},{"style":70},[1188],{"type":44,"value":144},{"type":29,"tag":63,"props":1190,"children":1191},{"style":394},[1192],{"type":44,"value":1193}," playwrightAPI",{"type":29,"tag":63,"props":1195,"children":1196},{"style":70},[1197],{"type":44,"value":155},{"type":29,"tag":63,"props":1199,"children":1200},{"style":76},[1201],{"type":44,"value":1202}," clientConnection.",{"type":29,"tag":63,"props":1204,"children":1205},{"style":117},[1206],{"type":44,"value":1207},"getObjectWithKnownName",{"type":29,"tag":63,"props":1209,"children":1210},{"style":76},[1211],{"type":44,"value":1212},"(\n",{"type":29,"tag":63,"props":1214,"children":1216},{"class":65,"line":1215},22,[1217],{"type":29,"tag":63,"props":1218,"children":1219},{"style":87},[1220],{"type":44,"value":1221}," \"Playwright\"\n",{"type":29,"tag":63,"props":1223,"children":1225},{"class":65,"line":1224},23,[1226,1231,1236,1240],{"type":29,"tag":63,"props":1227,"children":1228},{"style":76},[1229],{"type":44,"value":1230}," ) ",{"type":29,"tag":63,"props":1232,"children":1233},{"style":70},[1234],{"type":44,"value":1235},"as",{"type":29,"tag":63,"props":1237,"children":1238},{"style":117},[1239],{"type":44,"value":766},{"type":29,"tag":63,"props":1241,"children":1242},{"style":76},[1243],{"type":44,"value":1244},";\n",{"type":29,"tag":63,"props":1246,"children":1248},{"class":65,"line":1247},24,[1249,1254,1259,1263,1268],{"type":29,"tag":63,"props":1250,"children":1251},{"style":76},[1252],{"type":44,"value":1253}," playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":1255,"children":1256},{"style":70},[1257],{"type":44,"value":1258},"=",{"type":29,"tag":63,"props":1260,"children":1261},{"style":70},[1262],{"type":44,"value":893},{"type":29,"tag":63,"props":1264,"children":1265},{"style":117},[1266],{"type":44,"value":1267}," BrowserServerLauncherImpl",{"type":29,"tag":63,"props":1269,"children":1270},{"style":76},[1271],{"type":44,"value":1212},{"type":29,"tag":63,"props":1273,"children":1275},{"class":65,"line":1274},25,[1276],{"type":29,"tag":63,"props":1277,"children":1278},{"style":87},[1279],{"type":44,"value":1280}," \"chromium\"\n",{"type":29,"tag":63,"props":1282,"children":1284},{"class":65,"line":1283},26,[1285],{"type":29,"tag":63,"props":1286,"children":1287},{"style":76},[1288],{"type":44,"value":1289}," );\n",{"type":29,"tag":63,"props":1291,"children":1293},{"class":65,"line":1292},27,[1294,1299,1303,1307,1311],{"type":29,"tag":63,"props":1295,"children":1296},{"style":76},[1297],{"type":44,"value":1298}," playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":1300,"children":1301},{"style":70},[1302],{"type":44,"value":1258},{"type":29,"tag":63,"props":1304,"children":1305},{"style":70},[1306],{"type":44,"value":893},{"type":29,"tag":63,"props":1308,"children":1309},{"style":117},[1310],{"type":44,"value":1267},{"type":29,"tag":63,"props":1312,"children":1313},{"style":76},[1314],{"type":44,"value":1212},{"type":29,"tag":63,"props":1316,"children":1318},{"class":65,"line":1317},28,[1319],{"type":29,"tag":63,"props":1320,"children":1321},{"style":87},[1322],{"type":44,"value":1323}," \"firefox\"\n",{"type":29,"tag":63,"props":1325,"children":1327},{"class":65,"line":1326},29,[1328],{"type":29,"tag":63,"props":1329,"children":1330},{"style":76},[1331],{"type":44,"value":1289},{"type":29,"tag":63,"props":1333,"children":1335},{"class":65,"line":1334},30,[1336,1341,1345,1349,1353],{"type":29,"tag":63,"props":1337,"children":1338},{"style":76},[1339],{"type":44,"value":1340}," playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":1342,"children":1343},{"style":70},[1344],{"type":44,"value":1258},{"type":29,"tag":63,"props":1346,"children":1347},{"style":70},[1348],{"type":44,"value":893},{"type":29,"tag":63,"props":1350,"children":1351},{"style":117},[1352],{"type":44,"value":1267},{"type":29,"tag":63,"props":1354,"children":1355},{"style":76},[1356],{"type":44,"value":1212},{"type":29,"tag":63,"props":1358,"children":1360},{"class":65,"line":1359},31,[1361],{"type":29,"tag":63,"props":1362,"children":1363},{"style":87},[1364],{"type":44,"value":1365}," \"webkit\"\n",{"type":29,"tag":63,"props":1367,"children":1369},{"class":65,"line":1368},32,[1370],{"type":29,"tag":63,"props":1371,"children":1372},{"style":76},[1373],{"type":44,"value":1289},{"type":29,"tag":63,"props":1375,"children":1377},{"class":65,"line":1376},33,[1378,1383,1387,1391,1396],{"type":29,"tag":63,"props":1379,"children":1380},{"style":76},[1381],{"type":44,"value":1382}," playwrightAPI._android._serverLauncher ",{"type":29,"tag":63,"props":1384,"children":1385},{"style":70},[1386],{"type":44,"value":1258},{"type":29,"tag":63,"props":1388,"children":1389},{"style":70},[1390],{"type":44,"value":893},{"type":29,"tag":63,"props":1392,"children":1393},{"style":117},[1394],{"type":44,"value":1395}," AndroidServerLauncherImpl",{"type":29,"tag":63,"props":1397,"children":1398},{"style":76},[1399],{"type":44,"value":939},{"type":29,"tag":63,"props":1401,"children":1403},{"class":65,"line":1402},34,[1404],{"type":29,"tag":63,"props":1405,"children":1406},{"emptyLinePlaceholder":97},[1407],{"type":44,"value":100},{"type":29,"tag":63,"props":1409,"children":1411},{"class":65,"line":1410},35,[1412],{"type":29,"tag":63,"props":1413,"children":1414},{"style":977},[1415],{"type":44,"value":1416}," // Switch to async dispatch after we got Playwright object.\n",{"type":29,"tag":63,"props":1418,"children":1420},{"class":65,"line":1419},36,[1421,1425,1429,1433,1437,1441,1445],{"type":29,"tag":63,"props":1422,"children":1423},{"style":76},[1424],{"type":44,"value":1010},{"type":29,"tag":63,"props":1426,"children":1427},{"style":117},[1428],{"type":44,"value":1015},{"type":29,"tag":63,"props":1430,"children":1431},{"style":70},[1432],{"type":44,"value":155},{"type":29,"tag":63,"props":1434,"children":1435},{"style":76},[1436],{"type":44,"value":1024},{"type":29,"tag":63,"props":1438,"children":1439},{"style":147},[1440],{"type":44,"value":1029},{"type":29,"tag":63,"props":1442,"children":1443},{"style":76},[1444],{"type":44,"value":842},{"type":29,"tag":63,"props":1446,"children":1447},{"style":70},[1448],{"type":44,"value":1038},{"type":29,"tag":63,"props":1450,"children":1452},{"class":65,"line":1451},37,[1453,1458,1463,1467,1471,1475],{"type":29,"tag":63,"props":1454,"children":1455},{"style":117},[1456],{"type":44,"value":1457}," setImmediate",{"type":29,"tag":63,"props":1459,"children":1460},{"style":76},[1461],{"type":44,"value":1462},"(() ",{"type":29,"tag":63,"props":1464,"children":1465},{"style":70},[1466],{"type":44,"value":130},{"type":29,"tag":63,"props":1468,"children":1469},{"style":76},[1470],{"type":44,"value":1202},{"type":29,"tag":63,"props":1472,"children":1473},{"style":117},[1474],{"type":44,"value":1051},{"type":29,"tag":63,"props":1476,"children":1477},{"style":76},[1478],{"type":44,"value":1479},"(message));\n",{"type":29,"tag":63,"props":1481,"children":1483},{"class":65,"line":1482},38,[1484,1488,1492,1496,1500,1504,1508],{"type":29,"tag":63,"props":1485,"children":1486},{"style":76},[1487],{"type":44,"value":929},{"type":29,"tag":63,"props":1489,"children":1490},{"style":117},[1491],{"type":44,"value":1015},{"type":29,"tag":63,"props":1493,"children":1494},{"style":70},[1495],{"type":44,"value":155},{"type":29,"tag":63,"props":1497,"children":1498},{"style":76},[1499],{"type":44,"value":1024},{"type":29,"tag":63,"props":1501,"children":1502},{"style":147},[1503],{"type":44,"value":1029},{"type":29,"tag":63,"props":1505,"children":1506},{"style":76},[1507],{"type":44,"value":842},{"type":29,"tag":63,"props":1509,"children":1510},{"style":70},[1511],{"type":44,"value":1038},{"type":29,"tag":63,"props":1513,"children":1515},{"class":65,"line":1514},39,[1516,1520,1524,1528,1533,1537],{"type":29,"tag":63,"props":1517,"children":1518},{"style":117},[1519],{"type":44,"value":1457},{"type":29,"tag":63,"props":1521,"children":1522},{"style":76},[1523],{"type":44,"value":1462},{"type":29,"tag":63,"props":1525,"children":1526},{"style":70},[1527],{"type":44,"value":130},{"type":29,"tag":63,"props":1529,"children":1530},{"style":76},[1531],{"type":44,"value":1532}," dispatcherConnection.",{"type":29,"tag":63,"props":1534,"children":1535},{"style":117},[1536],{"type":44,"value":1051},{"type":29,"tag":63,"props":1538,"children":1539},{"style":76},[1540],{"type":44,"value":1479},{"type":29,"tag":63,"props":1542,"children":1544},{"class":65,"line":1543},40,[1545],{"type":29,"tag":63,"props":1546,"children":1547},{"emptyLinePlaceholder":97},[1548],{"type":44,"value":100},{"type":29,"tag":63,"props":1550,"children":1552},{"class":65,"line":1551},41,[1553,1557,1562,1566,1570,1575,1579,1584,1588],{"type":29,"tag":63,"props":1554,"children":1555},{"style":76},[1556],{"type":44,"value":929},{"type":29,"tag":63,"props":1558,"children":1559},{"style":117},[1560],{"type":44,"value":1561},"toImpl",{"type":29,"tag":63,"props":1563,"children":1564},{"style":70},[1565],{"type":44,"value":155},{"type":29,"tag":63,"props":1567,"children":1568},{"style":76},[1569],{"type":44,"value":1024},{"type":29,"tag":63,"props":1571,"children":1572},{"style":147},[1573],{"type":44,"value":1574},"x",{"type":29,"tag":63,"props":1576,"children":1577},{"style":70},[1578],{"type":44,"value":761},{"type":29,"tag":63,"props":1580,"children":1581},{"style":394},[1582],{"type":44,"value":1583}," any",{"type":29,"tag":63,"props":1585,"children":1586},{"style":76},[1587],{"type":44,"value":842},{"type":29,"tag":63,"props":1589,"children":1590},{"style":70},[1591],{"type":44,"value":1038},{"type":29,"tag":63,"props":1593,"children":1595},{"class":65,"line":1594},42,[1596],{"type":29,"tag":63,"props":1597,"children":1598},{"style":76},[1599],{"type":44,"value":1600}," x\n",{"type":29,"tag":63,"props":1602,"children":1604},{"class":65,"line":1603},43,[1605,1610,1615,1620,1625,1630],{"type":29,"tag":63,"props":1606,"children":1607},{"style":70},[1608],{"type":44,"value":1609}," ?",{"type":29,"tag":63,"props":1611,"children":1612},{"style":76},[1613],{"type":44,"value":1614}," dispatcherConnection._dispatchers.",{"type":29,"tag":63,"props":1616,"children":1617},{"style":117},[1618],{"type":44,"value":1619},"get",{"type":29,"tag":63,"props":1621,"children":1622},{"style":76},[1623],{"type":44,"value":1624},"(x._guid)",{"type":29,"tag":63,"props":1626,"children":1627},{"style":70},[1628],{"type":44,"value":1629},"!",{"type":29,"tag":63,"props":1631,"children":1632},{"style":76},[1633],{"type":44,"value":1634},"._object\n",{"type":29,"tag":63,"props":1636,"children":1638},{"class":65,"line":1637},44,[1639,1644,1648,1652,1656,1661],{"type":29,"tag":63,"props":1640,"children":1641},{"style":70},[1642],{"type":44,"value":1643}," :",{"type":29,"tag":63,"props":1645,"children":1646},{"style":76},[1647],{"type":44,"value":1614},{"type":29,"tag":63,"props":1649,"children":1650},{"style":117},[1651],{"type":44,"value":1619},{"type":29,"tag":63,"props":1653,"children":1654},{"style":76},[1655],{"type":44,"value":238},{"type":29,"tag":63,"props":1657,"children":1658},{"style":87},[1659],{"type":44,"value":1660},"\"\"",{"type":29,"tag":63,"props":1662,"children":1663},{"style":76},[1664],{"type":44,"value":429},{"type":29,"tag":63,"props":1666,"children":1668},{"class":65,"line":1667},45,[1669,1674,1678,1682,1687,1691],{"type":29,"tag":63,"props":1670,"children":1671},{"style":76},[1672],{"type":44,"value":1673}," (playwrightAPI ",{"type":29,"tag":63,"props":1675,"children":1676},{"style":70},[1677],{"type":44,"value":1235},{"type":29,"tag":63,"props":1679,"children":1680},{"style":394},[1681],{"type":44,"value":1583},{"type":29,"tag":63,"props":1683,"children":1684},{"style":76},[1685],{"type":44,"value":1686},")._toImpl ",{"type":29,"tag":63,"props":1688,"children":1689},{"style":70},[1690],{"type":44,"value":1258},{"type":29,"tag":63,"props":1692,"children":1693},{"style":76},[1694],{"type":44,"value":1695}," clientConnection.toImpl;\n",{"type":29,"tag":63,"props":1697,"children":1699},{"class":65,"line":1698},46,[1700,1705],{"type":29,"tag":63,"props":1701,"children":1702},{"style":70},[1703],{"type":44,"value":1704}," return",{"type":29,"tag":63,"props":1706,"children":1707},{"style":76},[1708],{"type":44,"value":1709}," playwrightAPI;\n",{"type":29,"tag":63,"props":1711,"children":1713},{"class":65,"line":1712},47,[1714],{"type":29,"tag":63,"props":1715,"children":1716},{"style":76},[1717],{"type":44,"value":257},{"type":29,"tag":30,"props":1719,"children":1720},{},[1721,1723,1729,1731,1737,1739,1745,1747],{"type":44,"value":1722},"If you scan through the script and look at the return value, you'll see Playwright is returning the ",{"type":29,"tag":59,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":44,"value":1728},"PlaywrightAPI",{"type":44,"value":1730}," instance ",{"type":29,"tag":59,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":44,"value":1736},"playwrightAPI",{"type":44,"value":1738},", which is defined somewhere within the client library ",{"type":29,"tag":59,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":44,"value":1744},"playwright-core/src/client/",{"type":44,"value":1746}," (which we find from our type hints). So when we write a script using ",{"type":29,"tag":59,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":44,"value":287},{"type":29,"tag":52,"props":1753,"children":1756},{"className":54,"code":1754,"filename":1755,"language":56,"meta":7,"style":7},"import { chromium } from \"playwright-core\";\n","my-automation-script.ts",[1757],{"type":29,"tag":59,"props":1758,"children":1759},{"__ignoreMap":7},[1760],{"type":29,"tag":63,"props":1761,"children":1762},{"class":65,"line":66},[1763,1767,1771,1775,1780],{"type":29,"tag":63,"props":1764,"children":1765},{"style":70},[1766],{"type":44,"value":73},{"type":29,"tag":63,"props":1768,"children":1769},{"style":76},[1770],{"type":44,"value":79},{"type":29,"tag":63,"props":1772,"children":1773},{"style":70},[1774],{"type":44,"value":84},{"type":29,"tag":63,"props":1776,"children":1777},{"style":87},[1778],{"type":44,"value":1779}," \"playwright-core\"",{"type":29,"tag":63,"props":1781,"children":1782},{"style":76},[1783],{"type":44,"value":1244},{"type":29,"tag":30,"props":1785,"children":1786},{},[1787,1789,1794,1796,1802],{"type":44,"value":1788},"really we are making an import of the ",{"type":29,"tag":59,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":44,"value":1736},{"type":44,"value":1795}," object and accessing its ",{"type":29,"tag":59,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":44,"value":1801},"chromium",{"type":44,"value":1803}," property, so our script is secretly",{"type":29,"tag":52,"props":1805,"children":1807},{"className":54,"code":1806,"filename":1755,"language":56,"meta":7,"style":7},"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n",[1808],{"type":29,"tag":59,"props":1809,"children":1810},{"__ignoreMap":7},[1811,1835],{"type":29,"tag":63,"props":1812,"children":1813},{"class":65,"line":66},[1814,1818,1823,1827,1831],{"type":29,"tag":63,"props":1815,"children":1816},{"style":70},[1817],{"type":44,"value":73},{"type":29,"tag":63,"props":1819,"children":1820},{"style":76},[1821],{"type":44,"value":1822}," playwrightAPI ",{"type":29,"tag":63,"props":1824,"children":1825},{"style":70},[1826],{"type":44,"value":84},{"type":29,"tag":63,"props":1828,"children":1829},{"style":87},[1830],{"type":44,"value":1779},{"type":29,"tag":63,"props":1832,"children":1833},{"style":76},[1834],{"type":44,"value":1244},{"type":29,"tag":63,"props":1836,"children":1837},{"class":65,"line":93},[1838,1843,1848,1852,1857,1861],{"type":29,"tag":63,"props":1839,"children":1840},{"style":70},[1841],{"type":44,"value":1842},"const",{"type":29,"tag":63,"props":1844,"children":1845},{"style":76},[1846],{"type":44,"value":1847}," { ",{"type":29,"tag":63,"props":1849,"children":1850},{"style":394},[1851],{"type":44,"value":1801},{"type":29,"tag":63,"props":1853,"children":1854},{"style":76},[1855],{"type":44,"value":1856}," } ",{"type":29,"tag":63,"props":1858,"children":1859},{"style":70},[1860],{"type":44,"value":1258},{"type":29,"tag":63,"props":1862,"children":1863},{"style":76},[1864],{"type":44,"value":1709},{"type":29,"tag":30,"props":1866,"children":1867},{},[1868],{"type":44,"value":1869},"Tracing where this object is instantiated, we find the call",{"type":29,"tag":52,"props":1871,"children":1873},{"className":54,"code":1872,"filename":730,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n",[1874],{"type":29,"tag":59,"props":1875,"children":1876},{"__ignoreMap":7},[1877,1904,1912],{"type":29,"tag":63,"props":1878,"children":1879},{"class":65,"line":66},[1880,1884,1888,1892,1896,1900],{"type":29,"tag":63,"props":1881,"children":1882},{"style":70},[1883],{"type":44,"value":1842},{"type":29,"tag":63,"props":1885,"children":1886},{"style":394},[1887],{"type":44,"value":1193},{"type":29,"tag":63,"props":1889,"children":1890},{"style":70},[1891],{"type":44,"value":155},{"type":29,"tag":63,"props":1893,"children":1894},{"style":76},[1895],{"type":44,"value":1202},{"type":29,"tag":63,"props":1897,"children":1898},{"style":117},[1899],{"type":44,"value":1207},{"type":29,"tag":63,"props":1901,"children":1902},{"style":76},[1903],{"type":44,"value":1212},{"type":29,"tag":63,"props":1905,"children":1906},{"class":65,"line":93},[1907],{"type":29,"tag":63,"props":1908,"children":1909},{"style":87},[1910],{"type":44,"value":1911}," \"Playwright\"\n",{"type":29,"tag":63,"props":1913,"children":1914},{"class":65,"line":103},[1915,1919,1923,1927],{"type":29,"tag":63,"props":1916,"children":1917},{"style":76},[1918],{"type":44,"value":842},{"type":29,"tag":63,"props":1920,"children":1921},{"style":70},[1922],{"type":44,"value":1235},{"type":29,"tag":63,"props":1924,"children":1925},{"style":117},[1926],{"type":44,"value":766},{"type":29,"tag":63,"props":1928,"children":1929},{"style":76},[1930],{"type":44,"value":1244},{"type":29,"tag":30,"props":1932,"children":1933},{},[1934,1936,1941],{"type":44,"value":1935},"which is not very descriptive. If you try looking in the ",{"type":29,"tag":59,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":44,"value":679},{"type":44,"value":1942}," class definition, you won't get very far either, you'll just see",{"type":29,"tag":52,"props":1944,"children":1947},{"className":54,"code":1945,"filename":1946,"language":56,"meta":7,"style":7},"export class Connection extends EventEmitter {\n readonly _objects = new Map\u003Cstring, ChannelOwner>();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","packages/playwright-core/src/client/connection.ts",[1948],{"type":29,"tag":59,"props":1949,"children":1950},{"__ignoreMap":7},[1951,1981,2030,2038,2081,2116,2124],{"type":29,"tag":63,"props":1952,"children":1953},{"class":65,"line":66},[1954,1958,1963,1967,1972,1977],{"type":29,"tag":63,"props":1955,"children":1956},{"style":70},[1957],{"type":44,"value":742},{"type":29,"tag":63,"props":1959,"children":1960},{"style":70},[1961],{"type":44,"value":1962}," class",{"type":29,"tag":63,"props":1964,"children":1965},{"style":117},[1966],{"type":44,"value":898},{"type":29,"tag":63,"props":1968,"children":1969},{"style":70},[1970],{"type":44,"value":1971}," extends",{"type":29,"tag":63,"props":1973,"children":1974},{"style":117},[1975],{"type":44,"value":1976}," EventEmitter",{"type":29,"tag":63,"props":1978,"children":1979},{"style":76},[1980],{"type":44,"value":135},{"type":29,"tag":63,"props":1982,"children":1983},{"class":65,"line":93},[1984,1989,1994,1998,2002,2007,2012,2017,2021,2025],{"type":29,"tag":63,"props":1985,"children":1986},{"style":70},[1987],{"type":44,"value":1988}," readonly",{"type":29,"tag":63,"props":1990,"children":1991},{"style":147},[1992],{"type":44,"value":1993}," _objects",{"type":29,"tag":63,"props":1995,"children":1996},{"style":70},[1997],{"type":44,"value":155},{"type":29,"tag":63,"props":1999,"children":2000},{"style":70},[2001],{"type":44,"value":893},{"type":29,"tag":63,"props":2003,"children":2004},{"style":117},[2005],{"type":44,"value":2006}," Map",{"type":29,"tag":63,"props":2008,"children":2009},{"style":76},[2010],{"type":44,"value":2011},"\u003C",{"type":29,"tag":63,"props":2013,"children":2014},{"style":394},[2015],{"type":44,"value":2016},"string",{"type":29,"tag":63,"props":2018,"children":2019},{"style":76},[2020],{"type":44,"value":912},{"type":29,"tag":63,"props":2022,"children":2023},{"style":117},[2024],{"type":44,"value":604},{"type":29,"tag":63,"props":2026,"children":2027},{"style":76},[2028],{"type":44,"value":2029},">();\n",{"type":29,"tag":63,"props":2031,"children":2032},{"class":65,"line":103},[2033],{"type":29,"tag":63,"props":2034,"children":2035},{"style":977},[2036],{"type":44,"value":2037}," // ...\n",{"type":29,"tag":63,"props":2039,"children":2040},{"class":65,"line":138},[2041,2046,2050,2055,2059,2064,2069,2073,2077],{"type":29,"tag":63,"props":2042,"children":2043},{"style":117},[2044],{"type":44,"value":2045}," getObjectWithKnownName",{"type":29,"tag":63,"props":2047,"children":2048},{"style":76},[2049],{"type":44,"value":238},{"type":29,"tag":63,"props":2051,"children":2052},{"style":147},[2053],{"type":44,"value":2054},"guid",{"type":29,"tag":63,"props":2056,"children":2057},{"style":70},[2058],{"type":44,"value":761},{"type":29,"tag":63,"props":2060,"children":2061},{"style":394},[2062],{"type":44,"value":2063}," string",{"type":29,"tag":63,"props":2065,"children":2066},{"style":76},[2067],{"type":44,"value":2068},")",{"type":29,"tag":63,"props":2070,"children":2071},{"style":70},[2072],{"type":44,"value":761},{"type":29,"tag":63,"props":2074,"children":2075},{"style":394},[2076],{"type":44,"value":1583},{"type":29,"tag":63,"props":2078,"children":2079},{"style":76},[2080],{"type":44,"value":135},{"type":29,"tag":63,"props":2082,"children":2083},{"class":65,"line":178},[2084,2089,2094,2099,2103,2108,2112],{"type":29,"tag":63,"props":2085,"children":2086},{"style":70},[2087],{"type":44,"value":2088}," return",{"type":29,"tag":63,"props":2090,"children":2091},{"style":394},[2092],{"type":44,"value":2093}," this",{"type":29,"tag":63,"props":2095,"children":2096},{"style":76},[2097],{"type":44,"value":2098},"._objects.",{"type":29,"tag":63,"props":2100,"children":2101},{"style":117},[2102],{"type":44,"value":1619},{"type":29,"tag":63,"props":2104,"children":2105},{"style":76},[2106],{"type":44,"value":2107},"(guid)",{"type":29,"tag":63,"props":2109,"children":2110},{"style":70},[2111],{"type":44,"value":1629},{"type":29,"tag":63,"props":2113,"children":2114},{"style":76},[2115],{"type":44,"value":1244},{"type":29,"tag":63,"props":2117,"children":2118},{"class":65,"line":213},[2119],{"type":29,"tag":63,"props":2120,"children":2121},{"style":76},[2122],{"type":44,"value":2123}," }\n",{"type":29,"tag":63,"props":2125,"children":2126},{"class":65,"line":251},[2127],{"type":29,"tag":63,"props":2128,"children":2129},{"style":76},[2130],{"type":44,"value":257},{"type":29,"tag":30,"props":2132,"children":2133},{},[2134,2136,2141,2143,2149,2151,2156,2158,2164],{"type":44,"value":2135},"which is even more opaque. From this all we know is the ",{"type":29,"tag":59,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":44,"value":679},{"type":44,"value":2142}," class keeps an ",{"type":29,"tag":59,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":44,"value":2148},"_objects",{"type":44,"value":2150}," map which at some point contains an instance of ",{"type":29,"tag":59,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":44,"value":1728},{"type":44,"value":2157},", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within ",{"type":29,"tag":59,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":44,"value":2163},"inProcessFactory",{"type":44,"value":2165}," will give us a clear picture of how this library is wrapped together.",{"type":29,"tag":39,"props":2167,"children":2169},{"id":2168},"cross-communication-between-client-and-server",[2170],{"type":44,"value":2171},"Cross communication between client and server",{"type":29,"tag":30,"props":2173,"children":2174},{},[2175,2177,2182,2184,2190,2192,2198,2200,2205,2207,2212,2214,2220],{"type":44,"value":2176},"If you look through the script's imports, anything with ",{"type":29,"tag":59,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":44,"value":619},{"type":44,"value":2183}," in its name, and ",{"type":29,"tag":59,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":44,"value":2189},"createPlaywright",{"type":44,"value":2191},", come from the ",{"type":29,"tag":59,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":44,"value":2197},"server",{"type":44,"value":2199}," directroy. The ",{"type":29,"tag":59,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":44,"value":2189},{"type":44,"value":2206}," function creates an instance of the ",{"type":29,"tag":59,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":44,"value":12},{"type":44,"value":2213}," class defined in ",{"type":29,"tag":59,"props":2215,"children":2217},{"className":2216},[],[2218],{"type":44,"value":2219},"packages/playwright-core/server/playwright.ts",{"type":44,"value":228},{"type":29,"tag":30,"props":2222,"children":2223},{},[2224,2226,2231,2232,2237,2239,2244,2246,2251,2253,2258,2260,2266,2267,2272],{"type":44,"value":2225},"Similarly, the imports for ",{"type":29,"tag":59,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":44,"value":1728},{"type":44,"value":2238}," come from the ",{"type":29,"tag":59,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":44,"value":519},{"type":44,"value":2245}," directory. Looking through the first lines of ",{"type":29,"tag":59,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":44,"value":2163},{"type":44,"value":2252},", there is an instantiation of the server ",{"type":29,"tag":59,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":44,"value":12},{"type":44,"value":2259}," class and instantiation of objects for the ",{"type":29,"tag":59,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":44,"value":2265},"ClientConnection",{"type":44,"value":281},{"type":29,"tag":59,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":44,"value":687},{"type":44,"value":2273}," classes",{"type":29,"tag":52,"props":2275,"children":2277},{"className":54,"code":2276,"filename":730,"language":56,"meta":7,"style":7},"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n",[2278],{"type":29,"tag":59,"props":2279,"children":2280},{"__ignoreMap":7},[2281,2304,2312,2356,2364,2371,2414,2430],{"type":29,"tag":63,"props":2282,"children":2283},{"class":65,"line":66},[2284,2288,2292,2296,2300],{"type":29,"tag":63,"props":2285,"children":2286},{"style":70},[2287],{"type":44,"value":1842},{"type":29,"tag":63,"props":2289,"children":2290},{"style":394},[2291],{"type":44,"value":782},{"type":29,"tag":63,"props":2293,"children":2294},{"style":70},[2295],{"type":44,"value":155},{"type":29,"tag":63,"props":2297,"children":2298},{"style":117},[2299],{"type":44,"value":791},{"type":29,"tag":63,"props":2301,"children":2302},{"style":76},[2303],{"type":44,"value":796},{"type":29,"tag":63,"props":2305,"children":2306},{"class":65,"line":93},[2307],{"type":29,"tag":63,"props":2308,"children":2309},{"style":76},[2310],{"type":44,"value":2311}," sdkLanguage:\n",{"type":29,"tag":63,"props":2313,"children":2314},{"class":65,"line":103},[2315,2320,2324,2328,2332,2336,2340,2344,2348,2352],{"type":29,"tag":63,"props":2316,"children":2317},{"style":76},[2318],{"type":44,"value":2319}," (process.env.",{"type":29,"tag":63,"props":2321,"children":2322},{"style":394},[2323],{"type":44,"value":817},{"type":29,"tag":63,"props":2325,"children":2326},{"style":70},[2327],{"type":44,"value":822},{"type":29,"tag":63,"props":2329,"children":2330},{"style":117},[2331],{"type":44,"value":827},{"type":29,"tag":63,"props":2333,"children":2334},{"style":70},[2335],{"type":44,"value":832},{"type":29,"tag":63,"props":2337,"children":2338},{"style":394},[2339],{"type":44,"value":837},{"type":29,"tag":63,"props":2341,"children":2342},{"style":76},[2343],{"type":44,"value":842},{"type":29,"tag":63,"props":2345,"children":2346},{"style":70},[2347],{"type":44,"value":847},{"type":29,"tag":63,"props":2349,"children":2350},{"style":87},[2351],{"type":44,"value":852},{"type":29,"tag":63,"props":2353,"children":2354},{"style":76},[2355],{"type":44,"value":857},{"type":29,"tag":63,"props":2357,"children":2358},{"class":65,"line":138},[2359],{"type":29,"tag":63,"props":2360,"children":2361},{"style":76},[2362],{"type":44,"value":2363},"});\n",{"type":29,"tag":63,"props":2365,"children":2366},{"class":65,"line":178},[2367],{"type":29,"tag":63,"props":2368,"children":2369},{"emptyLinePlaceholder":97},[2370],{"type":44,"value":100},{"type":29,"tag":63,"props":2372,"children":2373},{"class":65,"line":213},[2374,2378,2382,2386,2390,2394,2398,2402,2406,2410],{"type":29,"tag":63,"props":2375,"children":2376},{"style":70},[2377],{"type":44,"value":1842},{"type":29,"tag":63,"props":2379,"children":2380},{"style":394},[2381],{"type":44,"value":884},{"type":29,"tag":63,"props":2383,"children":2384},{"style":70},[2385],{"type":44,"value":155},{"type":29,"tag":63,"props":2387,"children":2388},{"style":70},[2389],{"type":44,"value":893},{"type":29,"tag":63,"props":2391,"children":2392},{"style":117},[2393],{"type":44,"value":898},{"type":29,"tag":63,"props":2395,"children":2396},{"style":76},[2397],{"type":44,"value":238},{"type":29,"tag":63,"props":2399,"children":2400},{"style":394},[2401],{"type":44,"value":907},{"type":29,"tag":63,"props":2403,"children":2404},{"style":76},[2405],{"type":44,"value":912},{"type":29,"tag":63,"props":2407,"children":2408},{"style":394},[2409],{"type":44,"value":907},{"type":29,"tag":63,"props":2411,"children":2412},{"style":76},[2413],{"type":44,"value":429},{"type":29,"tag":63,"props":2415,"children":2416},{"class":65,"line":251},[2417,2422,2426],{"type":29,"tag":63,"props":2418,"children":2419},{"style":76},[2420],{"type":44,"value":2421},"clientConnection.",{"type":29,"tag":63,"props":2423,"children":2424},{"style":117},[2425],{"type":44,"value":934},{"type":29,"tag":63,"props":2427,"children":2428},{"style":76},[2429],{"type":44,"value":939},{"type":29,"tag":63,"props":2431,"children":2432},{"class":65,"line":923},[2433,2437,2441,2445,2449,2453,2457,2461,2465],{"type":29,"tag":63,"props":2434,"children":2435},{"style":70},[2436],{"type":44,"value":1842},{"type":29,"tag":63,"props":2438,"children":2439},{"style":394},[2440],{"type":44,"value":952},{"type":29,"tag":63,"props":2442,"children":2443},{"style":70},[2444],{"type":44,"value":155},{"type":29,"tag":63,"props":2446,"children":2447},{"style":70},[2448],{"type":44,"value":893},{"type":29,"tag":63,"props":2450,"children":2451},{"style":117},[2452],{"type":44,"value":965},{"type":29,"tag":63,"props":2454,"children":2455},{"style":76},[2456],{"type":44,"value":238},{"type":29,"tag":63,"props":2458,"children":2459},{"style":394},[2460],{"type":44,"value":974},{"type":29,"tag":63,"props":2462,"children":2463},{"style":977},[2464],{"type":44,"value":980},{"type":29,"tag":63,"props":2466,"children":2467},{"style":76},[2468],{"type":44,"value":429},{"type":29,"tag":30,"props":2470,"children":2471},{},[2472],{"type":44,"value":2473},"The next lines of code are the bridge between the internal client and server libraries",{"type":29,"tag":52,"props":2475,"children":2477},{"className":54,"code":2476,"filename":730,"language":56,"meta":7,"style":7},"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n",[2478],{"type":29,"tag":59,"props":2479,"children":2480},{"__ignoreMap":7},[2481,2513,2528,2559],{"type":29,"tag":63,"props":2482,"children":2483},{"class":65,"line":66},[2484,2489,2493,2497,2501,2505,2509],{"type":29,"tag":63,"props":2485,"children":2486},{"style":76},[2487],{"type":44,"value":2488},"dispatcherConnection.",{"type":29,"tag":63,"props":2490,"children":2491},{"style":117},[2492],{"type":44,"value":1015},{"type":29,"tag":63,"props":2494,"children":2495},{"style":70},[2496],{"type":44,"value":155},{"type":29,"tag":63,"props":2498,"children":2499},{"style":76},[2500],{"type":44,"value":1024},{"type":29,"tag":63,"props":2502,"children":2503},{"style":147},[2504],{"type":44,"value":1029},{"type":29,"tag":63,"props":2506,"children":2507},{"style":76},[2508],{"type":44,"value":842},{"type":29,"tag":63,"props":2510,"children":2511},{"style":70},[2512],{"type":44,"value":1038},{"type":29,"tag":63,"props":2514,"children":2515},{"class":65,"line":93},[2516,2520,2524],{"type":29,"tag":63,"props":2517,"children":2518},{"style":76},[2519],{"type":44,"value":929},{"type":29,"tag":63,"props":2521,"children":2522},{"style":117},[2523],{"type":44,"value":1051},{"type":29,"tag":63,"props":2525,"children":2526},{"style":76},[2527],{"type":44,"value":1056},{"type":29,"tag":63,"props":2529,"children":2530},{"class":65,"line":103},[2531,2535,2539,2543,2547,2551,2555],{"type":29,"tag":63,"props":2532,"children":2533},{"style":76},[2534],{"type":44,"value":2421},{"type":29,"tag":63,"props":2536,"children":2537},{"style":117},[2538],{"type":44,"value":1015},{"type":29,"tag":63,"props":2540,"children":2541},{"style":70},[2542],{"type":44,"value":155},{"type":29,"tag":63,"props":2544,"children":2545},{"style":76},[2546],{"type":44,"value":1024},{"type":29,"tag":63,"props":2548,"children":2549},{"style":147},[2550],{"type":44,"value":1029},{"type":29,"tag":63,"props":2552,"children":2553},{"style":76},[2554],{"type":44,"value":842},{"type":29,"tag":63,"props":2556,"children":2557},{"style":70},[2558],{"type":44,"value":1038},{"type":29,"tag":63,"props":2560,"children":2561},{"class":65,"line":138},[2562,2566,2570],{"type":29,"tag":63,"props":2563,"children":2564},{"style":76},[2565],{"type":44,"value":1010},{"type":29,"tag":63,"props":2567,"children":2568},{"style":117},[2569],{"type":44,"value":1051},{"type":29,"tag":63,"props":2571,"children":2572},{"style":76},[2573],{"type":44,"value":1056},{"type":29,"tag":30,"props":2575,"children":2576},{},[2577,2579,2584,2586,2591,2593,2598,2600,2606,2608,2614,2616,2621,2623,2629],{"type":44,"value":2578},"given by setting the ",{"type":29,"tag":59,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":44,"value":1015},{"type":44,"value":2585}," properties for each of these objects. Notice each ",{"type":29,"tag":59,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":44,"value":1015},{"type":44,"value":2592}," calls the other's ",{"type":29,"tag":59,"props":2594,"children":2596},{"className":2595},[],[2597],{"type":44,"value":1051},{"type":44,"value":2599}," method; i.e., ",{"type":29,"tag":59,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":44,"value":2605},"dispatcherConnection",{"type":44,"value":2607}," calls the ",{"type":29,"tag":59,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":44,"value":2613},"clientConnection.dispatch",{"type":44,"value":2615}," through ",{"type":29,"tag":59,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":44,"value":1015},{"type":44,"value":2622}," and vice versa. This gives us the hint somehow ",{"type":29,"tag":59,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":44,"value":2628},"dispatcherConnection.onmessage",{"type":44,"value":2630}," will be called somewhere in the codebase.",{"type":29,"tag":269,"props":2632,"children":2634},{"id":2633},"server-side-createplaywright",[2635],{"type":44,"value":2636},"Server-side createPlaywright",{"type":29,"tag":30,"props":2638,"children":2639},{},[2640,2642,2647,2649,2654,2656,2661,2662,2667],{"type":44,"value":2641},"Before we continue down the logic within ",{"type":29,"tag":59,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":44,"value":504},{"type":44,"value":2648},", let's go over what the ",{"type":29,"tag":59,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":44,"value":2189},{"type":44,"value":2655}," function actually does. It is a simple function call which instantiates the ",{"type":29,"tag":59,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":44,"value":12},{"type":44,"value":2213},{"type":29,"tag":59,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":44,"value":2219},{"type":44,"value":2668},". Below is a simplified version of it",{"type":29,"tag":52,"props":2670,"children":2672},{"className":54,"code":2671,"filename":2219,"language":56,"meta":7,"style":7},"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n",[2673],{"type":29,"tag":59,"props":2674,"children":2675},{"__ignoreMap":7},[2676,2701,2726,2751,2776,2801,2808,2837,2862,2887,2912,2937,2962,2987,3012,3037,3044,3074,3086,3116,3128,3136,3144,3166,3203,3239,3275,3303,3339,3346],{"type":29,"tag":63,"props":2677,"children":2678},{"class":65,"line":66},[2679,2683,2688,2692,2697],{"type":29,"tag":63,"props":2680,"children":2681},{"style":70},[2682],{"type":44,"value":73},{"type":29,"tag":63,"props":2684,"children":2685},{"style":76},[2686],{"type":44,"value":2687}," { Chromium } ",{"type":29,"tag":63,"props":2689,"children":2690},{"style":70},[2691],{"type":44,"value":84},{"type":29,"tag":63,"props":2693,"children":2694},{"style":87},[2695],{"type":44,"value":2696}," \"./chromium/chromium\"",{"type":29,"tag":63,"props":2698,"children":2699},{"style":76},[2700],{"type":44,"value":1244},{"type":29,"tag":63,"props":2702,"children":2703},{"class":65,"line":93},[2704,2708,2713,2717,2722],{"type":29,"tag":63,"props":2705,"children":2706},{"style":70},[2707],{"type":44,"value":73},{"type":29,"tag":63,"props":2709,"children":2710},{"style":76},[2711],{"type":44,"value":2712}," { Firefox } ",{"type":29,"tag":63,"props":2714,"children":2715},{"style":70},[2716],{"type":44,"value":84},{"type":29,"tag":63,"props":2718,"children":2719},{"style":87},[2720],{"type":44,"value":2721}," \"./firefox/firefox\"",{"type":29,"tag":63,"props":2723,"children":2724},{"style":76},[2725],{"type":44,"value":1244},{"type":29,"tag":63,"props":2727,"children":2728},{"class":65,"line":103},[2729,2733,2738,2742,2747],{"type":29,"tag":63,"props":2730,"children":2731},{"style":70},[2732],{"type":44,"value":73},{"type":29,"tag":63,"props":2734,"children":2735},{"style":76},[2736],{"type":44,"value":2737}," { Selectors } ",{"type":29,"tag":63,"props":2739,"children":2740},{"style":70},[2741],{"type":44,"value":84},{"type":29,"tag":63,"props":2743,"children":2744},{"style":87},[2745],{"type":44,"value":2746}," \"./selectors\"",{"type":29,"tag":63,"props":2748,"children":2749},{"style":76},[2750],{"type":44,"value":1244},{"type":29,"tag":63,"props":2752,"children":2753},{"class":65,"line":138},[2754,2758,2763,2767,2772],{"type":29,"tag":63,"props":2755,"children":2756},{"style":70},[2757],{"type":44,"value":73},{"type":29,"tag":63,"props":2759,"children":2760},{"style":76},[2761],{"type":44,"value":2762}," { WebKit } ",{"type":29,"tag":63,"props":2764,"children":2765},{"style":70},[2766],{"type":44,"value":84},{"type":29,"tag":63,"props":2768,"children":2769},{"style":87},[2770],{"type":44,"value":2771}," \"./webkit/webkit\"",{"type":29,"tag":63,"props":2773,"children":2774},{"style":76},[2775],{"type":44,"value":1244},{"type":29,"tag":63,"props":2777,"children":2778},{"class":65,"line":178},[2779,2783,2788,2792,2797],{"type":29,"tag":63,"props":2780,"children":2781},{"style":70},[2782],{"type":44,"value":73},{"type":29,"tag":63,"props":2784,"children":2785},{"style":76},[2786],{"type":44,"value":2787}," { createInstrumentation, SdkObject } ",{"type":29,"tag":63,"props":2789,"children":2790},{"style":70},[2791],{"type":44,"value":84},{"type":29,"tag":63,"props":2793,"children":2794},{"style":87},[2795],{"type":44,"value":2796}," \"./instrumentation\"",{"type":29,"tag":63,"props":2798,"children":2799},{"style":76},[2800],{"type":44,"value":1244},{"type":29,"tag":63,"props":2802,"children":2803},{"class":65,"line":213},[2804],{"type":29,"tag":63,"props":2805,"children":2806},{"emptyLinePlaceholder":97},[2807],{"type":44,"value":100},{"type":29,"tag":63,"props":2809,"children":2810},{"class":65,"line":251},[2811,2815,2819,2824,2828,2833],{"type":29,"tag":63,"props":2812,"children":2813},{"style":70},[2814],{"type":44,"value":742},{"type":29,"tag":63,"props":2816,"children":2817},{"style":70},[2818],{"type":44,"value":1962},{"type":29,"tag":63,"props":2820,"children":2821},{"style":117},[2822],{"type":44,"value":2823}," Playwright",{"type":29,"tag":63,"props":2825,"children":2826},{"style":70},[2827],{"type":44,"value":1971},{"type":29,"tag":63,"props":2829,"children":2830},{"style":117},[2831],{"type":44,"value":2832}," SdkObject",{"type":29,"tag":63,"props":2834,"children":2835},{"style":76},[2836],{"type":44,"value":135},{"type":29,"tag":63,"props":2838,"children":2839},{"class":65,"line":923},[2840,2844,2849,2853,2858],{"type":29,"tag":63,"props":2841,"children":2842},{"style":70},[2843],{"type":44,"value":1988},{"type":29,"tag":63,"props":2845,"children":2846},{"style":147},[2847],{"type":44,"value":2848}," selectors",{"type":29,"tag":63,"props":2850,"children":2851},{"style":70},[2852],{"type":44,"value":761},{"type":29,"tag":63,"props":2854,"children":2855},{"style":117},[2856],{"type":44,"value":2857}," Selectors",{"type":29,"tag":63,"props":2859,"children":2860},{"style":76},[2861],{"type":44,"value":1244},{"type":29,"tag":63,"props":2863,"children":2864},{"class":65,"line":942},[2865,2869,2874,2878,2883],{"type":29,"tag":63,"props":2866,"children":2867},{"style":70},[2868],{"type":44,"value":1988},{"type":29,"tag":63,"props":2870,"children":2871},{"style":147},[2872],{"type":44,"value":2873}," chromium",{"type":29,"tag":63,"props":2875,"children":2876},{"style":70},[2877],{"type":44,"value":761},{"type":29,"tag":63,"props":2879,"children":2880},{"style":117},[2881],{"type":44,"value":2882}," Chromium",{"type":29,"tag":63,"props":2884,"children":2885},{"style":76},[2886],{"type":44,"value":1244},{"type":29,"tag":63,"props":2888,"children":2889},{"class":65,"line":987},[2890,2894,2899,2903,2908],{"type":29,"tag":63,"props":2891,"children":2892},{"style":70},[2893],{"type":44,"value":1988},{"type":29,"tag":63,"props":2895,"children":2896},{"style":147},[2897],{"type":44,"value":2898}," android",{"type":29,"tag":63,"props":2900,"children":2901},{"style":70},[2902],{"type":44,"value":761},{"type":29,"tag":63,"props":2904,"children":2905},{"style":117},[2906],{"type":44,"value":2907}," Android",{"type":29,"tag":63,"props":2909,"children":2910},{"style":76},[2911],{"type":44,"value":1244},{"type":29,"tag":63,"props":2913,"children":2914},{"class":65,"line":995},[2915,2919,2924,2928,2933],{"type":29,"tag":63,"props":2916,"children":2917},{"style":70},[2918],{"type":44,"value":1988},{"type":29,"tag":63,"props":2920,"children":2921},{"style":147},[2922],{"type":44,"value":2923}," electron",{"type":29,"tag":63,"props":2925,"children":2926},{"style":70},[2927],{"type":44,"value":761},{"type":29,"tag":63,"props":2929,"children":2930},{"style":117},[2931],{"type":44,"value":2932}," Electron",{"type":29,"tag":63,"props":2934,"children":2935},{"style":76},[2936],{"type":44,"value":1244},{"type":29,"tag":63,"props":2938,"children":2939},{"class":65,"line":1004},[2940,2944,2949,2953,2958],{"type":29,"tag":63,"props":2941,"children":2942},{"style":70},[2943],{"type":44,"value":1988},{"type":29,"tag":63,"props":2945,"children":2946},{"style":147},[2947],{"type":44,"value":2948}," firefox",{"type":29,"tag":63,"props":2950,"children":2951},{"style":70},[2952],{"type":44,"value":761},{"type":29,"tag":63,"props":2954,"children":2955},{"style":117},[2956],{"type":44,"value":2957}," Firefox",{"type":29,"tag":63,"props":2959,"children":2960},{"style":76},[2961],{"type":44,"value":1244},{"type":29,"tag":63,"props":2963,"children":2964},{"class":65,"line":23},[2965,2969,2974,2978,2983],{"type":29,"tag":63,"props":2966,"children":2967},{"style":70},[2968],{"type":44,"value":1988},{"type":29,"tag":63,"props":2970,"children":2971},{"style":147},[2972],{"type":44,"value":2973}," webkit",{"type":29,"tag":63,"props":2975,"children":2976},{"style":70},[2977],{"type":44,"value":761},{"type":29,"tag":63,"props":2979,"children":2980},{"style":117},[2981],{"type":44,"value":2982}," WebKit",{"type":29,"tag":63,"props":2984,"children":2985},{"style":76},[2986],{"type":44,"value":1244},{"type":29,"tag":63,"props":2988,"children":2989},{"class":65,"line":1059},[2990,2994,2999,3003,3008],{"type":29,"tag":63,"props":2991,"children":2992},{"style":70},[2993],{"type":44,"value":1988},{"type":29,"tag":63,"props":2995,"children":2996},{"style":147},[2997],{"type":44,"value":2998}," options",{"type":29,"tag":63,"props":3000,"children":3001},{"style":70},[3002],{"type":44,"value":761},{"type":29,"tag":63,"props":3004,"children":3005},{"style":117},[3006],{"type":44,"value":3007}," PlaywrightOptions",{"type":29,"tag":63,"props":3009,"children":3010},{"style":76},[3011],{"type":44,"value":1244},{"type":29,"tag":63,"props":3013,"children":3014},{"class":65,"line":1091},[3015,3019,3024,3028,3033],{"type":29,"tag":63,"props":3016,"children":3017},{"style":70},[3018],{"type":44,"value":1988},{"type":29,"tag":63,"props":3020,"children":3021},{"style":147},[3022],{"type":44,"value":3023}," debugController",{"type":29,"tag":63,"props":3025,"children":3026},{"style":70},[3027],{"type":44,"value":761},{"type":29,"tag":63,"props":3029,"children":3030},{"style":117},[3031],{"type":44,"value":3032}," DebugController",{"type":29,"tag":63,"props":3034,"children":3035},{"style":76},[3036],{"type":44,"value":1244},{"type":29,"tag":63,"props":3038,"children":3039},{"class":65,"line":1108},[3040],{"type":29,"tag":63,"props":3041,"children":3042},{"emptyLinePlaceholder":97},[3043],{"type":44,"value":100},{"type":29,"tag":63,"props":3045,"children":3046},{"class":65,"line":1116},[3047,3052,3056,3061,3065,3069],{"type":29,"tag":63,"props":3048,"children":3049},{"style":70},[3050],{"type":44,"value":3051}," constructor",{"type":29,"tag":63,"props":3053,"children":3054},{"style":76},[3055],{"type":44,"value":238},{"type":29,"tag":63,"props":3057,"children":3058},{"style":147},[3059],{"type":44,"value":3060},"options",{"type":29,"tag":63,"props":3062,"children":3063},{"style":70},[3064],{"type":44,"value":761},{"type":29,"tag":63,"props":3066,"children":3067},{"style":117},[3068],{"type":44,"value":3007},{"type":29,"tag":63,"props":3070,"children":3071},{"style":76},[3072],{"type":44,"value":3073},") {\n",{"type":29,"tag":63,"props":3075,"children":3076},{"class":65,"line":1147},[3077,3082],{"type":29,"tag":63,"props":3078,"children":3079},{"style":394},[3080],{"type":44,"value":3081}," super",{"type":29,"tag":63,"props":3083,"children":3084},{"style":76},[3085],{"type":44,"value":1212},{"type":29,"tag":63,"props":3087,"children":3088},{"class":65,"line":1155},[3089,3094,3099,3104,3108,3112],{"type":29,"tag":63,"props":3090,"children":3091},{"style":76},[3092],{"type":44,"value":3093}," { attribution: {}, instrumentation: ",{"type":29,"tag":63,"props":3095,"children":3096},{"style":117},[3097],{"type":44,"value":3098},"createInstrumentation",{"type":29,"tag":63,"props":3100,"children":3101},{"style":76},[3102],{"type":44,"value":3103},"() } ",{"type":29,"tag":63,"props":3105,"children":3106},{"style":70},[3107],{"type":44,"value":1235},{"type":29,"tag":63,"props":3109,"children":3110},{"style":394},[3111],{"type":44,"value":1583},{"type":29,"tag":63,"props":3113,"children":3114},{"style":76},[3115],{"type":44,"value":857},{"type":29,"tag":63,"props":3117,"children":3118},{"class":65,"line":1164},[3119,3124],{"type":29,"tag":63,"props":3120,"children":3121},{"style":394},[3122],{"type":44,"value":3123}," undefined",{"type":29,"tag":63,"props":3125,"children":3126},{"style":76},[3127],{"type":44,"value":857},{"type":29,"tag":63,"props":3129,"children":3130},{"class":65,"line":1183},[3131],{"type":29,"tag":63,"props":3132,"children":3133},{"style":87},[3134],{"type":44,"value":3135}," \"Playwright\"\n",{"type":29,"tag":63,"props":3137,"children":3138},{"class":65,"line":1215},[3139],{"type":29,"tag":63,"props":3140,"children":3141},{"style":76},[3142],{"type":44,"value":3143}," );\n",{"type":29,"tag":63,"props":3145,"children":3146},{"class":65,"line":1224},[3147,3152,3157,3161],{"type":29,"tag":63,"props":3148,"children":3149},{"style":394},[3150],{"type":44,"value":3151}," this",{"type":29,"tag":63,"props":3153,"children":3154},{"style":76},[3155],{"type":44,"value":3156},".options ",{"type":29,"tag":63,"props":3158,"children":3159},{"style":70},[3160],{"type":44,"value":1258},{"type":29,"tag":63,"props":3162,"children":3163},{"style":76},[3164],{"type":44,"value":3165}," options;\n",{"type":29,"tag":63,"props":3167,"children":3168},{"class":65,"line":1247},[3169,3173,3178,3182,3186,3190,3194,3199],{"type":29,"tag":63,"props":3170,"children":3171},{"style":394},[3172],{"type":44,"value":3151},{"type":29,"tag":63,"props":3174,"children":3175},{"style":76},[3176],{"type":44,"value":3177},".chromium ",{"type":29,"tag":63,"props":3179,"children":3180},{"style":70},[3181],{"type":44,"value":1258},{"type":29,"tag":63,"props":3183,"children":3184},{"style":70},[3185],{"type":44,"value":893},{"type":29,"tag":63,"props":3187,"children":3188},{"style":117},[3189],{"type":44,"value":2882},{"type":29,"tag":63,"props":3191,"children":3192},{"style":76},[3193],{"type":44,"value":238},{"type":29,"tag":63,"props":3195,"children":3196},{"style":394},[3197],{"type":44,"value":3198},"this",{"type":29,"tag":63,"props":3200,"children":3201},{"style":76},[3202],{"type":44,"value":429},{"type":29,"tag":63,"props":3204,"children":3205},{"class":65,"line":1274},[3206,3210,3215,3219,3223,3227,3231,3235],{"type":29,"tag":63,"props":3207,"children":3208},{"style":394},[3209],{"type":44,"value":3151},{"type":29,"tag":63,"props":3211,"children":3212},{"style":76},[3213],{"type":44,"value":3214},".firefox ",{"type":29,"tag":63,"props":3216,"children":3217},{"style":70},[3218],{"type":44,"value":1258},{"type":29,"tag":63,"props":3220,"children":3221},{"style":70},[3222],{"type":44,"value":893},{"type":29,"tag":63,"props":3224,"children":3225},{"style":117},[3226],{"type":44,"value":2957},{"type":29,"tag":63,"props":3228,"children":3229},{"style":76},[3230],{"type":44,"value":238},{"type":29,"tag":63,"props":3232,"children":3233},{"style":394},[3234],{"type":44,"value":3198},{"type":29,"tag":63,"props":3236,"children":3237},{"style":76},[3238],{"type":44,"value":429},{"type":29,"tag":63,"props":3240,"children":3241},{"class":65,"line":1283},[3242,3246,3251,3255,3259,3263,3267,3271],{"type":29,"tag":63,"props":3243,"children":3244},{"style":394},[3245],{"type":44,"value":3151},{"type":29,"tag":63,"props":3247,"children":3248},{"style":76},[3249],{"type":44,"value":3250},".webkit ",{"type":29,"tag":63,"props":3252,"children":3253},{"style":70},[3254],{"type":44,"value":1258},{"type":29,"tag":63,"props":3256,"children":3257},{"style":70},[3258],{"type":44,"value":893},{"type":29,"tag":63,"props":3260,"children":3261},{"style":117},[3262],{"type":44,"value":2982},{"type":29,"tag":63,"props":3264,"children":3265},{"style":76},[3266],{"type":44,"value":238},{"type":29,"tag":63,"props":3268,"children":3269},{"style":394},[3270],{"type":44,"value":3198},{"type":29,"tag":63,"props":3272,"children":3273},{"style":76},[3274],{"type":44,"value":429},{"type":29,"tag":63,"props":3276,"children":3277},{"class":65,"line":1292},[3278,3282,3287,3291,3295,3299],{"type":29,"tag":63,"props":3279,"children":3280},{"style":394},[3281],{"type":44,"value":3151},{"type":29,"tag":63,"props":3283,"children":3284},{"style":76},[3285],{"type":44,"value":3286},".selectors ",{"type":29,"tag":63,"props":3288,"children":3289},{"style":70},[3290],{"type":44,"value":1258},{"type":29,"tag":63,"props":3292,"children":3293},{"style":70},[3294],{"type":44,"value":893},{"type":29,"tag":63,"props":3296,"children":3297},{"style":117},[3298],{"type":44,"value":2857},{"type":29,"tag":63,"props":3300,"children":3301},{"style":76},[3302],{"type":44,"value":939},{"type":29,"tag":63,"props":3304,"children":3305},{"class":65,"line":1317},[3306,3310,3315,3319,3323,3327,3331,3335],{"type":29,"tag":63,"props":3307,"children":3308},{"style":394},[3309],{"type":44,"value":3151},{"type":29,"tag":63,"props":3311,"children":3312},{"style":76},[3313],{"type":44,"value":3314},".debugController ",{"type":29,"tag":63,"props":3316,"children":3317},{"style":70},[3318],{"type":44,"value":1258},{"type":29,"tag":63,"props":3320,"children":3321},{"style":70},[3322],{"type":44,"value":893},{"type":29,"tag":63,"props":3324,"children":3325},{"style":117},[3326],{"type":44,"value":3032},{"type":29,"tag":63,"props":3328,"children":3329},{"style":76},[3330],{"type":44,"value":238},{"type":29,"tag":63,"props":3332,"children":3333},{"style":394},[3334],{"type":44,"value":3198},{"type":29,"tag":63,"props":3336,"children":3337},{"style":76},[3338],{"type":44,"value":429},{"type":29,"tag":63,"props":3340,"children":3341},{"class":65,"line":1326},[3342],{"type":29,"tag":63,"props":3343,"children":3344},{"style":76},[3345],{"type":44,"value":2123},{"type":29,"tag":63,"props":3347,"children":3348},{"class":65,"line":1334},[3349],{"type":29,"tag":63,"props":3350,"children":3351},{"style":76},[3352],{"type":44,"value":257},{"type":29,"tag":30,"props":3354,"children":3355},{},[3356,3358,3364,3366,3371],{"type":44,"value":3357},"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into ",{"type":29,"tag":59,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":44,"value":3363},"packages/playwright-core/server/chromium/",{"type":44,"value":3365}," you will see all the functionality for automating a ",{"type":29,"tag":59,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":44,"value":1801},{"type":44,"value":201},{"type":29,"tag":269,"props":3373,"children":3375},{"id":3374},"rootdispatcher-and-server-side-playwright",[3376],{"type":44,"value":3377},"RootDispatcher and server-side Playwright",{"type":29,"tag":30,"props":3379,"children":3380},{},[3381,3383,3388,3390,3396,3398,3404],{"type":44,"value":3382},"Continuing down ",{"type":29,"tag":59,"props":3384,"children":3386},{"className":3385},[],[3387],{"type":44,"value":504},{"type":44,"value":3389},", we see there's the construction of a ",{"type":29,"tag":59,"props":3391,"children":3393},{"className":3392},[],[3394],{"type":44,"value":3395},"RootDispatcher",{"type":44,"value":3397}," instance, and a ",{"type":29,"tag":59,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":44,"value":3403},"PlaywrightDispatcher",{"type":44,"value":3405}," instance.",{"type":29,"tag":52,"props":3407,"children":3409},{"className":54,"code":3408,"filename":730,"language":56,"meta":7,"style":7},"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n",[3410],{"type":29,"tag":59,"props":3411,"children":3412},{"__ignoreMap":7},[3413,3440,3447,3455],{"type":29,"tag":63,"props":3414,"children":3415},{"class":65,"line":66},[3416,3420,3424,3428,3432,3436],{"type":29,"tag":63,"props":3417,"children":3418},{"style":70},[3419],{"type":44,"value":1842},{"type":29,"tag":63,"props":3421,"children":3422},{"style":394},[3423],{"type":44,"value":1126},{"type":29,"tag":63,"props":3425,"children":3426},{"style":70},[3427],{"type":44,"value":155},{"type":29,"tag":63,"props":3429,"children":3430},{"style":70},[3431],{"type":44,"value":893},{"type":29,"tag":63,"props":3433,"children":3434},{"style":117},[3435],{"type":44,"value":1139},{"type":29,"tag":63,"props":3437,"children":3438},{"style":76},[3439],{"type":44,"value":1144},{"type":29,"tag":63,"props":3441,"children":3442},{"class":65,"line":93},[3443],{"type":29,"tag":63,"props":3444,"children":3445},{"emptyLinePlaceholder":97},[3446],{"type":44,"value":100},{"type":29,"tag":63,"props":3448,"children":3449},{"class":65,"line":103},[3450],{"type":29,"tag":63,"props":3451,"children":3452},{"style":977},[3453],{"type":44,"value":3454},"// Initialize Playwright channel.\n",{"type":29,"tag":63,"props":3456,"children":3457},{"class":65,"line":138},[3458,3463,3467],{"type":29,"tag":63,"props":3459,"children":3460},{"style":70},[3461],{"type":44,"value":3462},"new",{"type":29,"tag":63,"props":3464,"children":3465},{"style":117},[3466],{"type":44,"value":1175},{"type":29,"tag":63,"props":3468,"children":3469},{"style":76},[3470],{"type":44,"value":1180},{"type":29,"tag":30,"props":3472,"children":3473},{},[3474,3476,3482,3484,3489,3491,3496,3498,3503,3505,3510,3512,3517,3519,3524,3526,3531],{"type":44,"value":3475},"Note the ",{"type":29,"tag":59,"props":3477,"children":3479},{"className":3478},[],[3480],{"type":44,"value":3481},"rootScope",{"type":44,"value":3483}," object is referenced throughout the dispatcher classes, and acts as a wrapper around the ",{"type":29,"tag":59,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":44,"value":2605},{"type":44,"value":3490}," object instantiated above, so that each of the child ",{"type":29,"tag":59,"props":3492,"children":3494},{"className":3493},[],[3495],{"type":44,"value":619},{"type":44,"value":3497}," classes will have access to the ",{"type":29,"tag":59,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":44,"value":2605},{"type":44,"value":3504}," through the ",{"type":29,"tag":59,"props":3506,"children":3508},{"className":3507},[],[3509],{"type":44,"value":3481},{"type":44,"value":3511}," object. This wrapping functionality will become clearer when we dive into ",{"type":29,"tag":59,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":44,"value":3403},{"type":44,"value":3518},"'s constructor, where it passes the ",{"type":29,"tag":59,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":44,"value":3481},{"type":44,"value":3525}," to all of the child ",{"type":29,"tag":59,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":44,"value":619},{"type":44,"value":3532}," classes.",{"type":29,"tag":30,"props":3534,"children":3535},{},[3536,3538,3544],{"type":44,"value":3537},"Here's a simplified version of what's happening in the constructor for ",{"type":29,"tag":59,"props":3539,"children":3541},{"className":3540},[],[3542],{"type":44,"value":3543},"Rootscope",{"type":44,"value":761},{"type":29,"tag":52,"props":3546,"children":3549},{"className":54,"code":3547,"filename":3548,"language":56,"meta":7,"style":7},"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\u003CType>\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","playwright-core/src/server/dispatchers/dispatcher.ts",[3550],{"type":29,"tag":59,"props":3551,"children":3552},{"__ignoreMap":7},[3553,3578,3606,3637,3644,3651,3658,3681,3701,3729,3736,3747,3776,3797,3817,3857,3865,3876,3883,3900,3936,3982,3989,4010,4031,4052,4059,4088,4095,4116,4137,4150,4158,4166,4174,4186,4194,4201],{"type":29,"tag":63,"props":3554,"children":3555},{"class":65,"line":66},[3556,3561,3565,3569,3574],{"type":29,"tag":63,"props":3557,"children":3558},{"style":70},[3559],{"type":44,"value":3560},"class",{"type":29,"tag":63,"props":3562,"children":3563},{"style":117},[3564],{"type":44,"value":1139},{"type":29,"tag":63,"props":3566,"children":3567},{"style":70},[3568],{"type":44,"value":1971},{"type":29,"tag":63,"props":3570,"children":3571},{"style":117},[3572],{"type":44,"value":3573}," Dispatcher",{"type":29,"tag":63,"props":3575,"children":3576},{"style":76},[3577],{"type":44,"value":135},{"type":29,"tag":63,"props":3579,"children":3580},{"class":65,"line":93},[3581,3585,3589,3594,3598,3602],{"type":29,"tag":63,"props":3582,"children":3583},{"style":70},[3584],{"type":44,"value":3051},{"type":29,"tag":63,"props":3586,"children":3587},{"style":76},[3588],{"type":44,"value":238},{"type":29,"tag":63,"props":3590,"children":3591},{"style":147},[3592],{"type":44,"value":3593},"connection",{"type":29,"tag":63,"props":3595,"children":3596},{"style":70},[3597],{"type":44,"value":761},{"type":29,"tag":63,"props":3599,"children":3600},{"style":117},[3601],{"type":44,"value":965},{"type":29,"tag":63,"props":3603,"children":3604},{"style":76},[3605],{"type":44,"value":3073},{"type":29,"tag":63,"props":3607,"children":3608},{"class":65,"line":103},[3609,3613,3618,3622,3627,3632],{"type":29,"tag":63,"props":3610,"children":3611},{"style":394},[3612],{"type":44,"value":3081},{"type":29,"tag":63,"props":3614,"children":3615},{"style":76},[3616],{"type":44,"value":3617},"(connection, { guid: ",{"type":29,"tag":63,"props":3619,"children":3620},{"style":87},[3621],{"type":44,"value":1660},{"type":29,"tag":63,"props":3623,"children":3624},{"style":76},[3625],{"type":44,"value":3626}," }, ",{"type":29,"tag":63,"props":3628,"children":3629},{"style":87},[3630],{"type":44,"value":3631},"\"Root\"",{"type":29,"tag":63,"props":3633,"children":3634},{"style":76},[3635],{"type":44,"value":3636},", {});\n",{"type":29,"tag":63,"props":3638,"children":3639},{"class":65,"line":138},[3640],{"type":29,"tag":63,"props":3641,"children":3642},{"style":76},[3643],{"type":44,"value":2123},{"type":29,"tag":63,"props":3645,"children":3646},{"class":65,"line":178},[3647],{"type":29,"tag":63,"props":3648,"children":3649},{"style":76},[3650],{"type":44,"value":257},{"type":29,"tag":63,"props":3652,"children":3653},{"class":65,"line":213},[3654],{"type":29,"tag":63,"props":3655,"children":3656},{"emptyLinePlaceholder":97},[3657],{"type":44,"value":100},{"type":29,"tag":63,"props":3659,"children":3660},{"class":65,"line":251},[3661,3665,3669,3673,3677],{"type":29,"tag":63,"props":3662,"children":3663},{"style":70},[3664],{"type":44,"value":3560},{"type":29,"tag":63,"props":3666,"children":3667},{"style":117},[3668],{"type":44,"value":3573},{"type":29,"tag":63,"props":3670,"children":3671},{"style":70},[3672],{"type":44,"value":1971},{"type":29,"tag":63,"props":3674,"children":3675},{"style":117},[3676],{"type":44,"value":1976},{"type":29,"tag":63,"props":3678,"children":3679},{"style":76},[3680],{"type":44,"value":135},{"type":29,"tag":63,"props":3682,"children":3683},{"class":65,"line":923},[3684,3689,3693,3697],{"type":29,"tag":63,"props":3685,"children":3686},{"style":147},[3687],{"type":44,"value":3688}," _connection",{"type":29,"tag":63,"props":3690,"children":3691},{"style":70},[3692],{"type":44,"value":761},{"type":29,"tag":63,"props":3694,"children":3695},{"style":117},[3696],{"type":44,"value":965},{"type":29,"tag":63,"props":3698,"children":3699},{"style":76},[3700],{"type":44,"value":1244},{"type":29,"tag":63,"props":3702,"children":3703},{"class":65,"line":942},[3704,3709,3713,3717,3721,3725],{"type":29,"tag":63,"props":3705,"children":3706},{"style":147},[3707],{"type":44,"value":3708}," _parent",{"type":29,"tag":63,"props":3710,"children":3711},{"style":70},[3712],{"type":44,"value":761},{"type":29,"tag":63,"props":3714,"children":3715},{"style":117},[3716],{"type":44,"value":965},{"type":29,"tag":63,"props":3718,"children":3719},{"style":70},[3720],{"type":44,"value":832},{"type":29,"tag":63,"props":3722,"children":3723},{"style":394},[3724],{"type":44,"value":837},{"type":29,"tag":63,"props":3726,"children":3727},{"style":76},[3728],{"type":44,"value":1244},{"type":29,"tag":63,"props":3730,"children":3731},{"class":65,"line":987},[3732],{"type":29,"tag":63,"props":3733,"children":3734},{"emptyLinePlaceholder":97},[3735],{"type":44,"value":100},{"type":29,"tag":63,"props":3737,"children":3738},{"class":65,"line":995},[3739,3743],{"type":29,"tag":63,"props":3740,"children":3741},{"style":70},[3742],{"type":44,"value":3051},{"type":29,"tag":63,"props":3744,"children":3745},{"style":76},[3746],{"type":44,"value":1212},{"type":29,"tag":63,"props":3748,"children":3749},{"class":65,"line":1004},[3750,3755,3759,3764,3768,3772],{"type":29,"tag":63,"props":3751,"children":3752},{"style":147},[3753],{"type":44,"value":3754}," parent",{"type":29,"tag":63,"props":3756,"children":3757},{"style":70},[3758],{"type":44,"value":761},{"type":29,"tag":63,"props":3760,"children":3761},{"style":117},[3762],{"type":44,"value":3763}," ParentScopeType",{"type":29,"tag":63,"props":3765,"children":3766},{"style":70},[3767],{"type":44,"value":832},{"type":29,"tag":63,"props":3769,"children":3770},{"style":117},[3771],{"type":44,"value":965},{"type":29,"tag":63,"props":3773,"children":3774},{"style":76},[3775],{"type":44,"value":857},{"type":29,"tag":63,"props":3777,"children":3778},{"class":65,"line":23},[3779,3784,3788,3793],{"type":29,"tag":63,"props":3780,"children":3781},{"style":147},[3782],{"type":44,"value":3783}," object",{"type":29,"tag":63,"props":3785,"children":3786},{"style":70},[3787],{"type":44,"value":761},{"type":29,"tag":63,"props":3789,"children":3790},{"style":117},[3791],{"type":44,"value":3792}," Type",{"type":29,"tag":63,"props":3794,"children":3795},{"style":76},[3796],{"type":44,"value":857},{"type":29,"tag":63,"props":3798,"children":3799},{"class":65,"line":1059},[3800,3805,3809,3813],{"type":29,"tag":63,"props":3801,"children":3802},{"style":147},[3803],{"type":44,"value":3804}," type",{"type":29,"tag":63,"props":3806,"children":3807},{"style":70},[3808],{"type":44,"value":761},{"type":29,"tag":63,"props":3810,"children":3811},{"style":394},[3812],{"type":44,"value":2063},{"type":29,"tag":63,"props":3814,"children":3815},{"style":76},[3816],{"type":44,"value":857},{"type":29,"tag":63,"props":3818,"children":3819},{"class":65,"line":1091},[3820,3825,3829,3834,3838,3843,3847,3852],{"type":29,"tag":63,"props":3821,"children":3822},{"style":147},[3823],{"type":44,"value":3824}," initializer",{"type":29,"tag":63,"props":3826,"children":3827},{"style":70},[3828],{"type":44,"value":761},{"type":29,"tag":63,"props":3830,"children":3831},{"style":117},[3832],{"type":44,"value":3833}," channels",{"type":29,"tag":63,"props":3835,"children":3836},{"style":76},[3837],{"type":44,"value":228},{"type":29,"tag":63,"props":3839,"children":3840},{"style":117},[3841],{"type":44,"value":3842},"InitializerTraits",{"type":29,"tag":63,"props":3844,"children":3845},{"style":76},[3846],{"type":44,"value":2011},{"type":29,"tag":63,"props":3848,"children":3849},{"style":117},[3850],{"type":44,"value":3851},"Type",{"type":29,"tag":63,"props":3853,"children":3854},{"style":76},[3855],{"type":44,"value":3856},">\n",{"type":29,"tag":63,"props":3858,"children":3859},{"class":65,"line":1108},[3860],{"type":29,"tag":63,"props":3861,"children":3862},{"style":76},[3863],{"type":44,"value":3864}," ) {\n",{"type":29,"tag":63,"props":3866,"children":3867},{"class":65,"line":1116},[3868,3872],{"type":29,"tag":63,"props":3869,"children":3870},{"style":394},[3871],{"type":44,"value":3081},{"type":29,"tag":63,"props":3873,"children":3874},{"style":76},[3875],{"type":44,"value":939},{"type":29,"tag":63,"props":3877,"children":3878},{"class":65,"line":1147},[3879],{"type":29,"tag":63,"props":3880,"children":3881},{"emptyLinePlaceholder":97},[3882],{"type":44,"value":100},{"type":29,"tag":63,"props":3884,"children":3885},{"class":65,"line":1155},[3886,3890,3895],{"type":29,"tag":63,"props":3887,"children":3888},{"style":394},[3889],{"type":44,"value":3151},{"type":29,"tag":63,"props":3891,"children":3892},{"style":76},[3893],{"type":44,"value":3894},"._connection ",{"type":29,"tag":63,"props":3896,"children":3897},{"style":70},[3898],{"type":44,"value":3899},"=\n",{"type":29,"tag":63,"props":3901,"children":3902},{"class":65,"line":1164},[3903,3908,3913,3917,3922,3927,3931],{"type":29,"tag":63,"props":3904,"children":3905},{"style":76},[3906],{"type":44,"value":3907}," parent ",{"type":29,"tag":63,"props":3909,"children":3910},{"style":70},[3911],{"type":44,"value":3912},"instanceof",{"type":29,"tag":63,"props":3914,"children":3915},{"style":117},[3916],{"type":44,"value":965},{"type":29,"tag":63,"props":3918,"children":3919},{"style":70},[3920],{"type":44,"value":3921}," ?",{"type":29,"tag":63,"props":3923,"children":3924},{"style":76},[3925],{"type":44,"value":3926}," parent ",{"type":29,"tag":63,"props":3928,"children":3929},{"style":70},[3930],{"type":44,"value":761},{"type":29,"tag":63,"props":3932,"children":3933},{"style":76},[3934],{"type":44,"value":3935}," parent._connection;\n",{"type":29,"tag":63,"props":3937,"children":3938},{"class":65,"line":1183},[3939,3943,3948,3952,3956,3960,3964,3968,3972,3977],{"type":29,"tag":63,"props":3940,"children":3941},{"style":394},[3942],{"type":44,"value":3151},{"type":29,"tag":63,"props":3944,"children":3945},{"style":76},[3946],{"type":44,"value":3947},"._parent ",{"type":29,"tag":63,"props":3949,"children":3950},{"style":70},[3951],{"type":44,"value":1258},{"type":29,"tag":63,"props":3953,"children":3954},{"style":76},[3955],{"type":44,"value":3926},{"type":29,"tag":63,"props":3957,"children":3958},{"style":70},[3959],{"type":44,"value":3912},{"type":29,"tag":63,"props":3961,"children":3962},{"style":117},[3963],{"type":44,"value":965},{"type":29,"tag":63,"props":3965,"children":3966},{"style":70},[3967],{"type":44,"value":3921},{"type":29,"tag":63,"props":3969,"children":3970},{"style":394},[3971],{"type":44,"value":837},{"type":29,"tag":63,"props":3973,"children":3974},{"style":70},[3975],{"type":44,"value":3976}," :",{"type":29,"tag":63,"props":3978,"children":3979},{"style":76},[3980],{"type":44,"value":3981}," parent;\n",{"type":29,"tag":63,"props":3983,"children":3984},{"class":65,"line":1215},[3985],{"type":29,"tag":63,"props":3986,"children":3987},{"emptyLinePlaceholder":97},[3988],{"type":44,"value":100},{"type":29,"tag":63,"props":3990,"children":3991},{"class":65,"line":1224},[3992,3996,4001,4005],{"type":29,"tag":63,"props":3993,"children":3994},{"style":394},[3995],{"type":44,"value":3151},{"type":29,"tag":63,"props":3997,"children":3998},{"style":76},[3999],{"type":44,"value":4000},"._guid ",{"type":29,"tag":63,"props":4002,"children":4003},{"style":70},[4004],{"type":44,"value":1258},{"type":29,"tag":63,"props":4006,"children":4007},{"style":76},[4008],{"type":44,"value":4009}," object.guid;\n",{"type":29,"tag":63,"props":4011,"children":4012},{"class":65,"line":1247},[4013,4017,4022,4026],{"type":29,"tag":63,"props":4014,"children":4015},{"style":394},[4016],{"type":44,"value":3151},{"type":29,"tag":63,"props":4018,"children":4019},{"style":76},[4020],{"type":44,"value":4021},"._type ",{"type":29,"tag":63,"props":4023,"children":4024},{"style":70},[4025],{"type":44,"value":1258},{"type":29,"tag":63,"props":4027,"children":4028},{"style":76},[4029],{"type":44,"value":4030}," type;\n",{"type":29,"tag":63,"props":4032,"children":4033},{"class":65,"line":1274},[4034,4038,4043,4047],{"type":29,"tag":63,"props":4035,"children":4036},{"style":394},[4037],{"type":44,"value":3151},{"type":29,"tag":63,"props":4039,"children":4040},{"style":76},[4041],{"type":44,"value":4042},"._object ",{"type":29,"tag":63,"props":4044,"children":4045},{"style":70},[4046],{"type":44,"value":1258},{"type":29,"tag":63,"props":4048,"children":4049},{"style":76},[4050],{"type":44,"value":4051}," object;\n",{"type":29,"tag":63,"props":4053,"children":4054},{"class":65,"line":1283},[4055],{"type":29,"tag":63,"props":4056,"children":4057},{"emptyLinePlaceholder":97},[4058],{"type":44,"value":100},{"type":29,"tag":63,"props":4060,"children":4061},{"class":65,"line":1292},[4062,4066,4071,4076,4080,4084],{"type":29,"tag":63,"props":4063,"children":4064},{"style":394},[4065],{"type":44,"value":3151},{"type":29,"tag":63,"props":4067,"children":4068},{"style":76},[4069],{"type":44,"value":4070},"._connection.",{"type":29,"tag":63,"props":4072,"children":4073},{"style":117},[4074],{"type":44,"value":4075},"registerDispatcher",{"type":29,"tag":63,"props":4077,"children":4078},{"style":76},[4079],{"type":44,"value":238},{"type":29,"tag":63,"props":4081,"children":4082},{"style":394},[4083],{"type":44,"value":3198},{"type":29,"tag":63,"props":4085,"children":4086},{"style":76},[4087],{"type":44,"value":429},{"type":29,"tag":63,"props":4089,"children":4090},{"class":65,"line":1317},[4091],{"type":29,"tag":63,"props":4092,"children":4093},{"emptyLinePlaceholder":97},[4094],{"type":44,"value":100},{"type":29,"tag":63,"props":4096,"children":4097},{"class":65,"line":1326},[4098,4103,4107,4111],{"type":29,"tag":63,"props":4099,"children":4100},{"style":70},[4101],{"type":44,"value":4102}," if",{"type":29,"tag":63,"props":4104,"children":4105},{"style":76},[4106],{"type":44,"value":1024},{"type":29,"tag":63,"props":4108,"children":4109},{"style":394},[4110],{"type":44,"value":3198},{"type":29,"tag":63,"props":4112,"children":4113},{"style":76},[4114],{"type":44,"value":4115},"._parent)\n",{"type":29,"tag":63,"props":4117,"children":4118},{"class":65,"line":1334},[4119,4124,4128,4133],{"type":29,"tag":63,"props":4120,"children":4121},{"style":394},[4122],{"type":44,"value":4123}," this",{"type":29,"tag":63,"props":4125,"children":4126},{"style":76},[4127],{"type":44,"value":4070},{"type":29,"tag":63,"props":4129,"children":4130},{"style":117},[4131],{"type":44,"value":4132},"sendCreate",{"type":29,"tag":63,"props":4134,"children":4135},{"style":76},[4136],{"type":44,"value":1212},{"type":29,"tag":63,"props":4138,"children":4139},{"class":65,"line":1359},[4140,4145],{"type":29,"tag":63,"props":4141,"children":4142},{"style":394},[4143],{"type":44,"value":4144}," this",{"type":29,"tag":63,"props":4146,"children":4147},{"style":76},[4148],{"type":44,"value":4149},"._parent,\n",{"type":29,"tag":63,"props":4151,"children":4152},{"class":65,"line":1368},[4153],{"type":29,"tag":63,"props":4154,"children":4155},{"style":76},[4156],{"type":44,"value":4157}," type,\n",{"type":29,"tag":63,"props":4159,"children":4160},{"class":65,"line":1376},[4161],{"type":29,"tag":63,"props":4162,"children":4163},{"style":76},[4164],{"type":44,"value":4165}," guid,\n",{"type":29,"tag":63,"props":4167,"children":4168},{"class":65,"line":1402},[4169],{"type":29,"tag":63,"props":4170,"children":4171},{"style":76},[4172],{"type":44,"value":4173}," initializer,\n",{"type":29,"tag":63,"props":4175,"children":4176},{"class":65,"line":1410},[4177,4181],{"type":29,"tag":63,"props":4178,"children":4179},{"style":394},[4180],{"type":44,"value":4144},{"type":29,"tag":63,"props":4182,"children":4183},{"style":76},[4184],{"type":44,"value":4185},"._parent._object\n",{"type":29,"tag":63,"props":4187,"children":4188},{"class":65,"line":1419},[4189],{"type":29,"tag":63,"props":4190,"children":4191},{"style":76},[4192],{"type":44,"value":4193}," );\n",{"type":29,"tag":63,"props":4195,"children":4196},{"class":65,"line":1451},[4197],{"type":29,"tag":63,"props":4198,"children":4199},{"style":76},[4200],{"type":44,"value":2123},{"type":29,"tag":63,"props":4202,"children":4203},{"class":65,"line":1482},[4204],{"type":29,"tag":63,"props":4205,"children":4206},{"style":76},[4207],{"type":44,"value":257},{"type":29,"tag":30,"props":4209,"children":4210},{},[4211,4213,4218,4220,4225,4227,4232,4234,4240,4242,4247,4249,4254,4256,4261,4263,4268,4270,4275,4277,4282,4284,4289,4291,4296],{"type":44,"value":4212},"In the ",{"type":29,"tag":59,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":44,"value":619},{"type":44,"value":4219}," constructor we see the connection always comes from either the inherited parent ",{"type":29,"tag":59,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":44,"value":619},{"type":44,"value":4226},", or from the ",{"type":29,"tag":59,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":44,"value":687},{"type":44,"value":4233}," passed into the ",{"type":29,"tag":59,"props":4235,"children":4237},{"className":4236},[],[4238],{"type":44,"value":4239},"parent",{"type":44,"value":4241}," parameter. This, coupled with ",{"type":29,"tag":59,"props":4243,"children":4245},{"className":4244},[],[4246],{"type":44,"value":3481},{"type":44,"value":4248}," having the name ",{"type":29,"tag":59,"props":4250,"children":4252},{"className":4251},[],[4253],{"type":44,"value":26},{"type":44,"value":4255},", gives us the hint that every dispatcher in the server library will have access to the ",{"type":29,"tag":59,"props":4257,"children":4259},{"className":4258},[],[4260],{"type":44,"value":2605},{"type":44,"value":4262}," instance (from ",{"type":29,"tag":59,"props":4264,"children":4266},{"className":4265},[],[4267],{"type":44,"value":504},{"type":44,"value":4269},"). Furthermore, the ",{"type":29,"tag":59,"props":4271,"children":4273},{"className":4272},[],[4274],{"type":44,"value":2605},{"type":44,"value":4276}," will register every instance of a subclass of ",{"type":29,"tag":59,"props":4278,"children":4280},{"className":4279},[],[4281],{"type":44,"value":619},{"type":44,"value":4283},", hinting that it will communicate with each of the ",{"type":29,"tag":59,"props":4285,"children":4287},{"className":4286},[],[4288],{"type":44,"value":619},{"type":44,"value":4290}," objects. These points will become more clear after looking at the ",{"type":29,"tag":59,"props":4292,"children":4294},{"className":4293},[],[4295],{"type":44,"value":3403},{"type":44,"value":4297},"'s constructor.",{"type":29,"tag":4299,"props":4300,"children":4302},"h4",{"id":4301},"playwrightdispatcher-and-its-constructor",[4303],{"type":44,"value":4304},"PlaywrightDispatcher and its constructor",{"type":29,"tag":30,"props":4306,"children":4307},{},[4308,4310,4315],{"type":44,"value":4309},"Let's look closer at a slightly simplified version of ",{"type":29,"tag":59,"props":4311,"children":4313},{"className":4312},[],[4314],{"type":44,"value":3403},{"type":44,"value":4316},"'s constructor",{"type":29,"tag":52,"props":4318,"children":4321},{"className":54,"code":4319,"filename":4320,"language":56,"meta":7,"style":7},"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts",[4322],{"type":29,"tag":59,"props":4323,"children":4324},{"__ignoreMap":7},[4325,4355,4362,4385,4429,4451,4473,4494,4515,4523,4531,4538],{"type":29,"tag":63,"props":4326,"children":4327},{"class":65,"line":66},[4328,4332,4337,4342,4346,4351],{"type":29,"tag":63,"props":4329,"children":4330},{"style":70},[4331],{"type":44,"value":73},{"type":29,"tag":63,"props":4333,"children":4334},{"style":70},[4335],{"type":44,"value":4336}," type",{"type":29,"tag":63,"props":4338,"children":4339},{"style":76},[4340],{"type":44,"value":4341}," { Playwright } ",{"type":29,"tag":63,"props":4343,"children":4344},{"style":70},[4345],{"type":44,"value":84},{"type":29,"tag":63,"props":4347,"children":4348},{"style":87},[4349],{"type":44,"value":4350}," \"playwright-core/src/server/playwright\"",{"type":29,"tag":63,"props":4352,"children":4353},{"style":76},[4354],{"type":44,"value":1244},{"type":29,"tag":63,"props":4356,"children":4357},{"class":65,"line":93},[4358],{"type":29,"tag":63,"props":4359,"children":4360},{"emptyLinePlaceholder":97},[4361],{"type":44,"value":100},{"type":29,"tag":63,"props":4363,"children":4364},{"class":65,"line":103},[4365,4369,4373,4377,4381],{"type":29,"tag":63,"props":4366,"children":4367},{"style":70},[4368],{"type":44,"value":3560},{"type":29,"tag":63,"props":4370,"children":4371},{"style":117},[4372],{"type":44,"value":1175},{"type":29,"tag":63,"props":4374,"children":4375},{"style":70},[4376],{"type":44,"value":1971},{"type":29,"tag":63,"props":4378,"children":4379},{"style":117},[4380],{"type":44,"value":3573},{"type":29,"tag":63,"props":4382,"children":4383},{"style":76},[4384],{"type":44,"value":135},{"type":29,"tag":63,"props":4386,"children":4387},{"class":65,"line":138},[4388,4392,4396,4401,4405,4409,4413,4417,4421,4425],{"type":29,"tag":63,"props":4389,"children":4390},{"style":70},[4391],{"type":44,"value":3051},{"type":29,"tag":63,"props":4393,"children":4394},{"style":76},[4395],{"type":44,"value":238},{"type":29,"tag":63,"props":4397,"children":4398},{"style":147},[4399],{"type":44,"value":4400},"scope",{"type":29,"tag":63,"props":4402,"children":4403},{"style":70},[4404],{"type":44,"value":761},{"type":29,"tag":63,"props":4406,"children":4407},{"style":117},[4408],{"type":44,"value":1139},{"type":29,"tag":63,"props":4410,"children":4411},{"style":76},[4412],{"type":44,"value":912},{"type":29,"tag":63,"props":4414,"children":4415},{"style":147},[4416],{"type":44,"value":5},{"type":29,"tag":63,"props":4418,"children":4419},{"style":70},[4420],{"type":44,"value":761},{"type":29,"tag":63,"props":4422,"children":4423},{"style":117},[4424],{"type":44,"value":2823},{"type":29,"tag":63,"props":4426,"children":4427},{"style":76},[4428],{"type":44,"value":3073},{"type":29,"tag":63,"props":4430,"children":4431},{"class":65,"line":178},[4432,4436,4441,4446],{"type":29,"tag":63,"props":4433,"children":4434},{"style":394},[4435],{"type":44,"value":3081},{"type":29,"tag":63,"props":4437,"children":4438},{"style":76},[4439],{"type":44,"value":4440},"(scope, playwright, ",{"type":29,"tag":63,"props":4442,"children":4443},{"style":87},[4444],{"type":44,"value":4445},"\"Playwright\"",{"type":29,"tag":63,"props":4447,"children":4448},{"style":76},[4449],{"type":44,"value":4450},", {\n",{"type":29,"tag":63,"props":4452,"children":4453},{"class":65,"line":213},[4454,4459,4463,4468],{"type":29,"tag":63,"props":4455,"children":4456},{"style":76},[4457],{"type":44,"value":4458}," chromium: ",{"type":29,"tag":63,"props":4460,"children":4461},{"style":70},[4462],{"type":44,"value":3462},{"type":29,"tag":63,"props":4464,"children":4465},{"style":117},[4466],{"type":44,"value":4467}," BrowserTypeDispatcher",{"type":29,"tag":63,"props":4469,"children":4470},{"style":76},[4471],{"type":44,"value":4472},"(scope, playwright.chromium),\n",{"type":29,"tag":63,"props":4474,"children":4475},{"class":65,"line":251},[4476,4481,4485,4489],{"type":29,"tag":63,"props":4477,"children":4478},{"style":76},[4479],{"type":44,"value":4480}," firefox: ",{"type":29,"tag":63,"props":4482,"children":4483},{"style":70},[4484],{"type":44,"value":3462},{"type":29,"tag":63,"props":4486,"children":4487},{"style":117},[4488],{"type":44,"value":4467},{"type":29,"tag":63,"props":4490,"children":4491},{"style":76},[4492],{"type":44,"value":4493},"(scope, playwright.firefox),\n",{"type":29,"tag":63,"props":4495,"children":4496},{"class":65,"line":923},[4497,4502,4506,4510],{"type":29,"tag":63,"props":4498,"children":4499},{"style":76},[4500],{"type":44,"value":4501}," webkit: ",{"type":29,"tag":63,"props":4503,"children":4504},{"style":70},[4505],{"type":44,"value":3462},{"type":29,"tag":63,"props":4507,"children":4508},{"style":117},[4509],{"type":44,"value":4467},{"type":29,"tag":63,"props":4511,"children":4512},{"style":76},[4513],{"type":44,"value":4514},"(scope, playwright.webkit),\n",{"type":29,"tag":63,"props":4516,"children":4517},{"class":65,"line":942},[4518],{"type":29,"tag":63,"props":4519,"children":4520},{"style":977},[4521],{"type":44,"value":4522}," // ...\n",{"type":29,"tag":63,"props":4524,"children":4525},{"class":65,"line":987},[4526],{"type":29,"tag":63,"props":4527,"children":4528},{"style":76},[4529],{"type":44,"value":4530}," });\n",{"type":29,"tag":63,"props":4532,"children":4533},{"class":65,"line":995},[4534],{"type":29,"tag":63,"props":4535,"children":4536},{"style":76},[4537],{"type":44,"value":2123},{"type":29,"tag":63,"props":4539,"children":4540},{"class":65,"line":1004},[4541],{"type":29,"tag":63,"props":4542,"children":4543},{"style":76},[4544],{"type":44,"value":257},{"type":29,"tag":30,"props":4546,"children":4547},{},[4548,4550,4556,4558,4563,4565,4570,4572,4577,4579,4584,4586,4592,4594,4600,4602,4608,4610,4615,4617,4622],{"type":44,"value":4549},"Notice the ",{"type":29,"tag":59,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":44,"value":4555},"super",{"type":44,"value":4557}," call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the ",{"type":29,"tag":59,"props":4559,"children":4561},{"className":4560},[],[4562],{"type":44,"value":3481},{"type":44,"value":4564}," from ",{"type":29,"tag":59,"props":4566,"children":4568},{"className":4567},[],[4569],{"type":44,"value":504},{"type":44,"value":4571}," passed into it as the first parameter. Every call to the server will run through the ",{"type":29,"tag":59,"props":4573,"children":4575},{"className":4574},[],[4576],{"type":44,"value":2605},{"type":44,"value":4578}," in the ",{"type":29,"tag":59,"props":4580,"children":4582},{"className":4581},[],[4583],{"type":44,"value":3481},{"type":44,"value":4585},", which then can be traced through calls in each of the dispatcher classes. ",{"type":29,"tag":59,"props":4587,"children":4589},{"className":4588},[],[4590],{"type":44,"value":4591},"BrowserTypeDispatcher",{"type":44,"value":4593}," will launch a ",{"type":29,"tag":59,"props":4595,"children":4597},{"className":4596},[],[4598],{"type":44,"value":4599},"BrowserDispatcher",{"type":44,"value":4601},", which is responsible for creating a ",{"type":29,"tag":59,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":44,"value":4607},"BrowserContextDispatcher",{"type":44,"value":4609},", which can create a ",{"type":29,"tag":59,"props":4611,"children":4613},{"className":4612},[],[4614],{"type":44,"value":664},{"type":44,"value":4616},", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original ",{"type":29,"tag":59,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":44,"value":2605},{"type":44,"value":4623}," defined in the factory method with confidence!",{"type":29,"tag":269,"props":4625,"children":4627},{"id":4626},"tying-back-to-the-onmessage-communication",[4628],{"type":44,"value":4629},"Tying back to the onmessage communication",{"type":29,"tag":30,"props":4631,"children":4632},{},[4633,4635,4640,4641,4647],{"type":44,"value":4634},"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the ",{"type":29,"tag":59,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":44,"value":2628},{"type":44,"value":281},{"type":29,"tag":59,"props":4642,"children":4644},{"className":4643},[],[4645],{"type":44,"value":4646},"clientConnect.onmessage",{"type":44,"value":4648}," functions.",{"type":29,"tag":30,"props":4650,"children":4651},{},[4652,4654,4659,4661,4666,4668,4673,4674,4680,4682,4687,4689,4695,4697,4703,4705,4710,4712,4718,4719,4724,4725,4731,4733,4739,4741,4746,4748,4754,4756,4761],{"type":44,"value":4653},"From within ",{"type":29,"tag":59,"props":4655,"children":4657},{"className":4656},[],[4658],{"type":44,"value":2605},{"type":44,"value":4660}," its ",{"type":29,"tag":59,"props":4662,"children":4664},{"className":4663},[],[4665],{"type":44,"value":2628},{"type":44,"value":4667}," function is called from two main methods. These are ",{"type":29,"tag":59,"props":4669,"children":4671},{"className":4670},[],[4672],{"type":44,"value":1051},{"type":44,"value":281},{"type":29,"tag":59,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":44,"value":4679},"_sendMessageToClient",{"type":44,"value":4681},". The first, ",{"type":29,"tag":59,"props":4683,"children":4685},{"className":4684},[],[4686],{"type":44,"value":1051},{"type":44,"value":4688},", is called from within the ",{"type":29,"tag":59,"props":4690,"children":4692},{"className":4691},[],[4693],{"type":44,"value":4694},"clientConnection.onmessage",{"type":44,"value":4696},", so the ",{"type":29,"tag":59,"props":4698,"children":4700},{"className":4699},[],[4701],{"type":44,"value":4702},"dispatcher.onmessage",{"type":44,"value":4704}," call in that case acts as a response callback. The second, ",{"type":29,"tag":59,"props":4706,"children":4708},{"className":4707},[],[4709],{"type":44,"value":4679},{"type":44,"value":4711},", is called from the ",{"type":29,"tag":59,"props":4713,"children":4715},{"className":4714},[],[4716],{"type":44,"value":4717},"sendEvent",{"type":44,"value":912},{"type":29,"tag":59,"props":4720,"children":4722},{"className":4721},[],[4723],{"type":44,"value":4132},{"type":44,"value":912},{"type":29,"tag":59,"props":4726,"children":4728},{"className":4727},[],[4729],{"type":44,"value":4730},"sendAdopt",{"type":44,"value":4732},", and ",{"type":29,"tag":59,"props":4734,"children":4736},{"className":4735},[],[4737],{"type":44,"value":4738},"sendDestroy",{"type":44,"value":4740}," methods defined within the dispatcher. Calls to these functions are spread throughout the ",{"type":29,"tag":59,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":44,"value":619},{"type":44,"value":4747}," subclasses which call these functions from their internal ",{"type":29,"tag":59,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":44,"value":4753},"_connection",{"type":44,"value":4755}," variable. These will tell the client to construct, update, and destroy, their corresponding client side ",{"type":29,"tag":59,"props":4757,"children":4759},{"className":4758},[],[4760],{"type":44,"value":604},{"type":44,"value":4762}," objects.",{"type":29,"tag":30,"props":4764,"children":4765},{},[4766,4768,4773,4775,4781,4783,4788,4790,4795,4797,4802],{"type":44,"value":4767},"Separately on the client-side, ",{"type":29,"tag":59,"props":4769,"children":4771},{"className":4770},[],[4772],{"type":44,"value":4694},{"type":44,"value":4774}," is called from ",{"type":29,"tag":59,"props":4776,"children":4778},{"className":4777},[],[4779],{"type":44,"value":4780},"sendMessageToServer",{"type":44,"value":4782}," whenever you use a client-side API. This sends a message over to the ",{"type":29,"tag":59,"props":4784,"children":4786},{"className":4785},[],[4787],{"type":44,"value":2605},{"type":44,"value":4789},", which finds the corresponding ",{"type":29,"tag":59,"props":4791,"children":4793},{"className":4792},[],[4794],{"type":44,"value":619},{"type":44,"value":4796}," subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via ",{"type":29,"tag":59,"props":4798,"children":4800},{"className":4799},[],[4801],{"type":44,"value":4679},{"type":44,"value":4803},", as mentioned before.",{"type":29,"tag":269,"props":4805,"children":4807},{"id":4806},"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners",[4808],{"type":44,"value":4809},"Synchronizing objects between the Dispatchers and client-side ChannelOwners",{"type":29,"tag":30,"props":4811,"children":4812},{},[4813,4815,4820,4822,4827,4829,4834,4836,4841,4843,4849],{"type":44,"value":4814},"The ",{"type":29,"tag":59,"props":4816,"children":4818},{"className":4817},[],[4819],{"type":44,"value":4132},{"type":44,"value":4821}," function is special because it is only called from within the ",{"type":29,"tag":59,"props":4823,"children":4825},{"className":4824},[],[4826],{"type":44,"value":619},{"type":44,"value":4828}," constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the ",{"type":29,"tag":59,"props":4830,"children":4832},{"className":4831},[],[4833],{"type":44,"value":4132},{"type":44,"value":4835}," implementation, internally it calls ",{"type":29,"tag":59,"props":4837,"children":4839},{"className":4838},[],[4840],{"type":44,"value":4679},{"type":44,"value":4842}," with the ",{"type":29,"tag":59,"props":4844,"children":4846},{"className":4845},[],[4847],{"type":44,"value":4848},"__create__",{"type":44,"value":4850}," parameter:",{"type":29,"tag":52,"props":4852,"children":4855},{"className":54,"code":4853,"filename":4854,"language":56,"meta":7,"style":7},"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","packages/playwright-core/src/server/dispatchers/dispatcher.ts",[4856],{"type":29,"tag":59,"props":4857,"children":4858},{"__ignoreMap":7},[4859,4881,4925,5015,5046],{"type":29,"tag":63,"props":4860,"children":4861},{"class":65,"line":66},[4862,4866,4871,4876],{"type":29,"tag":63,"props":4863,"children":4864},{"style":117},[4865],{"type":44,"value":4132},{"type":29,"tag":63,"props":4867,"children":4868},{"style":76},[4869],{"type":44,"value":4870},"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject",{"type":29,"tag":63,"props":4872,"children":4873},{"style":70},[4874],{"type":44,"value":4875},"?:",{"type":29,"tag":63,"props":4877,"children":4878},{"style":76},[4879],{"type":44,"value":4880}," SdkObject) {\n",{"type":29,"tag":63,"props":4882,"children":4883},{"class":65,"line":93},[4884,4888,4893,4897,4902,4907,4912,4916,4921],{"type":29,"tag":63,"props":4885,"children":4886},{"style":70},[4887],{"type":44,"value":144},{"type":29,"tag":63,"props":4889,"children":4890},{"style":394},[4891],{"type":44,"value":4892}," validator",{"type":29,"tag":63,"props":4894,"children":4895},{"style":70},[4896],{"type":44,"value":155},{"type":29,"tag":63,"props":4898,"children":4899},{"style":117},[4900],{"type":44,"value":4901}," findValidator",{"type":29,"tag":63,"props":4903,"children":4904},{"style":76},[4905],{"type":44,"value":4906},"(type, ",{"type":29,"tag":63,"props":4908,"children":4909},{"style":87},[4910],{"type":44,"value":4911},"''",{"type":29,"tag":63,"props":4913,"children":4914},{"style":76},[4915],{"type":44,"value":912},{"type":29,"tag":63,"props":4917,"children":4918},{"style":87},[4919],{"type":44,"value":4920},"'Initializer'",{"type":29,"tag":63,"props":4922,"children":4923},{"style":76},[4924],{"type":44,"value":429},{"type":29,"tag":63,"props":4926,"children":4927},{"class":65,"line":103},[4928,4933,4937,4941,4946,4950,4955,4959,4964,4969,4973,4977,4982,4986,4991,4996,5001,5005,5010],{"type":29,"tag":63,"props":4929,"children":4930},{"style":76},[4931],{"type":44,"value":4932}," initializer ",{"type":29,"tag":63,"props":4934,"children":4935},{"style":70},[4936],{"type":44,"value":1258},{"type":29,"tag":63,"props":4938,"children":4939},{"style":117},[4940],{"type":44,"value":4892},{"type":29,"tag":63,"props":4942,"children":4943},{"style":76},[4944],{"type":44,"value":4945},"(initializer, ",{"type":29,"tag":63,"props":4947,"children":4948},{"style":87},[4949],{"type":44,"value":4911},{"type":29,"tag":63,"props":4951,"children":4952},{"style":76},[4953],{"type":44,"value":4954},", { tChannelImpl: ",{"type":29,"tag":63,"props":4956,"children":4957},{"style":394},[4958],{"type":44,"value":3198},{"type":29,"tag":63,"props":4960,"children":4961},{"style":76},[4962],{"type":44,"value":4963},"._tChannelImplToWire.",{"type":29,"tag":63,"props":4965,"children":4966},{"style":117},[4967],{"type":44,"value":4968},"bind",{"type":29,"tag":63,"props":4970,"children":4971},{"style":76},[4972],{"type":44,"value":238},{"type":29,"tag":63,"props":4974,"children":4975},{"style":394},[4976],{"type":44,"value":3198},{"type":29,"tag":63,"props":4978,"children":4979},{"style":76},[4980],{"type":44,"value":4981},"), binary: ",{"type":29,"tag":63,"props":4983,"children":4984},{"style":394},[4985],{"type":44,"value":3198},{"type":29,"tag":63,"props":4987,"children":4988},{"style":76},[4989],{"type":44,"value":4990},"._isLocal ",{"type":29,"tag":63,"props":4992,"children":4993},{"style":70},[4994],{"type":44,"value":4995},"?",{"type":29,"tag":63,"props":4997,"children":4998},{"style":87},[4999],{"type":44,"value":5000}," 'buffer'",{"type":29,"tag":63,"props":5002,"children":5003},{"style":70},[5004],{"type":44,"value":3976},{"type":29,"tag":63,"props":5006,"children":5007},{"style":87},[5008],{"type":44,"value":5009}," 'toBase64'",{"type":29,"tag":63,"props":5011,"children":5012},{"style":76},[5013],{"type":44,"value":5014}," });\n",{"type":29,"tag":63,"props":5016,"children":5017},{"class":65,"line":138},[5018,5023,5027,5031,5036,5041],{"type":29,"tag":63,"props":5019,"children":5020},{"style":394},[5021],{"type":44,"value":5022}," this",{"type":29,"tag":63,"props":5024,"children":5025},{"style":76},[5026],{"type":44,"value":228},{"type":29,"tag":63,"props":5028,"children":5029},{"style":117},[5030],{"type":44,"value":4679},{"type":29,"tag":63,"props":5032,"children":5033},{"style":76},[5034],{"type":44,"value":5035},"(parent._guid, type, ",{"type":29,"tag":63,"props":5037,"children":5038},{"style":87},[5039],{"type":44,"value":5040},"'__create__'",{"type":29,"tag":63,"props":5042,"children":5043},{"style":76},[5044],{"type":44,"value":5045},", { type, initializer, guid }, sdkObject);\n",{"type":29,"tag":63,"props":5047,"children":5048},{"class":65,"line":178},[5049],{"type":29,"tag":63,"props":5050,"children":5051},{"style":76},[5052],{"type":44,"value":257},{"type":29,"tag":30,"props":5054,"children":5055},{},[5056,5058,5063,5065,5070,5072,5078,5080,5085,5087,5092,5094,5099],{"type":44,"value":5057},"so if we search through the ",{"type":29,"tag":59,"props":5059,"children":5061},{"className":5060},[],[5062],{"type":44,"value":679},{"type":44,"value":5064}," class on the client side, sure enough in its ",{"type":29,"tag":59,"props":5066,"children":5068},{"className":5067},[],[5069],{"type":44,"value":1051},{"type":44,"value":5071}," function it has a call to ",{"type":29,"tag":59,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":44,"value":5077},"_createRemoteObject",{"type":44,"value":5079}," for the associated method ",{"type":29,"tag":59,"props":5081,"children":5083},{"className":5082},[],[5084],{"type":44,"value":4848},{"type":44,"value":5086},". This ",{"type":29,"tag":59,"props":5088,"children":5090},{"className":5089},[],[5091],{"type":44,"value":5077},{"type":44,"value":5093}," is what initializes the client-side ",{"type":29,"tag":59,"props":5095,"children":5097},{"className":5096},[],[5098],{"type":44,"value":12},{"type":44,"value":5100}," instance, and is the reason why we call",{"type":29,"tag":52,"props":5102,"children":5104},{"className":54,"code":5103,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n",[5105],{"type":29,"tag":59,"props":5106,"children":5107},{"__ignoreMap":7},[5108],{"type":29,"tag":63,"props":5109,"children":5110},{"class":65,"line":66},[5111,5115,5119,5123,5127,5131,5135,5139],{"type":29,"tag":63,"props":5112,"children":5113},{"style":70},[5114],{"type":44,"value":1842},{"type":29,"tag":63,"props":5116,"children":5117},{"style":394},[5118],{"type":44,"value":1193},{"type":29,"tag":63,"props":5120,"children":5121},{"style":70},[5122],{"type":44,"value":155},{"type":29,"tag":63,"props":5124,"children":5125},{"style":76},[5126],{"type":44,"value":1202},{"type":29,"tag":63,"props":5128,"children":5129},{"style":117},[5130],{"type":44,"value":1207},{"type":29,"tag":63,"props":5132,"children":5133},{"style":76},[5134],{"type":44,"value":238},{"type":29,"tag":63,"props":5136,"children":5137},{"style":87},[5138],{"type":44,"value":4445},{"type":29,"tag":63,"props":5140,"children":5141},{"style":76},[5142],{"type":44,"value":429},{"type":29,"tag":30,"props":5144,"children":5145},{},[5146,5148,5153,5155,5161],{"type":44,"value":5147},"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the ",{"type":29,"tag":59,"props":5149,"children":5151},{"className":5150},[],[5152],{"type":44,"value":2605},{"type":44,"value":5154}," over to the ",{"type":29,"tag":59,"props":5156,"children":5158},{"className":5157},[],[5159],{"type":44,"value":5160},"clientConnection",{"type":44,"value":5162},". For the Playwright create message, the message looks something like",{"type":29,"tag":52,"props":5164,"children":5166},{"className":54,"code":5165,"language":56,"meta":7,"style":7},"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n",[5167],{"type":29,"tag":59,"props":5168,"children":5169},{"__ignoreMap":7},[5170,5178,5199,5219,5232,5252,5263,5294,5323,5352,5381,5410,5418,5435,5442],{"type":29,"tag":63,"props":5171,"children":5172},{"class":65,"line":66},[5173],{"type":29,"tag":63,"props":5174,"children":5175},{"style":76},[5176],{"type":44,"value":5177},"{\n",{"type":29,"tag":63,"props":5179,"children":5180},{"class":65,"line":93},[5181,5186,5191,5195],{"type":29,"tag":63,"props":5182,"children":5183},{"style":117},[5184],{"type":44,"value":5185}," guid",{"type":29,"tag":63,"props":5187,"children":5188},{"style":76},[5189],{"type":44,"value":5190},": ",{"type":29,"tag":63,"props":5192,"children":5193},{"style":87},[5194],{"type":44,"value":4911},{"type":29,"tag":63,"props":5196,"children":5197},{"style":76},[5198],{"type":44,"value":857},{"type":29,"tag":63,"props":5200,"children":5201},{"class":65,"line":103},[5202,5207,5211,5215],{"type":29,"tag":63,"props":5203,"children":5204},{"style":117},[5205],{"type":44,"value":5206}," method",{"type":29,"tag":63,"props":5208,"children":5209},{"style":76},[5210],{"type":44,"value":5190},{"type":29,"tag":63,"props":5212,"children":5213},{"style":87},[5214],{"type":44,"value":5040},{"type":29,"tag":63,"props":5216,"children":5217},{"style":76},[5218],{"type":44,"value":857},{"type":29,"tag":63,"props":5220,"children":5221},{"class":65,"line":138},[5222,5227],{"type":29,"tag":63,"props":5223,"children":5224},{"style":117},[5225],{"type":44,"value":5226}," params",{"type":29,"tag":63,"props":5228,"children":5229},{"style":76},[5230],{"type":44,"value":5231},": {\n",{"type":29,"tag":63,"props":5233,"children":5234},{"class":65,"line":178},[5235,5239,5243,5248],{"type":29,"tag":63,"props":5236,"children":5237},{"style":117},[5238],{"type":44,"value":3804},{"type":29,"tag":63,"props":5240,"children":5241},{"style":76},[5242],{"type":44,"value":5190},{"type":29,"tag":63,"props":5244,"children":5245},{"style":87},[5246],{"type":44,"value":5247},"'Playwright'",{"type":29,"tag":63,"props":5249,"children":5250},{"style":76},[5251],{"type":44,"value":857},{"type":29,"tag":63,"props":5253,"children":5254},{"class":65,"line":213},[5255,5259],{"type":29,"tag":63,"props":5256,"children":5257},{"style":117},[5258],{"type":44,"value":3824},{"type":29,"tag":63,"props":5260,"children":5261},{"style":76},[5262],{"type":44,"value":5231},{"type":29,"tag":63,"props":5264,"children":5265},{"class":65,"line":251},[5266,5271,5276,5280,5284,5289],{"type":29,"tag":63,"props":5267,"children":5268},{"style":117},[5269],{"type":44,"value":5270}," chromium",{"type":29,"tag":63,"props":5272,"children":5273},{"style":76},[5274],{"type":44,"value":5275},": { ",{"type":29,"tag":63,"props":5277,"children":5278},{"style":117},[5279],{"type":44,"value":2054},{"type":29,"tag":63,"props":5281,"children":5282},{"style":76},[5283],{"type":44,"value":5190},{"type":29,"tag":63,"props":5285,"children":5286},{"style":87},[5287],{"type":44,"value":5288},"'browser-type@024d5a494527ece580841844a9a933a6'",{"type":29,"tag":63,"props":5290,"children":5291},{"style":76},[5292],{"type":44,"value":5293}," },\n",{"type":29,"tag":63,"props":5295,"children":5296},{"class":65,"line":923},[5297,5302,5306,5310,5314,5319],{"type":29,"tag":63,"props":5298,"children":5299},{"style":117},[5300],{"type":44,"value":5301}," firefox",{"type":29,"tag":63,"props":5303,"children":5304},{"style":76},[5305],{"type":44,"value":5275},{"type":29,"tag":63,"props":5307,"children":5308},{"style":117},[5309],{"type":44,"value":2054},{"type":29,"tag":63,"props":5311,"children":5312},{"style":76},[5313],{"type":44,"value":5190},{"type":29,"tag":63,"props":5315,"children":5316},{"style":87},[5317],{"type":44,"value":5318},"'browser-type@fae8f48651c02682ad3b276f0a046d63'",{"type":29,"tag":63,"props":5320,"children":5321},{"style":76},[5322],{"type":44,"value":5293},{"type":29,"tag":63,"props":5324,"children":5325},{"class":65,"line":942},[5326,5331,5335,5339,5343,5348],{"type":29,"tag":63,"props":5327,"children":5328},{"style":117},[5329],{"type":44,"value":5330}," webkit",{"type":29,"tag":63,"props":5332,"children":5333},{"style":76},[5334],{"type":44,"value":5275},{"type":29,"tag":63,"props":5336,"children":5337},{"style":117},[5338],{"type":44,"value":2054},{"type":29,"tag":63,"props":5340,"children":5341},{"style":76},[5342],{"type":44,"value":5190},{"type":29,"tag":63,"props":5344,"children":5345},{"style":87},[5346],{"type":44,"value":5347},"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'",{"type":29,"tag":63,"props":5349,"children":5350},{"style":76},[5351],{"type":44,"value":5293},{"type":29,"tag":63,"props":5353,"children":5354},{"class":65,"line":987},[5355,5360,5364,5368,5372,5377],{"type":29,"tag":63,"props":5356,"children":5357},{"style":117},[5358],{"type":44,"value":5359}," android",{"type":29,"tag":63,"props":5361,"children":5362},{"style":76},[5363],{"type":44,"value":5275},{"type":29,"tag":63,"props":5365,"children":5366},{"style":117},[5367],{"type":44,"value":2054},{"type":29,"tag":63,"props":5369,"children":5370},{"style":76},[5371],{"type":44,"value":5190},{"type":29,"tag":63,"props":5373,"children":5374},{"style":87},[5375],{"type":44,"value":5376},"'android@832582c466c24c6933d3a5587059e1be'",{"type":29,"tag":63,"props":5378,"children":5379},{"style":76},[5380],{"type":44,"value":5293},{"type":29,"tag":63,"props":5382,"children":5383},{"class":65,"line":995},[5384,5389,5393,5397,5401,5406],{"type":29,"tag":63,"props":5385,"children":5386},{"style":117},[5387],{"type":44,"value":5388}," electron",{"type":29,"tag":63,"props":5390,"children":5391},{"style":76},[5392],{"type":44,"value":5275},{"type":29,"tag":63,"props":5394,"children":5395},{"style":117},[5396],{"type":44,"value":2054},{"type":29,"tag":63,"props":5398,"children":5399},{"style":76},[5400],{"type":44,"value":5190},{"type":29,"tag":63,"props":5402,"children":5403},{"style":87},[5404],{"type":44,"value":5405},"'electron@3829a7608477101154e15c1e25bca9ca'",{"type":29,"tag":63,"props":5407,"children":5408},{"style":76},[5409],{"type":44,"value":5293},{"type":29,"tag":63,"props":5411,"children":5412},{"class":65,"line":1004},[5413],{"type":29,"tag":63,"props":5414,"children":5415},{"style":76},[5416],{"type":44,"value":5417}," },\n",{"type":29,"tag":63,"props":5419,"children":5420},{"class":65,"line":23},[5421,5426,5430],{"type":29,"tag":63,"props":5422,"children":5423},{"style":117},[5424],{"type":44,"value":5425}," guid",{"type":29,"tag":63,"props":5427,"children":5428},{"style":76},[5429],{"type":44,"value":5190},{"type":29,"tag":63,"props":5431,"children":5432},{"style":87},[5433],{"type":44,"value":5434},"'Playwright'\n",{"type":29,"tag":63,"props":5436,"children":5437},{"class":65,"line":1059},[5438],{"type":29,"tag":63,"props":5439,"children":5440},{"style":76},[5441],{"type":44,"value":2123},{"type":29,"tag":63,"props":5443,"children":5444},{"class":65,"line":1091},[5445],{"type":29,"tag":63,"props":5446,"children":5447},{"style":76},[5448],{"type":44,"value":257},{"type":29,"tag":30,"props":5450,"children":5451},{},[5452,5454,5459,5461,5466,5468,5474,5476,5481,5482,5488,5490,5495,5497,5502],{"type":44,"value":5453},"Note before this ",{"type":29,"tag":59,"props":5455,"children":5457},{"className":5456},[],[5458],{"type":44,"value":4132},{"type":44,"value":5460}," message is passed to create the Playwright API on the client side, there were ",{"type":29,"tag":59,"props":5462,"children":5464},{"className":5463},[],[5465],{"type":44,"value":4132},{"type":44,"value":5467}," messages for each of the device types, meaning there already exists a client-side ",{"type":29,"tag":59,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":44,"value":5473},"BrowserType",{"type":44,"value":5475}," for ",{"type":29,"tag":59,"props":5477,"children":5479},{"className":5478},[],[5480],{"type":44,"value":1801},{"type":44,"value":912},{"type":29,"tag":59,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":44,"value":5487},"firefox",{"type":44,"value":5489},", etc. before the ",{"type":29,"tag":59,"props":5491,"children":5493},{"className":5492},[],[5494],{"type":44,"value":4848},{"type":44,"value":5496}," message for ",{"type":29,"tag":59,"props":5498,"children":5500},{"className":5499},[],[5501],{"type":44,"value":12},{"type":44,"value":5503}," is sent.",{"type":29,"tag":30,"props":5505,"children":5506},{},[5507,5508,5513,5515,5520,5522,5527,5529,5535],{"type":44,"value":4814},{"type":29,"tag":59,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":44,"value":5160},{"type":44,"value":5514}," constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ",{"type":29,"tag":59,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":44,"value":604},{"type":44,"value":5521}," class, which is a concept for a later section. For now, let's trace what happens in the ",{"type":29,"tag":59,"props":5523,"children":5525},{"className":5524},[],[5526],{"type":44,"value":5160},{"type":44,"value":5528}," for the ",{"type":29,"tag":59,"props":5530,"children":5532},{"className":5531},[],[5533],{"type":44,"value":5534},"type: 'Playwright'",{"type":44,"value":5536}," message.",{"type":29,"tag":30,"props":5538,"children":5539},{},[5540,5541,5546,5548,5554,5556,5561,5563,5569],{"type":44,"value":4814},{"type":29,"tag":59,"props":5542,"children":5544},{"className":5543},[],[5545],{"type":44,"value":4132},{"type":44,"value":5547}," function calls ",{"type":29,"tag":59,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":44,"value":5553},"dispatchConnection.onmessage",{"type":44,"value":5555},", which calls the ",{"type":29,"tag":59,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":44,"value":2613},{"type":44,"value":5562}," function, which then calls the ",{"type":29,"tag":59,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":44,"value":5568},"clientConnection._createRemoteObject",{"type":44,"value":5570}," function with the following parameters",{"type":29,"tag":52,"props":5572,"children":5574},{"className":54,"code":5573,"filename":1946,"language":56,"meta":7,"style":7},"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n",[5575],{"type":29,"tag":59,"props":5576,"children":5577},{"__ignoreMap":7},[5578,5597,5614,5631,5647,5655,5663,5680,5697,5714,5731,5748,5755],{"type":29,"tag":63,"props":5579,"children":5580},{"class":65,"line":66},[5581,5585,5589,5593],{"type":29,"tag":63,"props":5582,"children":5583},{"style":394},[5584],{"type":44,"value":3198},{"type":29,"tag":63,"props":5586,"children":5587},{"style":76},[5588],{"type":44,"value":228},{"type":29,"tag":63,"props":5590,"children":5591},{"style":117},[5592],{"type":44,"value":5077},{"type":29,"tag":63,"props":5594,"children":5595},{"style":76},[5596],{"type":44,"value":1212},{"type":29,"tag":63,"props":5598,"children":5599},{"class":65,"line":93},[5600,5605,5609],{"type":29,"tag":63,"props":5601,"children":5602},{"style":87},[5603],{"type":44,"value":5604}," \"\"",{"type":29,"tag":63,"props":5606,"children":5607},{"style":76},[5608],{"type":44,"value":912},{"type":29,"tag":63,"props":5610,"children":5611},{"style":977},[5612],{"type":44,"value":5613},"// parentGuid - corresponds to Root, the root ChannelOwner\n",{"type":29,"tag":63,"props":5615,"children":5616},{"class":65,"line":103},[5617,5622,5626],{"type":29,"tag":63,"props":5618,"children":5619},{"style":87},[5620],{"type":44,"value":5621}," \"Playwright\"",{"type":29,"tag":63,"props":5623,"children":5624},{"style":76},[5625],{"type":44,"value":912},{"type":29,"tag":63,"props":5627,"children":5628},{"style":977},[5629],{"type":44,"value":5630},"// type\n",{"type":29,"tag":63,"props":5632,"children":5633},{"class":65,"line":138},[5634,5638,5642],{"type":29,"tag":63,"props":5635,"children":5636},{"style":87},[5637],{"type":44,"value":5621},{"type":29,"tag":63,"props":5639,"children":5640},{"style":76},[5641],{"type":44,"value":912},{"type":29,"tag":63,"props":5643,"children":5644},{"style":977},[5645],{"type":44,"value":5646},"// guid\n",{"type":29,"tag":63,"props":5648,"children":5649},{"class":65,"line":178},[5650],{"type":29,"tag":63,"props":5651,"children":5652},{"style":76},[5653],{"type":44,"value":5654}," {\n",{"type":29,"tag":63,"props":5656,"children":5657},{"class":65,"line":213},[5658],{"type":29,"tag":63,"props":5659,"children":5660},{"style":977},[5661],{"type":44,"value":5662}," // initializer\n",{"type":29,"tag":63,"props":5664,"children":5665},{"class":65,"line":251},[5666,5671,5676],{"type":29,"tag":63,"props":5667,"children":5668},{"style":76},[5669],{"type":44,"value":5670}," chromium: { guid: ",{"type":29,"tag":63,"props":5672,"children":5673},{"style":87},[5674],{"type":44,"value":5675},"\"browser-type@024d5a494527ece580841844a9a933a6\"",{"type":29,"tag":63,"props":5677,"children":5678},{"style":76},[5679],{"type":44,"value":5293},{"type":29,"tag":63,"props":5681,"children":5682},{"class":65,"line":923},[5683,5688,5693],{"type":29,"tag":63,"props":5684,"children":5685},{"style":76},[5686],{"type":44,"value":5687}," firefox: { guid: ",{"type":29,"tag":63,"props":5689,"children":5690},{"style":87},[5691],{"type":44,"value":5692},"\"browser-type@fae8f48651c02682ad3b276f0a046d63\"",{"type":29,"tag":63,"props":5694,"children":5695},{"style":76},[5696],{"type":44,"value":5293},{"type":29,"tag":63,"props":5698,"children":5699},{"class":65,"line":942},[5700,5705,5710],{"type":29,"tag":63,"props":5701,"children":5702},{"style":76},[5703],{"type":44,"value":5704}," webkit: { guid: ",{"type":29,"tag":63,"props":5706,"children":5707},{"style":87},[5708],{"type":44,"value":5709},"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\"",{"type":29,"tag":63,"props":5711,"children":5712},{"style":76},[5713],{"type":44,"value":5293},{"type":29,"tag":63,"props":5715,"children":5716},{"class":65,"line":987},[5717,5722,5727],{"type":29,"tag":63,"props":5718,"children":5719},{"style":76},[5720],{"type":44,"value":5721}," android: { guid: ",{"type":29,"tag":63,"props":5723,"children":5724},{"style":87},[5725],{"type":44,"value":5726},"\"android@832582c466c24c6933d3a5587059e1be\"",{"type":29,"tag":63,"props":5728,"children":5729},{"style":76},[5730],{"type":44,"value":5293},{"type":29,"tag":63,"props":5732,"children":5733},{"class":65,"line":995},[5734,5739,5744],{"type":29,"tag":63,"props":5735,"children":5736},{"style":76},[5737],{"type":44,"value":5738}," electron: { guid: ",{"type":29,"tag":63,"props":5740,"children":5741},{"style":87},[5742],{"type":44,"value":5743},"\"electron@3829a7608477101154e15c1e25bca9ca\"",{"type":29,"tag":63,"props":5745,"children":5746},{"style":76},[5747],{"type":44,"value":5293},{"type":29,"tag":63,"props":5749,"children":5750},{"class":65,"line":1004},[5751],{"type":29,"tag":63,"props":5752,"children":5753},{"style":76},[5754],{"type":44,"value":2123},{"type":29,"tag":63,"props":5756,"children":5757},{"class":65,"line":23},[5758],{"type":29,"tag":63,"props":5759,"children":5760},{"style":76},[5761],{"type":44,"value":429},{"type":29,"tag":30,"props":5763,"children":5764},{},[5765,5766,5771,5773,5779],{"type":44,"value":4212},{"type":29,"tag":59,"props":5767,"children":5769},{"className":5768},[],[5770],{"type":44,"value":5568},{"type":44,"value":5772}," function there is a transformation of the data and then a large ",{"type":29,"tag":59,"props":5774,"children":5776},{"className":5775},[],[5777],{"type":44,"value":5778},"switch-case",{"type":44,"value":5780}," function instantiating the corresponding client class.",{"type":29,"tag":52,"props":5782,"children":5784},{"className":54,"code":5783,"filename":1946,"language":56,"meta":7,"style":7},"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner\u003Cany>;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n",[5785],{"type":29,"tag":59,"props":5786,"children":5787},{"__ignoreMap":7},[5788,5800,5838,5859,5908,5944,5983,6002,6010,6022,6030,6064,6098,6106,6113,6126,6134,6152,6177,6189,6196,6203,6215],{"type":29,"tag":63,"props":5789,"children":5790},{"class":65,"line":66},[5791,5795],{"type":29,"tag":63,"props":5792,"children":5793},{"style":117},[5794],{"type":44,"value":5077},{"type":29,"tag":63,"props":5796,"children":5797},{"style":76},[5798],{"type":44,"value":5799},"(parentGuid: string, type: string, guid: string, initializer: any) {\n",{"type":29,"tag":63,"props":5801,"children":5802},{"class":65,"line":93},[5803,5807,5812,5816,5820,5824,5828,5833],{"type":29,"tag":63,"props":5804,"children":5805},{"style":70},[5806],{"type":44,"value":144},{"type":29,"tag":63,"props":5808,"children":5809},{"style":394},[5810],{"type":44,"value":5811}," parent",{"type":29,"tag":63,"props":5813,"children":5814},{"style":70},[5815],{"type":44,"value":155},{"type":29,"tag":63,"props":5817,"children":5818},{"style":394},[5819],{"type":44,"value":2093},{"type":29,"tag":63,"props":5821,"children":5822},{"style":76},[5823],{"type":44,"value":2098},{"type":29,"tag":63,"props":5825,"children":5826},{"style":117},[5827],{"type":44,"value":1619},{"type":29,"tag":63,"props":5829,"children":5830},{"style":76},[5831],{"type":44,"value":5832},"(parentGuid); ",{"type":29,"tag":63,"props":5834,"children":5835},{"style":977},[5836],{"type":44,"value":5837},"// here the parentGuid is ''\n",{"type":29,"tag":63,"props":5839,"children":5840},{"class":65,"line":103},[5841,5846,5850,5854],{"type":29,"tag":63,"props":5842,"children":5843},{"style":70},[5844],{"type":44,"value":5845}," if",{"type":29,"tag":63,"props":5847,"children":5848},{"style":76},[5849],{"type":44,"value":1024},{"type":29,"tag":63,"props":5851,"children":5852},{"style":70},[5853],{"type":44,"value":1629},{"type":29,"tag":63,"props":5855,"children":5856},{"style":76},[5857],{"type":44,"value":5858},"parent)\n",{"type":29,"tag":63,"props":5860,"children":5861},{"class":65,"line":138},[5862,5867,5871,5876,5880,5885,5890,5895,5899,5904],{"type":29,"tag":63,"props":5863,"children":5864},{"style":70},[5865],{"type":44,"value":5866}," throw",{"type":29,"tag":63,"props":5868,"children":5869},{"style":70},[5870],{"type":44,"value":893},{"type":29,"tag":63,"props":5872,"children":5873},{"style":117},[5874],{"type":44,"value":5875}," Error",{"type":29,"tag":63,"props":5877,"children":5878},{"style":76},[5879],{"type":44,"value":238},{"type":29,"tag":63,"props":5881,"children":5882},{"style":87},[5883],{"type":44,"value":5884},"`Cannot find parent object ${",{"type":29,"tag":63,"props":5886,"children":5887},{"style":76},[5888],{"type":44,"value":5889},"parentGuid",{"type":29,"tag":63,"props":5891,"children":5892},{"style":87},[5893],{"type":44,"value":5894},"} to create ${",{"type":29,"tag":63,"props":5896,"children":5897},{"style":76},[5898],{"type":44,"value":2054},{"type":29,"tag":63,"props":5900,"children":5901},{"style":87},[5902],{"type":44,"value":5903},"}`",{"type":29,"tag":63,"props":5905,"children":5906},{"style":76},[5907],{"type":44,"value":429},{"type":29,"tag":63,"props":5909,"children":5910},{"class":65,"line":178},[5911,5916,5921,5925,5930,5934,5939],{"type":29,"tag":63,"props":5912,"children":5913},{"style":70},[5914],{"type":44,"value":5915}," let",{"type":29,"tag":63,"props":5917,"children":5918},{"style":76},[5919],{"type":44,"value":5920}," result",{"type":29,"tag":63,"props":5922,"children":5923},{"style":70},[5924],{"type":44,"value":761},{"type":29,"tag":63,"props":5926,"children":5927},{"style":117},[5928],{"type":44,"value":5929}," ChannelOwner",{"type":29,"tag":63,"props":5931,"children":5932},{"style":76},[5933],{"type":44,"value":2011},{"type":29,"tag":63,"props":5935,"children":5936},{"style":394},[5937],{"type":44,"value":5938},"any",{"type":29,"tag":63,"props":5940,"children":5941},{"style":76},[5942],{"type":44,"value":5943},">;\n",{"type":29,"tag":63,"props":5945,"children":5946},{"class":65,"line":213},[5947,5951,5955,5959,5963,5967,5971,5975,5979],{"type":29,"tag":63,"props":5948,"children":5949},{"style":70},[5950],{"type":44,"value":144},{"type":29,"tag":63,"props":5952,"children":5953},{"style":394},[5954],{"type":44,"value":4892},{"type":29,"tag":63,"props":5956,"children":5957},{"style":70},[5958],{"type":44,"value":155},{"type":29,"tag":63,"props":5960,"children":5961},{"style":117},[5962],{"type":44,"value":4901},{"type":29,"tag":63,"props":5964,"children":5965},{"style":76},[5966],{"type":44,"value":4906},{"type":29,"tag":63,"props":5968,"children":5969},{"style":87},[5970],{"type":44,"value":4911},{"type":29,"tag":63,"props":5972,"children":5973},{"style":76},[5974],{"type":44,"value":912},{"type":29,"tag":63,"props":5976,"children":5977},{"style":87},[5978],{"type":44,"value":4920},{"type":29,"tag":63,"props":5980,"children":5981},{"style":76},[5982],{"type":44,"value":429},{"type":29,"tag":63,"props":5984,"children":5985},{"class":65,"line":251},[5986,5990,5994,5998],{"type":29,"tag":63,"props":5987,"children":5988},{"style":76},[5989],{"type":44,"value":4932},{"type":29,"tag":63,"props":5991,"children":5992},{"style":70},[5993],{"type":44,"value":1258},{"type":29,"tag":63,"props":5995,"children":5996},{"style":117},[5997],{"type":44,"value":4892},{"type":29,"tag":63,"props":5999,"children":6000},{"style":76},[6001],{"type":44,"value":1212},{"type":29,"tag":63,"props":6003,"children":6004},{"class":65,"line":923},[6005],{"type":29,"tag":63,"props":6006,"children":6007},{"style":76},[6008],{"type":44,"value":6009}," initializer,\n",{"type":29,"tag":63,"props":6011,"children":6012},{"class":65,"line":942},[6013,6018],{"type":29,"tag":63,"props":6014,"children":6015},{"style":87},[6016],{"type":44,"value":6017}," ''",{"type":29,"tag":63,"props":6019,"children":6020},{"style":76},[6021],{"type":44,"value":857},{"type":29,"tag":63,"props":6023,"children":6024},{"class":65,"line":987},[6025],{"type":29,"tag":63,"props":6026,"children":6027},{"style":76},[6028],{"type":44,"value":6029}," {\n",{"type":29,"tag":63,"props":6031,"children":6032},{"class":65,"line":995},[6033,6038,6042,6047,6051,6055,6059],{"type":29,"tag":63,"props":6034,"children":6035},{"style":76},[6036],{"type":44,"value":6037}," tChannelImpl: ",{"type":29,"tag":63,"props":6039,"children":6040},{"style":394},[6041],{"type":44,"value":3198},{"type":29,"tag":63,"props":6043,"children":6044},{"style":76},[6045],{"type":44,"value":6046},"._tChannelImplFromWire.",{"type":29,"tag":63,"props":6048,"children":6049},{"style":117},[6050],{"type":44,"value":4968},{"type":29,"tag":63,"props":6052,"children":6053},{"style":76},[6054],{"type":44,"value":238},{"type":29,"tag":63,"props":6056,"children":6057},{"style":394},[6058],{"type":44,"value":3198},{"type":29,"tag":63,"props":6060,"children":6061},{"style":76},[6062],{"type":44,"value":6063},"),\n",{"type":29,"tag":63,"props":6065,"children":6066},{"class":65,"line":1004},[6067,6072,6076,6081,6085,6089,6093],{"type":29,"tag":63,"props":6068,"children":6069},{"style":76},[6070],{"type":44,"value":6071}," binary: ",{"type":29,"tag":63,"props":6073,"children":6074},{"style":394},[6075],{"type":44,"value":3198},{"type":29,"tag":63,"props":6077,"children":6078},{"style":76},[6079],{"type":44,"value":6080},"._rawBuffers ",{"type":29,"tag":63,"props":6082,"children":6083},{"style":70},[6084],{"type":44,"value":4995},{"type":29,"tag":63,"props":6086,"children":6087},{"style":87},[6088],{"type":44,"value":5000},{"type":29,"tag":63,"props":6090,"children":6091},{"style":70},[6092],{"type":44,"value":3976},{"type":29,"tag":63,"props":6094,"children":6095},{"style":87},[6096],{"type":44,"value":6097}," 'fromBase64'\n",{"type":29,"tag":63,"props":6099,"children":6100},{"class":65,"line":23},[6101],{"type":29,"tag":63,"props":6102,"children":6103},{"style":76},[6104],{"type":44,"value":6105}," }\n",{"type":29,"tag":63,"props":6107,"children":6108},{"class":65,"line":1059},[6109],{"type":29,"tag":63,"props":6110,"children":6111},{"style":76},[6112],{"type":44,"value":1289},{"type":29,"tag":63,"props":6114,"children":6115},{"class":65,"line":1091},[6116,6121],{"type":29,"tag":63,"props":6117,"children":6118},{"style":70},[6119],{"type":44,"value":6120}," switch",{"type":29,"tag":63,"props":6122,"children":6123},{"style":76},[6124],{"type":44,"value":6125}," (type) {\n",{"type":29,"tag":63,"props":6127,"children":6128},{"class":65,"line":1108},[6129],{"type":29,"tag":63,"props":6130,"children":6131},{"style":977},[6132],{"type":44,"value":6133}," // ...\n",{"type":29,"tag":63,"props":6135,"children":6136},{"class":65,"line":1116},[6137,6142,6147],{"type":29,"tag":63,"props":6138,"children":6139},{"style":70},[6140],{"type":44,"value":6141}," case",{"type":29,"tag":63,"props":6143,"children":6144},{"style":87},[6145],{"type":44,"value":6146}," 'Playwright'",{"type":29,"tag":63,"props":6148,"children":6149},{"style":76},[6150],{"type":44,"value":6151},":\n",{"type":29,"tag":63,"props":6153,"children":6154},{"class":65,"line":1147},[6155,6160,6164,6168,6172],{"type":29,"tag":63,"props":6156,"children":6157},{"style":76},[6158],{"type":44,"value":6159}," result ",{"type":29,"tag":63,"props":6161,"children":6162},{"style":70},[6163],{"type":44,"value":1258},{"type":29,"tag":63,"props":6165,"children":6166},{"style":70},[6167],{"type":44,"value":893},{"type":29,"tag":63,"props":6169,"children":6170},{"style":117},[6171],{"type":44,"value":2823},{"type":29,"tag":63,"props":6173,"children":6174},{"style":76},[6175],{"type":44,"value":6176},"(parent, type, guid, initializer);\n",{"type":29,"tag":63,"props":6178,"children":6179},{"class":65,"line":1155},[6180,6185],{"type":29,"tag":63,"props":6181,"children":6182},{"style":70},[6183],{"type":44,"value":6184}," break",{"type":29,"tag":63,"props":6186,"children":6187},{"style":76},[6188],{"type":44,"value":1244},{"type":29,"tag":63,"props":6190,"children":6191},{"class":65,"line":1164},[6192],{"type":29,"tag":63,"props":6193,"children":6194},{"style":977},[6195],{"type":44,"value":6133},{"type":29,"tag":63,"props":6197,"children":6198},{"class":65,"line":1183},[6199],{"type":29,"tag":63,"props":6200,"children":6201},{"style":76},[6202],{"type":44,"value":2123},{"type":29,"tag":63,"props":6204,"children":6205},{"class":65,"line":1215},[6206,6210],{"type":29,"tag":63,"props":6207,"children":6208},{"style":70},[6209],{"type":44,"value":1704},{"type":29,"tag":63,"props":6211,"children":6212},{"style":76},[6213],{"type":44,"value":6214}," result;\n",{"type":29,"tag":63,"props":6216,"children":6217},{"class":65,"line":1224},[6218],{"type":29,"tag":63,"props":6219,"children":6220},{"style":76},[6221],{"type":44,"value":257},{"type":29,"tag":30,"props":6223,"children":6224},{},[6225,6227,6233,6234,6240,6242,6247,6249,6254,6256,6261,6263,6268,6270,6275,6277,6283,6285,6290,6292,6297,6299,6305],{"type":44,"value":6226},"The parameter ",{"type":29,"tag":59,"props":6228,"children":6230},{"className":6229},[],[6231],{"type":44,"value":6232},"tChannelImpl: _tChannelImplFromWire",{"type":44,"value":4578},{"type":29,"tag":59,"props":6235,"children":6237},{"className":6236},[],[6238],{"type":44,"value":6239},"validator",{"type":44,"value":6241}," function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the ",{"type":29,"tag":59,"props":6243,"children":6245},{"className":6244},[],[6246],{"type":44,"value":2148},{"type":44,"value":6248}," variable in the ",{"type":29,"tag":59,"props":6250,"children":6252},{"className":6251},[],[6253],{"type":44,"value":679},{"type":44,"value":6255}," class. If you look at the type definition in ",{"type":29,"tag":59,"props":6257,"children":6259},{"className":6258},[],[6260],{"type":44,"value":679},{"type":44,"value":6262}," the ",{"type":29,"tag":59,"props":6264,"children":6266},{"className":6265},[],[6267],{"type":44,"value":2148},{"type":44,"value":6269}," variable is a map returning one of the ",{"type":29,"tag":59,"props":6271,"children":6273},{"className":6272},[],[6274],{"type":44,"value":604},{"type":44,"value":6276}," subclasses. So in the result above for the ",{"type":29,"tag":59,"props":6278,"children":6280},{"className":6279},[],[6281],{"type":44,"value":6282},"case: 'Playwright'",{"type":44,"value":6284},", it returns a ",{"type":29,"tag":59,"props":6286,"children":6288},{"className":6287},[],[6289],{"type":44,"value":12},{"type":44,"value":6291}," instance, which is a subclass of ",{"type":29,"tag":59,"props":6293,"children":6295},{"className":6294},[],[6296],{"type":44,"value":604},{"type":44,"value":6298},", defined in ",{"type":29,"tag":59,"props":6300,"children":6302},{"className":6301},[],[6303],{"type":44,"value":6304},"client/playwright.ts",{"type":44,"value":228},{"type":29,"tag":39,"props":6307,"children":6309},{"id":6308},"launching-the-browser-instance",[6310],{"type":44,"value":6311},"Launching the browser instance",{"type":29,"tag":30,"props":6313,"children":6314},{},[6315,6317,6322,6324,6330],{"type":44,"value":6316},"The final bit of code in ",{"type":29,"tag":59,"props":6318,"children":6320},{"className":6319},[],[6321],{"type":44,"value":504},{"type":44,"value":6323}," to consider is the ",{"type":29,"tag":59,"props":6325,"children":6327},{"className":6326},[],[6328],{"type":44,"value":6329},"_serverLauncher",{"type":44,"value":6331}," variables being set in each of the drivers. This is written as",{"type":29,"tag":52,"props":6333,"children":6335},{"className":54,"code":6334,"filename":730,"language":56,"meta":7,"style":7},"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n",[6336],{"type":29,"tag":59,"props":6337,"children":6338},{"__ignoreMap":7},[6339,6363,6371,6378,6402,6410,6417],{"type":29,"tag":63,"props":6340,"children":6341},{"class":65,"line":66},[6342,6347,6351,6355,6359],{"type":29,"tag":63,"props":6343,"children":6344},{"style":76},[6345],{"type":44,"value":6346},"playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":6348,"children":6349},{"style":70},[6350],{"type":44,"value":1258},{"type":29,"tag":63,"props":6352,"children":6353},{"style":70},[6354],{"type":44,"value":893},{"type":29,"tag":63,"props":6356,"children":6357},{"style":117},[6358],{"type":44,"value":1267},{"type":29,"tag":63,"props":6360,"children":6361},{"style":76},[6362],{"type":44,"value":1212},{"type":29,"tag":63,"props":6364,"children":6365},{"class":65,"line":93},[6366],{"type":29,"tag":63,"props":6367,"children":6368},{"style":87},[6369],{"type":44,"value":6370}," \"chromium\"\n",{"type":29,"tag":63,"props":6372,"children":6373},{"class":65,"line":103},[6374],{"type":29,"tag":63,"props":6375,"children":6376},{"style":76},[6377],{"type":44,"value":429},{"type":29,"tag":63,"props":6379,"children":6380},{"class":65,"line":138},[6381,6386,6390,6394,6398],{"type":29,"tag":63,"props":6382,"children":6383},{"style":76},[6384],{"type":44,"value":6385},"playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":6387,"children":6388},{"style":70},[6389],{"type":44,"value":1258},{"type":29,"tag":63,"props":6391,"children":6392},{"style":70},[6393],{"type":44,"value":893},{"type":29,"tag":63,"props":6395,"children":6396},{"style":117},[6397],{"type":44,"value":1267},{"type":29,"tag":63,"props":6399,"children":6400},{"style":76},[6401],{"type":44,"value":1212},{"type":29,"tag":63,"props":6403,"children":6404},{"class":65,"line":178},[6405],{"type":29,"tag":63,"props":6406,"children":6407},{"style":87},[6408],{"type":44,"value":6409}," \"firefox\"\n",{"type":29,"tag":63,"props":6411,"children":6412},{"class":65,"line":213},[6413],{"type":29,"tag":63,"props":6414,"children":6415},{"style":76},[6416],{"type":44,"value":429},{"type":29,"tag":63,"props":6418,"children":6419},{"class":65,"line":251},[6420,6425,6429,6433,6437,6441,6446],{"type":29,"tag":63,"props":6421,"children":6422},{"style":76},[6423],{"type":44,"value":6424},"playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":6426,"children":6427},{"style":70},[6428],{"type":44,"value":1258},{"type":29,"tag":63,"props":6430,"children":6431},{"style":70},[6432],{"type":44,"value":893},{"type":29,"tag":63,"props":6434,"children":6435},{"style":117},[6436],{"type":44,"value":1267},{"type":29,"tag":63,"props":6438,"children":6439},{"style":76},[6440],{"type":44,"value":238},{"type":29,"tag":63,"props":6442,"children":6443},{"style":87},[6444],{"type":44,"value":6445},"\"webkit\"",{"type":29,"tag":63,"props":6447,"children":6448},{"style":76},[6449],{"type":44,"value":429},{"type":29,"tag":30,"props":6451,"children":6452},{},[6453,6454,6460,6462,6467,6469,6475,6477,6483],{"type":44,"value":3475},{"type":29,"tag":59,"props":6455,"children":6457},{"className":6456},[],[6458],{"type":44,"value":6459},"BrowserServerLauncherImpl",{"type":44,"value":6461}," class is defined next to the ",{"type":29,"tag":59,"props":6463,"children":6465},{"className":6464},[],[6466],{"type":44,"value":496},{"type":44,"value":6468}," file in ",{"type":29,"tag":59,"props":6470,"children":6472},{"className":6471},[],[6473],{"type":44,"value":6474},"browserServerLauncherImpl.ts",{"type":44,"value":6476},". The main functionality in this class lies in the ",{"type":29,"tag":59,"props":6478,"children":6480},{"className":6479},[],[6481],{"type":44,"value":6482},"launchServer",{"type":44,"value":6484}," function, and is only called when you use the",{"type":29,"tag":52,"props":6486,"children":6489},{"className":54,"code":6487,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","my-script.ts",[6490],{"type":29,"tag":59,"props":6491,"children":6492},{"__ignoreMap":7},[6493,6517,6524],{"type":29,"tag":63,"props":6494,"children":6495},{"class":65,"line":66},[6496,6500,6505,6509,6513],{"type":29,"tag":63,"props":6497,"children":6498},{"style":70},[6499],{"type":44,"value":73},{"type":29,"tag":63,"props":6501,"children":6502},{"style":76},[6503],{"type":44,"value":6504}," playwright ",{"type":29,"tag":63,"props":6506,"children":6507},{"style":70},[6508],{"type":44,"value":84},{"type":29,"tag":63,"props":6510,"children":6511},{"style":87},[6512],{"type":44,"value":1779},{"type":29,"tag":63,"props":6514,"children":6515},{"style":76},[6516],{"type":44,"value":1244},{"type":29,"tag":63,"props":6518,"children":6519},{"class":65,"line":93},[6520],{"type":29,"tag":63,"props":6521,"children":6522},{"emptyLinePlaceholder":97},[6523],{"type":44,"value":100},{"type":29,"tag":63,"props":6525,"children":6526},{"class":65,"line":103},[6527,6532,6536],{"type":29,"tag":63,"props":6528,"children":6529},{"style":76},[6530],{"type":44,"value":6531},"playwright.chromium.",{"type":29,"tag":63,"props":6533,"children":6534},{"style":117},[6535],{"type":44,"value":6482},{"type":29,"tag":63,"props":6537,"children":6538},{"style":76},[6539],{"type":44,"value":6540},"(serverOptions);\n",{"type":29,"tag":30,"props":6542,"children":6543},{},[6544,6546,6552],{"type":44,"value":6545},"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the ",{"type":29,"tag":59,"props":6547,"children":6549},{"className":6548},[],[6550],{"type":44,"value":6551},"'playwright-core'",{"type":44,"value":6553}," library, something like",{"type":29,"tag":52,"props":6555,"children":6557},{"className":54,"code":6556,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n",[6558],{"type":29,"tag":59,"props":6559,"children":6560},{"__ignoreMap":7},[6561,6584,6591,6611,6653,6684,6713,6721],{"type":29,"tag":63,"props":6562,"children":6563},{"class":65,"line":66},[6564,6568,6572,6576,6580],{"type":29,"tag":63,"props":6565,"children":6566},{"style":70},[6567],{"type":44,"value":73},{"type":29,"tag":63,"props":6569,"children":6570},{"style":76},[6571],{"type":44,"value":6504},{"type":29,"tag":63,"props":6573,"children":6574},{"style":70},[6575],{"type":44,"value":84},{"type":29,"tag":63,"props":6577,"children":6578},{"style":87},[6579],{"type":44,"value":1779},{"type":29,"tag":63,"props":6581,"children":6582},{"style":76},[6583],{"type":44,"value":1244},{"type":29,"tag":63,"props":6585,"children":6586},{"class":65,"line":93},[6587],{"type":29,"tag":63,"props":6588,"children":6589},{"emptyLinePlaceholder":97},[6590],{"type":44,"value":100},{"type":29,"tag":63,"props":6592,"children":6593},{"class":65,"line":103},[6594,6598,6602,6606],{"type":29,"tag":63,"props":6595,"children":6596},{"style":76},[6597],{"type":44,"value":238},{"type":29,"tag":63,"props":6599,"children":6600},{"style":70},[6601],{"type":44,"value":109},{"type":29,"tag":63,"props":6603,"children":6604},{"style":70},[6605],{"type":44,"value":114},{"type":29,"tag":63,"props":6607,"children":6608},{"style":76},[6609],{"type":44,"value":6610}," () {\n",{"type":29,"tag":63,"props":6612,"children":6613},{"class":65,"line":138},[6614,6618,6622,6626,6630,6635,6639,6644,6649],{"type":29,"tag":63,"props":6615,"children":6616},{"style":70},[6617],{"type":44,"value":144},{"type":29,"tag":63,"props":6619,"children":6620},{"style":394},[6621],{"type":44,"value":150},{"type":29,"tag":63,"props":6623,"children":6624},{"style":70},[6625],{"type":44,"value":155},{"type":29,"tag":63,"props":6627,"children":6628},{"style":70},[6629],{"type":44,"value":160},{"type":29,"tag":63,"props":6631,"children":6632},{"style":76},[6633],{"type":44,"value":6634}," playwright.chromium.",{"type":29,"tag":63,"props":6636,"children":6637},{"style":117},[6638],{"type":44,"value":170},{"type":29,"tag":63,"props":6640,"children":6641},{"style":76},[6642],{"type":44,"value":6643},"({ headless: ",{"type":29,"tag":63,"props":6645,"children":6646},{"style":394},[6647],{"type":44,"value":6648},"false",{"type":29,"tag":63,"props":6650,"children":6651},{"style":76},[6652],{"type":44,"value":5014},{"type":29,"tag":63,"props":6654,"children":6655},{"class":65,"line":178},[6656,6660,6664,6668,6672,6676,6680],{"type":29,"tag":63,"props":6657,"children":6658},{"style":70},[6659],{"type":44,"value":144},{"type":29,"tag":63,"props":6661,"children":6662},{"style":394},[6663],{"type":44,"value":188},{"type":29,"tag":63,"props":6665,"children":6666},{"style":70},[6667],{"type":44,"value":155},{"type":29,"tag":63,"props":6669,"children":6670},{"style":70},[6671],{"type":44,"value":160},{"type":29,"tag":63,"props":6673,"children":6674},{"style":76},[6675],{"type":44,"value":201},{"type":29,"tag":63,"props":6677,"children":6678},{"style":117},[6679],{"type":44,"value":206},{"type":29,"tag":63,"props":6681,"children":6682},{"style":76},[6683],{"type":44,"value":939},{"type":29,"tag":63,"props":6685,"children":6686},{"class":65,"line":213},[6687,6691,6696,6700,6704,6709],{"type":29,"tag":63,"props":6688,"children":6689},{"style":70},[6690],{"type":44,"value":219},{"type":29,"tag":63,"props":6692,"children":6693},{"style":76},[6694],{"type":44,"value":6695}," page.",{"type":29,"tag":63,"props":6697,"children":6698},{"style":117},[6699],{"type":44,"value":233},{"type":29,"tag":63,"props":6701,"children":6702},{"style":76},[6703],{"type":44,"value":238},{"type":29,"tag":63,"props":6705,"children":6706},{"style":87},[6707],{"type":44,"value":6708},"\"https://playwright.dev\"",{"type":29,"tag":63,"props":6710,"children":6711},{"style":76},[6712],{"type":44,"value":429},{"type":29,"tag":63,"props":6714,"children":6715},{"class":65,"line":251},[6716],{"type":29,"tag":63,"props":6717,"children":6718},{"style":977},[6719],{"type":44,"value":6720}," // ... automate page interactions here\n",{"type":29,"tag":63,"props":6722,"children":6723},{"class":65,"line":923},[6724],{"type":29,"tag":63,"props":6725,"children":6726},{"style":76},[6727],{"type":44,"value":6728},"})();\n",{"type":29,"tag":30,"props":6730,"children":6731},{},[6732,6734,6739],{"type":44,"value":6733},"so for now we skip giving an overview of the ",{"type":29,"tag":59,"props":6735,"children":6737},{"className":6736},[],[6738],{"type":44,"value":6459},{"type":44,"value":6740}," code and defer it to a later post.",{"type":29,"tag":39,"props":6742,"children":6744},{"id":6743},"recap",[6745],{"type":44,"value":6746},"Recap",{"type":29,"tag":30,"props":6748,"children":6749},{},[6750],{"type":44,"value":6751},"Whew! That was quite the journey, so let's recap the main points we covered in this post:",{"type":29,"tag":6753,"props":6754,"children":6755},"ul",{},[6756,6780,6798,6822,6833,6859,6882,6894,6939],{"type":29,"tag":6757,"props":6758,"children":6759},"li",{},[6760,6765,6767,6772,6774,6779],{"type":29,"tag":59,"props":6761,"children":6763},{"className":6762},[],[6764],{"type":44,"value":298},{"type":44,"value":6766}," is a wrapper around the test runner package ",{"type":29,"tag":59,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":44,"value":313},{"type":44,"value":6773}," and the browser automation package ",{"type":29,"tag":59,"props":6775,"children":6777},{"className":6776},[],[6778],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":6757,"props":6781,"children":6782},{},[6783,6785,6790,6792,6797],{"type":44,"value":6784},"Importing from ",{"type":29,"tag":59,"props":6786,"children":6788},{"className":6787},[],[6789],{"type":44,"value":287},{"type":44,"value":6791}," is a dynamically generated process under the hood, which is done in ",{"type":29,"tag":59,"props":6793,"children":6795},{"className":6794},[],[6796],{"type":44,"value":730},{"type":44,"value":228},{"type":29,"tag":6757,"props":6799,"children":6800},{},[6801,6802,6807,6809,6814,6815,6820],{"type":44,"value":570},{"type":29,"tag":59,"props":6803,"children":6805},{"className":6804},[],[6806],{"type":44,"value":287},{"type":44,"value":6808}," there are two main libraries, the ",{"type":29,"tag":59,"props":6810,"children":6812},{"className":6811},[],[6813],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":6816,"children":6818},{"className":6817},[],[6819],{"type":44,"value":527},{"type":44,"value":6821}," libraries.",{"type":29,"tag":6757,"props":6823,"children":6824},{},[6825,6827,6832],{"type":44,"value":6826},"This separation exists so other programming languages can easily build a client library which communicates with the ",{"type":29,"tag":59,"props":6828,"children":6830},{"className":6829},[],[6831],{"type":44,"value":527},{"type":44,"value":559},{"type":29,"tag":6757,"props":6834,"children":6835},{},[6836,6838,6843,6845,6850,6852,6857],{"type":44,"value":6837},"The client-side API and server-side API communicate with each other over a client-side ",{"type":29,"tag":59,"props":6839,"children":6841},{"className":6840},[],[6842],{"type":44,"value":679},{"type":44,"value":6844}," object and a server-side ",{"type":29,"tag":59,"props":6846,"children":6848},{"className":6847},[],[6849],{"type":44,"value":687},{"type":44,"value":6851}," object. These pass messages with one another through their runtime-defined ",{"type":29,"tag":59,"props":6853,"children":6855},{"className":6854},[],[6856],{"type":44,"value":1015},{"type":44,"value":6858}," callback.",{"type":29,"tag":6757,"props":6860,"children":6861},{},[6862,6867,6869,6874,6875,6880],{"type":29,"tag":59,"props":6863,"children":6865},{"className":6864},[],[6866],{"type":44,"value":679},{"type":44,"value":6868}," is responsible for constructing client side API's, the API methods you import from ",{"type":29,"tag":59,"props":6870,"children":6872},{"className":6871},[],[6873],{"type":44,"value":287},{"type":44,"value":4732},{"type":29,"tag":59,"props":6876,"children":6878},{"className":6877},[],[6879],{"type":44,"value":687},{"type":44,"value":6881}," is responsible for keeping track of the dispatcher objects on the server side.",{"type":29,"tag":6757,"props":6883,"children":6884},{},[6885,6887,6892],{"type":44,"value":6886},"The instances of the ",{"type":29,"tag":59,"props":6888,"children":6890},{"className":6889},[],[6891],{"type":44,"value":619},{"type":44,"value":6893}," subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.",{"type":29,"tag":6757,"props":6895,"children":6896},{},[6897,6902,6904,6909,6911,6916,6918,6923,6925,6930,6932,6937],{"type":29,"tag":59,"props":6898,"children":6900},{"className":6899},[],[6901],{"type":44,"value":679},{"type":44,"value":6903}," is wrapped by ",{"type":29,"tag":59,"props":6905,"children":6907},{"className":6906},[],[6908],{"type":44,"value":604},{"type":44,"value":6910}," subclasses, which all point to the same instance of ",{"type":29,"tag":59,"props":6912,"children":6914},{"className":6913},[],[6915],{"type":44,"value":679},{"type":44,"value":6917}," and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. ",{"type":29,"tag":59,"props":6919,"children":6921},{"className":6920},[],[6922],{"type":44,"value":642},{"type":44,"value":6924},". Similarly, ",{"type":29,"tag":59,"props":6926,"children":6928},{"className":6927},[],[6929],{"type":44,"value":687},{"type":44,"value":6931}," is wrapped by a subclass of ",{"type":29,"tag":59,"props":6933,"children":6935},{"className":6934},[],[6936],{"type":44,"value":619},{"type":44,"value":6938}," which is responsible for a part of the automated browser.",{"type":29,"tag":6757,"props":6940,"children":6941},{},[6942,6944,6949,6950,6955,6957,6963],{"type":44,"value":6943},"Both the ",{"type":29,"tag":59,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6951,"children":6953},{"className":6952},[],[6954],{"type":44,"value":687},{"type":44,"value":6956}," classes keep track of the same object on each side of the client/server side of the divide with a unique ",{"type":29,"tag":59,"props":6958,"children":6960},{"className":6959},[],[6961],{"type":44,"value":6962},"GUID",{"type":44,"value":228},{"type":29,"tag":30,"props":6965,"children":6966},{},[6967,6969,6974,6975,6980],{"type":44,"value":6968},"Once you have parsed the functionality of ",{"type":29,"tag":59,"props":6970,"children":6972},{"className":6971},[],[6973],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6976,"children":6978},{"className":6977},[],[6979],{"type":44,"value":687},{"type":44,"value":6981},", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.",{"type":29,"tag":6983,"props":6984,"children":6985},"style",{},[6986],{"type":44,"value":6987},"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);}",{"title":7,"searchDepth":93,"depth":93,"links":6989},[6990,6995,6996,7002,7003],{"id":41,"depth":93,"text":45,"children":6991},[6992,6994],{"id":271,"depth":103,"text":6993},"Merging playwright and playwright-core",{"id":562,"depth":103,"text":565},{"id":704,"depth":93,"text":707},{"id":2168,"depth":93,"text":2171,"children":6997},[6998,6999,7000,7001],{"id":2633,"depth":103,"text":2636},{"id":3374,"depth":103,"text":3377},{"id":4626,"depth":103,"text":4629},{"id":4806,"depth":103,"text":4809},{"id":6308,"depth":93,"text":6311},{"id":6743,"depth":93,"text":6746},"markdown","content:playwright:how-playwright-initializes.md","content","playwright/how-playwright-initializes.md","md",1714258649789] \ No newline at end of file +[{"data":1,"prerenderedAt":7009},["Reactive",2],{"blog-post-playwright/how-playwright-initializes":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"image":17,"shortDescription":18,"created":19,"link":4,"body":25,"_type":7004,"_id":7005,"_source":7006,"_file":7007,"_extension":7008},"/playwright/how-playwright-initializes","playwright",false,"","How importing from Playwright works","In this post we dive into how Playwright initializes itself when you import anything from the library. If you look under the hood there is some complex machinery generating the API making it difficult for someone unfamiliar to get started with Playwright's internals.",[11,14],{"name":12,"path":13},"Playwright","/playwright/",{"name":15,"path":16},"How Playwright Initializes","/playwright/how-playwright-initializes/","img","Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured.",{"string":20,"number":21,"month":22,"day":23,"year":24},"March 13, 2024",1710309600000,"Mar",13,2024,{"type":26,"children":27,"toc":6988},"root",[28,38,46,51,258,263,268,288,359,379,430,530,560,566,697,702,708,727,1718,1752,1784,1804,1865,1870,1931,1943,2131,2166,2172,2221,2274,2469,2474,2574,2631,2637,2669,3353,3372,3378,3406,3471,3533,3545,4208,4298,4305,4317,4545,4624,4630,4649,4763,4804,4810,4851,5053,5101,5143,5163,5449,5504,5537,5571,5762,5781,6222,6306,6312,6332,6450,6485,6541,6554,6729,6741,6747,6752,6964,6982],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33],{"type":29,"tag":17,"props":34,"children":37},{"alt":35,"src":36},"Diagram of playwright-core initialization process","/img/playwright/playwright-core_initialization_diagram.jpg",[],{"type":29,"tag":39,"props":40,"children":42},"h2",{"id":41},"peering-into-playwrights-import-process",[43],{"type":44,"value":45},"text","Peering into Playwright's import process",{"type":29,"tag":30,"props":47,"children":48},{},[49],{"type":44,"value":50},"Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet",{"type":29,"tag":52,"props":53,"children":57},"pre",{"className":54,"code":55,"language":56,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","import { chromium } from '@playwright/test'\n\nasync function main () => {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n await page.goto(\"https://qacomet.com\")\n}\n","ts",[58],{"type":29,"tag":59,"props":60,"children":61},"code",{"__ignoreMap":7},[62,91,101,136,176,211,249],{"type":29,"tag":63,"props":64,"children":67},"span",{"class":65,"line":66},"line",1,[68,74,80,85],{"type":29,"tag":63,"props":69,"children":71},{"style":70},"--shiki-default:#F97583",[72],{"type":44,"value":73},"import",{"type":29,"tag":63,"props":75,"children":77},{"style":76},"--shiki-default:#E1E4E8",[78],{"type":44,"value":79}," { chromium } ",{"type":29,"tag":63,"props":81,"children":82},{"style":70},[83],{"type":44,"value":84},"from",{"type":29,"tag":63,"props":86,"children":88},{"style":87},"--shiki-default:#9ECBFF",[89],{"type":44,"value":90}," '@playwright/test'\n",{"type":29,"tag":63,"props":92,"children":94},{"class":65,"line":93},2,[95],{"type":29,"tag":63,"props":96,"children":98},{"emptyLinePlaceholder":97},true,[99],{"type":44,"value":100},"\n",{"type":29,"tag":63,"props":102,"children":104},{"class":65,"line":103},3,[105,110,115,121,126,131],{"type":29,"tag":63,"props":106,"children":107},{"style":70},[108],{"type":44,"value":109},"async",{"type":29,"tag":63,"props":111,"children":112},{"style":70},[113],{"type":44,"value":114}," function",{"type":29,"tag":63,"props":116,"children":118},{"style":117},"--shiki-default:#B392F0",[119],{"type":44,"value":120}," main",{"type":29,"tag":63,"props":122,"children":123},{"style":76},[124],{"type":44,"value":125}," () ",{"type":29,"tag":63,"props":127,"children":128},{"style":70},[129],{"type":44,"value":130},"=>",{"type":29,"tag":63,"props":132,"children":133},{"style":76},[134],{"type":44,"value":135}," {\n",{"type":29,"tag":63,"props":137,"children":139},{"class":65,"line":138},4,[140,145,151,156,161,166,171],{"type":29,"tag":63,"props":141,"children":142},{"style":117},[143],{"type":44,"value":144}," const",{"type":29,"tag":63,"props":146,"children":148},{"style":147},"--shiki-default:#FFAB70",[149],{"type":44,"value":150}," browser",{"type":29,"tag":63,"props":152,"children":153},{"style":70},[154],{"type":44,"value":155}," =",{"type":29,"tag":63,"props":157,"children":158},{"style":70},[159],{"type":44,"value":160}," await",{"type":29,"tag":63,"props":162,"children":163},{"style":76},[164],{"type":44,"value":165}," chromium.",{"type":29,"tag":63,"props":167,"children":168},{"style":117},[169],{"type":44,"value":170},"launch",{"type":29,"tag":63,"props":172,"children":173},{"style":76},[174],{"type":44,"value":175},"()\n",{"type":29,"tag":63,"props":177,"children":179},{"class":65,"line":178},5,[180,184,189,193,197,202,207],{"type":29,"tag":63,"props":181,"children":182},{"style":117},[183],{"type":44,"value":144},{"type":29,"tag":63,"props":185,"children":186},{"style":147},[187],{"type":44,"value":188}," page",{"type":29,"tag":63,"props":190,"children":191},{"style":70},[192],{"type":44,"value":155},{"type":29,"tag":63,"props":194,"children":195},{"style":70},[196],{"type":44,"value":160},{"type":29,"tag":63,"props":198,"children":199},{"style":76},[200],{"type":44,"value":201}," browser.",{"type":29,"tag":63,"props":203,"children":204},{"style":117},[205],{"type":44,"value":206},"newPage",{"type":29,"tag":63,"props":208,"children":209},{"style":76},[210],{"type":44,"value":175},{"type":29,"tag":63,"props":212,"children":214},{"class":65,"line":213},6,[215,220,224,229,234,239,244],{"type":29,"tag":63,"props":216,"children":217},{"style":117},[218],{"type":44,"value":219}," await",{"type":29,"tag":63,"props":221,"children":222},{"style":117},[223],{"type":44,"value":188},{"type":29,"tag":63,"props":225,"children":226},{"style":76},[227],{"type":44,"value":228},".",{"type":29,"tag":63,"props":230,"children":231},{"style":117},[232],{"type":44,"value":233},"goto",{"type":29,"tag":63,"props":235,"children":236},{"style":76},[237],{"type":44,"value":238},"(",{"type":29,"tag":63,"props":240,"children":241},{"style":87},[242],{"type":44,"value":243},"\"https://qacomet.com\"",{"type":29,"tag":63,"props":245,"children":246},{"style":76},[247],{"type":44,"value":248},")\n",{"type":29,"tag":63,"props":250,"children":252},{"class":65,"line":251},7,[253],{"type":29,"tag":63,"props":254,"children":255},{"style":76},[256],{"type":44,"value":257},"}\n",{"type":29,"tag":30,"props":259,"children":260},{},[261],{"type":44,"value":262},"Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.",{"type":29,"tag":30,"props":264,"children":265},{},[266],{"type":44,"value":267},"In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.",{"type":29,"tag":269,"props":270,"children":272},"h3",{"id":271},"merging-playwright-and-playwright-core",[273,275,280,282],{"type":44,"value":274},"Merging ",{"type":29,"tag":59,"props":276,"children":278},{"className":277},[],[279],{"type":44,"value":5},{"type":44,"value":281}," and ",{"type":29,"tag":59,"props":283,"children":285},{"className":284},[],[286],{"type":44,"value":287},"playwright-core",{"type":29,"tag":30,"props":289,"children":290},{},[291,293,299,301,307,308,314,316,322,324,329,331,337,339,344,346,351,353,358],{"type":44,"value":292},"Internally, when you import from ",{"type":29,"tag":59,"props":294,"children":296},{"className":295},[],[297],{"type":44,"value":298},"@playwright/test",{"type":44,"value":300},", there is an underlying call to import from two merged packages, ",{"type":29,"tag":59,"props":302,"children":304},{"className":303},[],[305],{"type":44,"value":306},"packages/playwright-core",{"type":44,"value":281},{"type":29,"tag":59,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"packages/playwright",{"type":44,"value":315},". This merge happens in ",{"type":29,"tag":59,"props":317,"children":319},{"className":318},[],[320],{"type":44,"value":321},"packages/playwright/test",{"type":44,"value":323},", since ",{"type":29,"tag":59,"props":325,"children":327},{"className":326},[],[328],{"type":44,"value":298},{"type":44,"value":330}," is just an outward facinging export of ",{"type":29,"tag":59,"props":332,"children":334},{"className":333},[],[335],{"type":44,"value":336},"require('playwright/test')",{"type":44,"value":338},", an alias for ",{"type":29,"tag":59,"props":340,"children":342},{"className":341},[],[343],{"type":44,"value":321},{"type":44,"value":345},". This is where the test execution API's from ",{"type":29,"tag":59,"props":347,"children":349},{"className":348},[],[350],{"type":44,"value":313},{"type":44,"value":352}," are combined with the browser automation API's from ",{"type":29,"tag":59,"props":354,"children":356},{"className":355},[],[357],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":30,"props":360,"children":361},{},[362,364,369,371,377],{"type":44,"value":363},"We will focus on the import from ",{"type":29,"tag":59,"props":365,"children":367},{"className":366},[],[368],{"type":44,"value":287},{"type":44,"value":370},", since it provides the core browser automation and is the code every other client library wraps. Looking at its ",{"type":29,"tag":59,"props":372,"children":374},{"className":373},[],[375],{"type":44,"value":376},"index.js",{"type":44,"value":378}," file",{"type":29,"tag":52,"props":380,"children":385},{"className":381,"code":382,"filename":383,"language":384,"meta":7,"style":7},"language-js shiki shiki-themes github-dark","module.exports = require(\"./lib/inprocess\");\n","packages/playwright-core/index.js","js",[386],{"type":29,"tag":59,"props":387,"children":388},{"__ignoreMap":7},[389],{"type":29,"tag":63,"props":390,"children":391},{"class":65,"line":66},[392,398,402,407,411,416,420,425],{"type":29,"tag":63,"props":393,"children":395},{"style":394},"--shiki-default:#79B8FF",[396],{"type":44,"value":397},"module",{"type":29,"tag":63,"props":399,"children":400},{"style":76},[401],{"type":44,"value":228},{"type":29,"tag":63,"props":403,"children":404},{"style":394},[405],{"type":44,"value":406},"exports",{"type":29,"tag":63,"props":408,"children":409},{"style":70},[410],{"type":44,"value":155},{"type":29,"tag":63,"props":412,"children":413},{"style":117},[414],{"type":44,"value":415}," require",{"type":29,"tag":63,"props":417,"children":418},{"style":76},[419],{"type":44,"value":238},{"type":29,"tag":63,"props":421,"children":422},{"style":87},[423],{"type":44,"value":424},"\"./lib/inprocess\"",{"type":29,"tag":63,"props":426,"children":427},{"style":76},[428],{"type":44,"value":429},");\n",{"type":29,"tag":30,"props":431,"children":432},{},[433,435,441,443,449,451,457,459,465,467,473,475,481,483,489,491,497,499,505,507,512,514,520,522,528],{"type":44,"value":434},"gives an export from its ",{"type":29,"tag":59,"props":436,"children":438},{"className":437},[],[439],{"type":44,"value":440},"lib/inprocess.ts",{"type":44,"value":442}," file (note the ",{"type":29,"tag":59,"props":444,"children":446},{"className":445},[],[447],{"type":44,"value":448},"src",{"type":44,"value":450}," directory is compiled to the ",{"type":29,"tag":59,"props":452,"children":454},{"className":453},[],[455],{"type":44,"value":456},"lib",{"type":44,"value":458}," directory after playwright runs its build script, and is what's found in ",{"type":29,"tag":59,"props":460,"children":462},{"className":461},[],[463],{"type":44,"value":464},"node_modules/playwright-core",{"type":44,"value":466},", hence the require imports from ",{"type":29,"tag":59,"props":468,"children":470},{"className":469},[],[471],{"type":44,"value":472},"./lib/",{"type":44,"value":474}," and not ",{"type":29,"tag":59,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":480},"./src/",{"type":44,"value":482},"). The ",{"type":29,"tag":59,"props":484,"children":486},{"className":485},[],[487],{"type":44,"value":488},"inprocess.ts",{"type":44,"value":490}," file just imports from the adjacent ",{"type":29,"tag":59,"props":492,"children":494},{"className":493},[],[495],{"type":44,"value":496},"inProcessFactory.ts",{"type":44,"value":498}," and executes the function from there, called ",{"type":29,"tag":59,"props":500,"children":502},{"className":501},[],[503],{"type":44,"value":504},"createInProcessPlaywright",{"type":44,"value":506},". We include the source below in its own section but note ",{"type":29,"tag":59,"props":508,"children":510},{"className":509},[],[511],{"type":44,"value":504},{"type":44,"value":513}," dynamically intiailizes the interface between the client library, defined in ",{"type":29,"tag":59,"props":515,"children":517},{"className":516},[],[518],{"type":44,"value":519},"src/client",{"type":44,"value":521},", and the server library, defined in ",{"type":29,"tag":59,"props":523,"children":525},{"className":524},[],[526],{"type":44,"value":527},"src/server",{"type":44,"value":529},". The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.",{"type":29,"tag":30,"props":531,"children":532},{},[533,535,544,546,551,553,558],{"type":44,"value":534},"This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the ",{"type":29,"tag":536,"props":537,"children":541},"a",{"href":538,"rel":539},"https://github.com/microsoft/playwright-python",[540],"nofollow",[542],{"type":44,"value":543},"playwright-python",{"type":44,"value":545}," source code, you will find the same design patterns and classes defined in ",{"type":29,"tag":59,"props":547,"children":549},{"className":548},[],[550],{"type":44,"value":287},{"type":44,"value":552},"'s ",{"type":29,"tag":59,"props":554,"children":556},{"className":555},[],[557],{"type":44,"value":519},{"type":44,"value":559}," library.",{"type":29,"tag":269,"props":561,"children":563},{"id":562},"rapid-overview-of-the-client-and-server-libraries",[564],{"type":44,"value":565},"Rapid overview of the client and server libraries",{"type":29,"tag":30,"props":567,"children":568},{},[569,571,576,578,583,584,589,591,597,599,605,607,612,614,620,622,628,630,635,637,643,645,651,653,658,659,665,667,672,674,680,682,688,690,695],{"type":44,"value":570},"In ",{"type":29,"tag":59,"props":572,"children":574},{"className":573},[],[575],{"type":44,"value":287},{"type":44,"value":577}," the main functionality can be found in the ",{"type":29,"tag":59,"props":579,"children":581},{"className":580},[],[582],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":585,"children":587},{"className":586},[],[588],{"type":44,"value":527},{"type":44,"value":590}," folders. The ",{"type":29,"tag":59,"props":592,"children":594},{"className":593},[],[595],{"type":44,"value":596},"client",{"type":44,"value":598}," folder contains classes, many of which are subclasses of the ",{"type":29,"tag":59,"props":600,"children":602},{"className":601},[],[603],{"type":44,"value":604},"ChannelOwner",{"type":44,"value":606}," class. This ",{"type":29,"tag":59,"props":608,"children":610},{"className":609},[],[611],{"type":44,"value":604},{"type":44,"value":613}," class is a client-side representation of a corresponding server-side ",{"type":29,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":44,"value":619},"Dispatcher",{"type":44,"value":621}," class in the ",{"type":29,"tag":59,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":627},"src/server/dispatchers",{"type":44,"value":629}," folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ",{"type":29,"tag":59,"props":631,"children":633},{"className":632},[],[634],{"type":44,"value":604},{"type":44,"value":636}," subclass called ",{"type":29,"tag":59,"props":638,"children":640},{"className":639},[],[641],{"type":44,"value":642},"Page",{"type":44,"value":644},", containing the client side APIs (such as ",{"type":29,"tag":59,"props":646,"children":648},{"className":647},[],[649],{"type":44,"value":650},"page.goto",{"type":44,"value":652},"), there is a corresponding ",{"type":29,"tag":59,"props":654,"children":656},{"className":655},[],[657],{"type":44,"value":619},{"type":44,"value":636},{"type":29,"tag":59,"props":660,"children":662},{"className":661},[],[663],{"type":44,"value":664},"PageDispatcher",{"type":44,"value":666},". When we call ",{"type":29,"tag":59,"props":668,"children":670},{"className":669},[],[671],{"type":44,"value":650},{"type":44,"value":673}," a message is send over the unique client ",{"type":29,"tag":59,"props":675,"children":677},{"className":676},[],[678],{"type":44,"value":679},"Connection",{"type":44,"value":681}," instance to the unique ",{"type":29,"tag":59,"props":683,"children":685},{"className":684},[],[686],{"type":44,"value":687},"DispatcherConnection",{"type":44,"value":689}," instance, which calls the corresponding ",{"type":29,"tag":59,"props":691,"children":693},{"className":692},[],[694],{"type":44,"value":664},{"type":44,"value":696},", which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.",{"type":29,"tag":30,"props":698,"children":699},{},[700],{"type":44,"value":701},"Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.",{"type":29,"tag":39,"props":703,"children":705},{"id":704},"playwrights-core-api-factory-createinprocessplaywright",[706],{"type":44,"value":707},"Playwright's core API factory, createInProcessPlaywright",{"type":29,"tag":30,"props":709,"children":710},{},[711,713,718,720,725],{"type":44,"value":712},"This file, ",{"type":29,"tag":59,"props":714,"children":716},{"className":715},[],[717],{"type":44,"value":496},{"type":44,"value":719},", contains only one function called ",{"type":29,"tag":59,"props":721,"children":723},{"className":722},[],[724],{"type":44,"value":504},{"type":44,"value":726},". We include it here as a reference:",{"type":29,"tag":52,"props":728,"children":731},{"className":54,"code":729,"filename":730,"language":56,"meta":7,"style":7},"export function createInProcessPlaywright(): PlaywrightAPI {\n const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n });\n\n const clientConnection = new Connection(undefined, undefined);\n clientConnection.useRawBuffers();\n const dispatcherConnection = new DispatcherConnection(true /* local */);\n\n // Dispatch synchronously at first.\n dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\n clientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n\n const rootScope = new RootDispatcher(dispatcherConnection);\n\n // Initialize Playwright channel.\n new PlaywrightDispatcher(rootScope, playwright);\n const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n ) as PlaywrightAPI;\n playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n );\n playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n );\n playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\n \"webkit\"\n );\n playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl();\n\n // Switch to async dispatch after we got Playwright object.\n dispatcherConnection.onmessage = (message) =>\n setImmediate(() => clientConnection.dispatch(message));\n clientConnection.onmessage = (message) =>\n setImmediate(() => dispatcherConnection.dispatch(message));\n\n clientConnection.toImpl = (x: any) =>\n x\n ? dispatcherConnection._dispatchers.get(x._guid)!._object\n : dispatcherConnection._dispatchers.get(\"\");\n (playwrightAPI as any)._toImpl = clientConnection.toImpl;\n return playwrightAPI;\n}\n","packages/playwright-core/src/inProcessFactory.ts",[732],{"type":29,"tag":59,"props":733,"children":734},{"__ignoreMap":7},[735,771,797,805,858,866,873,921,940,985,993,1002,1039,1057,1089,1106,1114,1145,1153,1162,1181,1213,1222,1245,1272,1281,1290,1315,1324,1332,1357,1366,1374,1400,1408,1417,1449,1480,1512,1541,1549,1592,1601,1635,1665,1696,1710],{"type":29,"tag":63,"props":736,"children":737},{"class":65,"line":66},[738,743,747,752,757,762,767],{"type":29,"tag":63,"props":739,"children":740},{"style":70},[741],{"type":44,"value":742},"export",{"type":29,"tag":63,"props":744,"children":745},{"style":70},[746],{"type":44,"value":114},{"type":29,"tag":63,"props":748,"children":749},{"style":117},[750],{"type":44,"value":751}," createInProcessPlaywright",{"type":29,"tag":63,"props":753,"children":754},{"style":76},[755],{"type":44,"value":756},"()",{"type":29,"tag":63,"props":758,"children":759},{"style":70},[760],{"type":44,"value":761},":",{"type":29,"tag":63,"props":763,"children":764},{"style":117},[765],{"type":44,"value":766}," PlaywrightAPI",{"type":29,"tag":63,"props":768,"children":769},{"style":76},[770],{"type":44,"value":135},{"type":29,"tag":63,"props":772,"children":773},{"class":65,"line":93},[774,778,783,787,792],{"type":29,"tag":63,"props":775,"children":776},{"style":70},[777],{"type":44,"value":144},{"type":29,"tag":63,"props":779,"children":780},{"style":394},[781],{"type":44,"value":782}," playwright",{"type":29,"tag":63,"props":784,"children":785},{"style":70},[786],{"type":44,"value":155},{"type":29,"tag":63,"props":788,"children":789},{"style":117},[790],{"type":44,"value":791}," createPlaywright",{"type":29,"tag":63,"props":793,"children":794},{"style":76},[795],{"type":44,"value":796},"({\n",{"type":29,"tag":63,"props":798,"children":799},{"class":65,"line":103},[800],{"type":29,"tag":63,"props":801,"children":802},{"style":76},[803],{"type":44,"value":804}," sdkLanguage:\n",{"type":29,"tag":63,"props":806,"children":807},{"class":65,"line":138},[808,813,818,823,828,833,838,843,848,853],{"type":29,"tag":63,"props":809,"children":810},{"style":76},[811],{"type":44,"value":812}," (process.env.",{"type":29,"tag":63,"props":814,"children":815},{"style":394},[816],{"type":44,"value":817},"PW_LANG_NAME",{"type":29,"tag":63,"props":819,"children":820},{"style":70},[821],{"type":44,"value":822}," as",{"type":29,"tag":63,"props":824,"children":825},{"style":117},[826],{"type":44,"value":827}," Language",{"type":29,"tag":63,"props":829,"children":830},{"style":70},[831],{"type":44,"value":832}," |",{"type":29,"tag":63,"props":834,"children":835},{"style":394},[836],{"type":44,"value":837}," undefined",{"type":29,"tag":63,"props":839,"children":840},{"style":76},[841],{"type":44,"value":842},") ",{"type":29,"tag":63,"props":844,"children":845},{"style":70},[846],{"type":44,"value":847},"||",{"type":29,"tag":63,"props":849,"children":850},{"style":87},[851],{"type":44,"value":852}," \"javascript\"",{"type":29,"tag":63,"props":854,"children":855},{"style":76},[856],{"type":44,"value":857},",\n",{"type":29,"tag":63,"props":859,"children":860},{"class":65,"line":178},[861],{"type":29,"tag":63,"props":862,"children":863},{"style":76},[864],{"type":44,"value":865}," });\n",{"type":29,"tag":63,"props":867,"children":868},{"class":65,"line":213},[869],{"type":29,"tag":63,"props":870,"children":871},{"emptyLinePlaceholder":97},[872],{"type":44,"value":100},{"type":29,"tag":63,"props":874,"children":875},{"class":65,"line":251},[876,880,885,889,894,899,903,908,913,917],{"type":29,"tag":63,"props":877,"children":878},{"style":70},[879],{"type":44,"value":144},{"type":29,"tag":63,"props":881,"children":882},{"style":394},[883],{"type":44,"value":884}," clientConnection",{"type":29,"tag":63,"props":886,"children":887},{"style":70},[888],{"type":44,"value":155},{"type":29,"tag":63,"props":890,"children":891},{"style":70},[892],{"type":44,"value":893}," new",{"type":29,"tag":63,"props":895,"children":896},{"style":117},[897],{"type":44,"value":898}," Connection",{"type":29,"tag":63,"props":900,"children":901},{"style":76},[902],{"type":44,"value":238},{"type":29,"tag":63,"props":904,"children":905},{"style":394},[906],{"type":44,"value":907},"undefined",{"type":29,"tag":63,"props":909,"children":910},{"style":76},[911],{"type":44,"value":912},", ",{"type":29,"tag":63,"props":914,"children":915},{"style":394},[916],{"type":44,"value":907},{"type":29,"tag":63,"props":918,"children":919},{"style":76},[920],{"type":44,"value":429},{"type":29,"tag":63,"props":922,"children":924},{"class":65,"line":923},8,[925,930,935],{"type":29,"tag":63,"props":926,"children":927},{"style":76},[928],{"type":44,"value":929}," clientConnection.",{"type":29,"tag":63,"props":931,"children":932},{"style":117},[933],{"type":44,"value":934},"useRawBuffers",{"type":29,"tag":63,"props":936,"children":937},{"style":76},[938],{"type":44,"value":939},"();\n",{"type":29,"tag":63,"props":941,"children":943},{"class":65,"line":942},9,[944,948,953,957,961,966,970,975,981],{"type":29,"tag":63,"props":945,"children":946},{"style":70},[947],{"type":44,"value":144},{"type":29,"tag":63,"props":949,"children":950},{"style":394},[951],{"type":44,"value":952}," dispatcherConnection",{"type":29,"tag":63,"props":954,"children":955},{"style":70},[956],{"type":44,"value":155},{"type":29,"tag":63,"props":958,"children":959},{"style":70},[960],{"type":44,"value":893},{"type":29,"tag":63,"props":962,"children":963},{"style":117},[964],{"type":44,"value":965}," DispatcherConnection",{"type":29,"tag":63,"props":967,"children":968},{"style":76},[969],{"type":44,"value":238},{"type":29,"tag":63,"props":971,"children":972},{"style":394},[973],{"type":44,"value":974},"true",{"type":29,"tag":63,"props":976,"children":978},{"style":977},"--shiki-default:#6A737D",[979],{"type":44,"value":980}," /* local */",{"type":29,"tag":63,"props":982,"children":983},{"style":76},[984],{"type":44,"value":429},{"type":29,"tag":63,"props":986,"children":988},{"class":65,"line":987},10,[989],{"type":29,"tag":63,"props":990,"children":991},{"emptyLinePlaceholder":97},[992],{"type":44,"value":100},{"type":29,"tag":63,"props":994,"children":996},{"class":65,"line":995},11,[997],{"type":29,"tag":63,"props":998,"children":999},{"style":977},[1000],{"type":44,"value":1001}," // Dispatch synchronously at first.\n",{"type":29,"tag":63,"props":1003,"children":1005},{"class":65,"line":1004},12,[1006,1011,1016,1020,1025,1030,1034],{"type":29,"tag":63,"props":1007,"children":1008},{"style":76},[1009],{"type":44,"value":1010}," dispatcherConnection.",{"type":29,"tag":63,"props":1012,"children":1013},{"style":117},[1014],{"type":44,"value":1015},"onmessage",{"type":29,"tag":63,"props":1017,"children":1018},{"style":70},[1019],{"type":44,"value":155},{"type":29,"tag":63,"props":1021,"children":1022},{"style":76},[1023],{"type":44,"value":1024}," (",{"type":29,"tag":63,"props":1026,"children":1027},{"style":147},[1028],{"type":44,"value":1029},"message",{"type":29,"tag":63,"props":1031,"children":1032},{"style":76},[1033],{"type":44,"value":842},{"type":29,"tag":63,"props":1035,"children":1036},{"style":70},[1037],{"type":44,"value":1038},"=>\n",{"type":29,"tag":63,"props":1040,"children":1041},{"class":65,"line":23},[1042,1047,1052],{"type":29,"tag":63,"props":1043,"children":1044},{"style":76},[1045],{"type":44,"value":1046}," clientConnection.",{"type":29,"tag":63,"props":1048,"children":1049},{"style":117},[1050],{"type":44,"value":1051},"dispatch",{"type":29,"tag":63,"props":1053,"children":1054},{"style":76},[1055],{"type":44,"value":1056},"(message);\n",{"type":29,"tag":63,"props":1058,"children":1060},{"class":65,"line":1059},14,[1061,1065,1069,1073,1077,1081,1085],{"type":29,"tag":63,"props":1062,"children":1063},{"style":76},[1064],{"type":44,"value":929},{"type":29,"tag":63,"props":1066,"children":1067},{"style":117},[1068],{"type":44,"value":1015},{"type":29,"tag":63,"props":1070,"children":1071},{"style":70},[1072],{"type":44,"value":155},{"type":29,"tag":63,"props":1074,"children":1075},{"style":76},[1076],{"type":44,"value":1024},{"type":29,"tag":63,"props":1078,"children":1079},{"style":147},[1080],{"type":44,"value":1029},{"type":29,"tag":63,"props":1082,"children":1083},{"style":76},[1084],{"type":44,"value":842},{"type":29,"tag":63,"props":1086,"children":1087},{"style":70},[1088],{"type":44,"value":1038},{"type":29,"tag":63,"props":1090,"children":1092},{"class":65,"line":1091},15,[1093,1098,1102],{"type":29,"tag":63,"props":1094,"children":1095},{"style":76},[1096],{"type":44,"value":1097}," dispatcherConnection.",{"type":29,"tag":63,"props":1099,"children":1100},{"style":117},[1101],{"type":44,"value":1051},{"type":29,"tag":63,"props":1103,"children":1104},{"style":76},[1105],{"type":44,"value":1056},{"type":29,"tag":63,"props":1107,"children":1109},{"class":65,"line":1108},16,[1110],{"type":29,"tag":63,"props":1111,"children":1112},{"emptyLinePlaceholder":97},[1113],{"type":44,"value":100},{"type":29,"tag":63,"props":1115,"children":1117},{"class":65,"line":1116},17,[1118,1122,1127,1131,1135,1140],{"type":29,"tag":63,"props":1119,"children":1120},{"style":70},[1121],{"type":44,"value":144},{"type":29,"tag":63,"props":1123,"children":1124},{"style":394},[1125],{"type":44,"value":1126}," rootScope",{"type":29,"tag":63,"props":1128,"children":1129},{"style":70},[1130],{"type":44,"value":155},{"type":29,"tag":63,"props":1132,"children":1133},{"style":70},[1134],{"type":44,"value":893},{"type":29,"tag":63,"props":1136,"children":1137},{"style":117},[1138],{"type":44,"value":1139}," RootDispatcher",{"type":29,"tag":63,"props":1141,"children":1142},{"style":76},[1143],{"type":44,"value":1144},"(dispatcherConnection);\n",{"type":29,"tag":63,"props":1146,"children":1148},{"class":65,"line":1147},18,[1149],{"type":29,"tag":63,"props":1150,"children":1151},{"emptyLinePlaceholder":97},[1152],{"type":44,"value":100},{"type":29,"tag":63,"props":1154,"children":1156},{"class":65,"line":1155},19,[1157],{"type":29,"tag":63,"props":1158,"children":1159},{"style":977},[1160],{"type":44,"value":1161}," // Initialize Playwright channel.\n",{"type":29,"tag":63,"props":1163,"children":1165},{"class":65,"line":1164},20,[1166,1171,1176],{"type":29,"tag":63,"props":1167,"children":1168},{"style":70},[1169],{"type":44,"value":1170}," new",{"type":29,"tag":63,"props":1172,"children":1173},{"style":117},[1174],{"type":44,"value":1175}," PlaywrightDispatcher",{"type":29,"tag":63,"props":1177,"children":1178},{"style":76},[1179],{"type":44,"value":1180},"(rootScope, playwright);\n",{"type":29,"tag":63,"props":1182,"children":1184},{"class":65,"line":1183},21,[1185,1189,1194,1198,1203,1208],{"type":29,"tag":63,"props":1186,"children":1187},{"style":70},[1188],{"type":44,"value":144},{"type":29,"tag":63,"props":1190,"children":1191},{"style":394},[1192],{"type":44,"value":1193}," playwrightAPI",{"type":29,"tag":63,"props":1195,"children":1196},{"style":70},[1197],{"type":44,"value":155},{"type":29,"tag":63,"props":1199,"children":1200},{"style":76},[1201],{"type":44,"value":1202}," clientConnection.",{"type":29,"tag":63,"props":1204,"children":1205},{"style":117},[1206],{"type":44,"value":1207},"getObjectWithKnownName",{"type":29,"tag":63,"props":1209,"children":1210},{"style":76},[1211],{"type":44,"value":1212},"(\n",{"type":29,"tag":63,"props":1214,"children":1216},{"class":65,"line":1215},22,[1217],{"type":29,"tag":63,"props":1218,"children":1219},{"style":87},[1220],{"type":44,"value":1221}," \"Playwright\"\n",{"type":29,"tag":63,"props":1223,"children":1225},{"class":65,"line":1224},23,[1226,1231,1236,1240],{"type":29,"tag":63,"props":1227,"children":1228},{"style":76},[1229],{"type":44,"value":1230}," ) ",{"type":29,"tag":63,"props":1232,"children":1233},{"style":70},[1234],{"type":44,"value":1235},"as",{"type":29,"tag":63,"props":1237,"children":1238},{"style":117},[1239],{"type":44,"value":766},{"type":29,"tag":63,"props":1241,"children":1242},{"style":76},[1243],{"type":44,"value":1244},";\n",{"type":29,"tag":63,"props":1246,"children":1248},{"class":65,"line":1247},24,[1249,1254,1259,1263,1268],{"type":29,"tag":63,"props":1250,"children":1251},{"style":76},[1252],{"type":44,"value":1253}," playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":1255,"children":1256},{"style":70},[1257],{"type":44,"value":1258},"=",{"type":29,"tag":63,"props":1260,"children":1261},{"style":70},[1262],{"type":44,"value":893},{"type":29,"tag":63,"props":1264,"children":1265},{"style":117},[1266],{"type":44,"value":1267}," BrowserServerLauncherImpl",{"type":29,"tag":63,"props":1269,"children":1270},{"style":76},[1271],{"type":44,"value":1212},{"type":29,"tag":63,"props":1273,"children":1275},{"class":65,"line":1274},25,[1276],{"type":29,"tag":63,"props":1277,"children":1278},{"style":87},[1279],{"type":44,"value":1280}," \"chromium\"\n",{"type":29,"tag":63,"props":1282,"children":1284},{"class":65,"line":1283},26,[1285],{"type":29,"tag":63,"props":1286,"children":1287},{"style":76},[1288],{"type":44,"value":1289}," );\n",{"type":29,"tag":63,"props":1291,"children":1293},{"class":65,"line":1292},27,[1294,1299,1303,1307,1311],{"type":29,"tag":63,"props":1295,"children":1296},{"style":76},[1297],{"type":44,"value":1298}," playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":1300,"children":1301},{"style":70},[1302],{"type":44,"value":1258},{"type":29,"tag":63,"props":1304,"children":1305},{"style":70},[1306],{"type":44,"value":893},{"type":29,"tag":63,"props":1308,"children":1309},{"style":117},[1310],{"type":44,"value":1267},{"type":29,"tag":63,"props":1312,"children":1313},{"style":76},[1314],{"type":44,"value":1212},{"type":29,"tag":63,"props":1316,"children":1318},{"class":65,"line":1317},28,[1319],{"type":29,"tag":63,"props":1320,"children":1321},{"style":87},[1322],{"type":44,"value":1323}," \"firefox\"\n",{"type":29,"tag":63,"props":1325,"children":1327},{"class":65,"line":1326},29,[1328],{"type":29,"tag":63,"props":1329,"children":1330},{"style":76},[1331],{"type":44,"value":1289},{"type":29,"tag":63,"props":1333,"children":1335},{"class":65,"line":1334},30,[1336,1341,1345,1349,1353],{"type":29,"tag":63,"props":1337,"children":1338},{"style":76},[1339],{"type":44,"value":1340}," playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":1342,"children":1343},{"style":70},[1344],{"type":44,"value":1258},{"type":29,"tag":63,"props":1346,"children":1347},{"style":70},[1348],{"type":44,"value":893},{"type":29,"tag":63,"props":1350,"children":1351},{"style":117},[1352],{"type":44,"value":1267},{"type":29,"tag":63,"props":1354,"children":1355},{"style":76},[1356],{"type":44,"value":1212},{"type":29,"tag":63,"props":1358,"children":1360},{"class":65,"line":1359},31,[1361],{"type":29,"tag":63,"props":1362,"children":1363},{"style":87},[1364],{"type":44,"value":1365}," \"webkit\"\n",{"type":29,"tag":63,"props":1367,"children":1369},{"class":65,"line":1368},32,[1370],{"type":29,"tag":63,"props":1371,"children":1372},{"style":76},[1373],{"type":44,"value":1289},{"type":29,"tag":63,"props":1375,"children":1377},{"class":65,"line":1376},33,[1378,1383,1387,1391,1396],{"type":29,"tag":63,"props":1379,"children":1380},{"style":76},[1381],{"type":44,"value":1382}," playwrightAPI._android._serverLauncher ",{"type":29,"tag":63,"props":1384,"children":1385},{"style":70},[1386],{"type":44,"value":1258},{"type":29,"tag":63,"props":1388,"children":1389},{"style":70},[1390],{"type":44,"value":893},{"type":29,"tag":63,"props":1392,"children":1393},{"style":117},[1394],{"type":44,"value":1395}," AndroidServerLauncherImpl",{"type":29,"tag":63,"props":1397,"children":1398},{"style":76},[1399],{"type":44,"value":939},{"type":29,"tag":63,"props":1401,"children":1403},{"class":65,"line":1402},34,[1404],{"type":29,"tag":63,"props":1405,"children":1406},{"emptyLinePlaceholder":97},[1407],{"type":44,"value":100},{"type":29,"tag":63,"props":1409,"children":1411},{"class":65,"line":1410},35,[1412],{"type":29,"tag":63,"props":1413,"children":1414},{"style":977},[1415],{"type":44,"value":1416}," // Switch to async dispatch after we got Playwright object.\n",{"type":29,"tag":63,"props":1418,"children":1420},{"class":65,"line":1419},36,[1421,1425,1429,1433,1437,1441,1445],{"type":29,"tag":63,"props":1422,"children":1423},{"style":76},[1424],{"type":44,"value":1010},{"type":29,"tag":63,"props":1426,"children":1427},{"style":117},[1428],{"type":44,"value":1015},{"type":29,"tag":63,"props":1430,"children":1431},{"style":70},[1432],{"type":44,"value":155},{"type":29,"tag":63,"props":1434,"children":1435},{"style":76},[1436],{"type":44,"value":1024},{"type":29,"tag":63,"props":1438,"children":1439},{"style":147},[1440],{"type":44,"value":1029},{"type":29,"tag":63,"props":1442,"children":1443},{"style":76},[1444],{"type":44,"value":842},{"type":29,"tag":63,"props":1446,"children":1447},{"style":70},[1448],{"type":44,"value":1038},{"type":29,"tag":63,"props":1450,"children":1452},{"class":65,"line":1451},37,[1453,1458,1463,1467,1471,1475],{"type":29,"tag":63,"props":1454,"children":1455},{"style":117},[1456],{"type":44,"value":1457}," setImmediate",{"type":29,"tag":63,"props":1459,"children":1460},{"style":76},[1461],{"type":44,"value":1462},"(() ",{"type":29,"tag":63,"props":1464,"children":1465},{"style":70},[1466],{"type":44,"value":130},{"type":29,"tag":63,"props":1468,"children":1469},{"style":76},[1470],{"type":44,"value":1202},{"type":29,"tag":63,"props":1472,"children":1473},{"style":117},[1474],{"type":44,"value":1051},{"type":29,"tag":63,"props":1476,"children":1477},{"style":76},[1478],{"type":44,"value":1479},"(message));\n",{"type":29,"tag":63,"props":1481,"children":1483},{"class":65,"line":1482},38,[1484,1488,1492,1496,1500,1504,1508],{"type":29,"tag":63,"props":1485,"children":1486},{"style":76},[1487],{"type":44,"value":929},{"type":29,"tag":63,"props":1489,"children":1490},{"style":117},[1491],{"type":44,"value":1015},{"type":29,"tag":63,"props":1493,"children":1494},{"style":70},[1495],{"type":44,"value":155},{"type":29,"tag":63,"props":1497,"children":1498},{"style":76},[1499],{"type":44,"value":1024},{"type":29,"tag":63,"props":1501,"children":1502},{"style":147},[1503],{"type":44,"value":1029},{"type":29,"tag":63,"props":1505,"children":1506},{"style":76},[1507],{"type":44,"value":842},{"type":29,"tag":63,"props":1509,"children":1510},{"style":70},[1511],{"type":44,"value":1038},{"type":29,"tag":63,"props":1513,"children":1515},{"class":65,"line":1514},39,[1516,1520,1524,1528,1533,1537],{"type":29,"tag":63,"props":1517,"children":1518},{"style":117},[1519],{"type":44,"value":1457},{"type":29,"tag":63,"props":1521,"children":1522},{"style":76},[1523],{"type":44,"value":1462},{"type":29,"tag":63,"props":1525,"children":1526},{"style":70},[1527],{"type":44,"value":130},{"type":29,"tag":63,"props":1529,"children":1530},{"style":76},[1531],{"type":44,"value":1532}," dispatcherConnection.",{"type":29,"tag":63,"props":1534,"children":1535},{"style":117},[1536],{"type":44,"value":1051},{"type":29,"tag":63,"props":1538,"children":1539},{"style":76},[1540],{"type":44,"value":1479},{"type":29,"tag":63,"props":1542,"children":1544},{"class":65,"line":1543},40,[1545],{"type":29,"tag":63,"props":1546,"children":1547},{"emptyLinePlaceholder":97},[1548],{"type":44,"value":100},{"type":29,"tag":63,"props":1550,"children":1552},{"class":65,"line":1551},41,[1553,1557,1562,1566,1570,1575,1579,1584,1588],{"type":29,"tag":63,"props":1554,"children":1555},{"style":76},[1556],{"type":44,"value":929},{"type":29,"tag":63,"props":1558,"children":1559},{"style":117},[1560],{"type":44,"value":1561},"toImpl",{"type":29,"tag":63,"props":1563,"children":1564},{"style":70},[1565],{"type":44,"value":155},{"type":29,"tag":63,"props":1567,"children":1568},{"style":76},[1569],{"type":44,"value":1024},{"type":29,"tag":63,"props":1571,"children":1572},{"style":147},[1573],{"type":44,"value":1574},"x",{"type":29,"tag":63,"props":1576,"children":1577},{"style":70},[1578],{"type":44,"value":761},{"type":29,"tag":63,"props":1580,"children":1581},{"style":394},[1582],{"type":44,"value":1583}," any",{"type":29,"tag":63,"props":1585,"children":1586},{"style":76},[1587],{"type":44,"value":842},{"type":29,"tag":63,"props":1589,"children":1590},{"style":70},[1591],{"type":44,"value":1038},{"type":29,"tag":63,"props":1593,"children":1595},{"class":65,"line":1594},42,[1596],{"type":29,"tag":63,"props":1597,"children":1598},{"style":76},[1599],{"type":44,"value":1600}," x\n",{"type":29,"tag":63,"props":1602,"children":1604},{"class":65,"line":1603},43,[1605,1610,1615,1620,1625,1630],{"type":29,"tag":63,"props":1606,"children":1607},{"style":70},[1608],{"type":44,"value":1609}," ?",{"type":29,"tag":63,"props":1611,"children":1612},{"style":76},[1613],{"type":44,"value":1614}," dispatcherConnection._dispatchers.",{"type":29,"tag":63,"props":1616,"children":1617},{"style":117},[1618],{"type":44,"value":1619},"get",{"type":29,"tag":63,"props":1621,"children":1622},{"style":76},[1623],{"type":44,"value":1624},"(x._guid)",{"type":29,"tag":63,"props":1626,"children":1627},{"style":70},[1628],{"type":44,"value":1629},"!",{"type":29,"tag":63,"props":1631,"children":1632},{"style":76},[1633],{"type":44,"value":1634},"._object\n",{"type":29,"tag":63,"props":1636,"children":1638},{"class":65,"line":1637},44,[1639,1644,1648,1652,1656,1661],{"type":29,"tag":63,"props":1640,"children":1641},{"style":70},[1642],{"type":44,"value":1643}," :",{"type":29,"tag":63,"props":1645,"children":1646},{"style":76},[1647],{"type":44,"value":1614},{"type":29,"tag":63,"props":1649,"children":1650},{"style":117},[1651],{"type":44,"value":1619},{"type":29,"tag":63,"props":1653,"children":1654},{"style":76},[1655],{"type":44,"value":238},{"type":29,"tag":63,"props":1657,"children":1658},{"style":87},[1659],{"type":44,"value":1660},"\"\"",{"type":29,"tag":63,"props":1662,"children":1663},{"style":76},[1664],{"type":44,"value":429},{"type":29,"tag":63,"props":1666,"children":1668},{"class":65,"line":1667},45,[1669,1674,1678,1682,1687,1691],{"type":29,"tag":63,"props":1670,"children":1671},{"style":76},[1672],{"type":44,"value":1673}," (playwrightAPI ",{"type":29,"tag":63,"props":1675,"children":1676},{"style":70},[1677],{"type":44,"value":1235},{"type":29,"tag":63,"props":1679,"children":1680},{"style":394},[1681],{"type":44,"value":1583},{"type":29,"tag":63,"props":1683,"children":1684},{"style":76},[1685],{"type":44,"value":1686},")._toImpl ",{"type":29,"tag":63,"props":1688,"children":1689},{"style":70},[1690],{"type":44,"value":1258},{"type":29,"tag":63,"props":1692,"children":1693},{"style":76},[1694],{"type":44,"value":1695}," clientConnection.toImpl;\n",{"type":29,"tag":63,"props":1697,"children":1699},{"class":65,"line":1698},46,[1700,1705],{"type":29,"tag":63,"props":1701,"children":1702},{"style":70},[1703],{"type":44,"value":1704}," return",{"type":29,"tag":63,"props":1706,"children":1707},{"style":76},[1708],{"type":44,"value":1709}," playwrightAPI;\n",{"type":29,"tag":63,"props":1711,"children":1713},{"class":65,"line":1712},47,[1714],{"type":29,"tag":63,"props":1715,"children":1716},{"style":76},[1717],{"type":44,"value":257},{"type":29,"tag":30,"props":1719,"children":1720},{},[1721,1723,1729,1731,1737,1739,1745,1747],{"type":44,"value":1722},"If you scan through the script and look at the return value, you'll see Playwright is returning the ",{"type":29,"tag":59,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":44,"value":1728},"PlaywrightAPI",{"type":44,"value":1730}," instance ",{"type":29,"tag":59,"props":1732,"children":1734},{"className":1733},[],[1735],{"type":44,"value":1736},"playwrightAPI",{"type":44,"value":1738},", which is defined somewhere within the client library ",{"type":29,"tag":59,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":44,"value":1744},"playwright-core/src/client/",{"type":44,"value":1746}," (which we find from our type hints). So when we write a script using ",{"type":29,"tag":59,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":44,"value":287},{"type":29,"tag":52,"props":1753,"children":1756},{"className":54,"code":1754,"filename":1755,"language":56,"meta":7,"style":7},"import { chromium } from \"playwright-core\";\n","my-automation-script.ts",[1757],{"type":29,"tag":59,"props":1758,"children":1759},{"__ignoreMap":7},[1760],{"type":29,"tag":63,"props":1761,"children":1762},{"class":65,"line":66},[1763,1767,1771,1775,1780],{"type":29,"tag":63,"props":1764,"children":1765},{"style":70},[1766],{"type":44,"value":73},{"type":29,"tag":63,"props":1768,"children":1769},{"style":76},[1770],{"type":44,"value":79},{"type":29,"tag":63,"props":1772,"children":1773},{"style":70},[1774],{"type":44,"value":84},{"type":29,"tag":63,"props":1776,"children":1777},{"style":87},[1778],{"type":44,"value":1779}," \"playwright-core\"",{"type":29,"tag":63,"props":1781,"children":1782},{"style":76},[1783],{"type":44,"value":1244},{"type":29,"tag":30,"props":1785,"children":1786},{},[1787,1789,1794,1796,1802],{"type":44,"value":1788},"really we are making an import of the ",{"type":29,"tag":59,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":44,"value":1736},{"type":44,"value":1795}," object and accessing its ",{"type":29,"tag":59,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":44,"value":1801},"chromium",{"type":44,"value":1803}," property, so our script is secretly",{"type":29,"tag":52,"props":1805,"children":1807},{"className":54,"code":1806,"filename":1755,"language":56,"meta":7,"style":7},"import playwrightAPI from \"playwright-core\";\nconst { chromium } = playwrightAPI;\n",[1808],{"type":29,"tag":59,"props":1809,"children":1810},{"__ignoreMap":7},[1811,1835],{"type":29,"tag":63,"props":1812,"children":1813},{"class":65,"line":66},[1814,1818,1823,1827,1831],{"type":29,"tag":63,"props":1815,"children":1816},{"style":70},[1817],{"type":44,"value":73},{"type":29,"tag":63,"props":1819,"children":1820},{"style":76},[1821],{"type":44,"value":1822}," playwrightAPI ",{"type":29,"tag":63,"props":1824,"children":1825},{"style":70},[1826],{"type":44,"value":84},{"type":29,"tag":63,"props":1828,"children":1829},{"style":87},[1830],{"type":44,"value":1779},{"type":29,"tag":63,"props":1832,"children":1833},{"style":76},[1834],{"type":44,"value":1244},{"type":29,"tag":63,"props":1836,"children":1837},{"class":65,"line":93},[1838,1843,1848,1852,1857,1861],{"type":29,"tag":63,"props":1839,"children":1840},{"style":70},[1841],{"type":44,"value":1842},"const",{"type":29,"tag":63,"props":1844,"children":1845},{"style":76},[1846],{"type":44,"value":1847}," { ",{"type":29,"tag":63,"props":1849,"children":1850},{"style":394},[1851],{"type":44,"value":1801},{"type":29,"tag":63,"props":1853,"children":1854},{"style":76},[1855],{"type":44,"value":1856}," } ",{"type":29,"tag":63,"props":1858,"children":1859},{"style":70},[1860],{"type":44,"value":1258},{"type":29,"tag":63,"props":1862,"children":1863},{"style":76},[1864],{"type":44,"value":1709},{"type":29,"tag":30,"props":1866,"children":1867},{},[1868],{"type":44,"value":1869},"Tracing where this object is instantiated, we find the call",{"type":29,"tag":52,"props":1871,"children":1873},{"className":54,"code":1872,"filename":730,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\n \"Playwright\"\n) as PlaywrightAPI;\n",[1874],{"type":29,"tag":59,"props":1875,"children":1876},{"__ignoreMap":7},[1877,1904,1912],{"type":29,"tag":63,"props":1878,"children":1879},{"class":65,"line":66},[1880,1884,1888,1892,1896,1900],{"type":29,"tag":63,"props":1881,"children":1882},{"style":70},[1883],{"type":44,"value":1842},{"type":29,"tag":63,"props":1885,"children":1886},{"style":394},[1887],{"type":44,"value":1193},{"type":29,"tag":63,"props":1889,"children":1890},{"style":70},[1891],{"type":44,"value":155},{"type":29,"tag":63,"props":1893,"children":1894},{"style":76},[1895],{"type":44,"value":1202},{"type":29,"tag":63,"props":1897,"children":1898},{"style":117},[1899],{"type":44,"value":1207},{"type":29,"tag":63,"props":1901,"children":1902},{"style":76},[1903],{"type":44,"value":1212},{"type":29,"tag":63,"props":1905,"children":1906},{"class":65,"line":93},[1907],{"type":29,"tag":63,"props":1908,"children":1909},{"style":87},[1910],{"type":44,"value":1911}," \"Playwright\"\n",{"type":29,"tag":63,"props":1913,"children":1914},{"class":65,"line":103},[1915,1919,1923,1927],{"type":29,"tag":63,"props":1916,"children":1917},{"style":76},[1918],{"type":44,"value":842},{"type":29,"tag":63,"props":1920,"children":1921},{"style":70},[1922],{"type":44,"value":1235},{"type":29,"tag":63,"props":1924,"children":1925},{"style":117},[1926],{"type":44,"value":766},{"type":29,"tag":63,"props":1928,"children":1929},{"style":76},[1930],{"type":44,"value":1244},{"type":29,"tag":30,"props":1932,"children":1933},{},[1934,1936,1941],{"type":44,"value":1935},"which is not very descriptive. If you try looking in the ",{"type":29,"tag":59,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":44,"value":679},{"type":44,"value":1942}," class definition, you won't get very far either, you'll just see",{"type":29,"tag":52,"props":1944,"children":1947},{"className":54,"code":1945,"filename":1946,"language":56,"meta":7,"style":7},"export class Connection extends EventEmitter {\n readonly _objects = new Map\u003Cstring, ChannelOwner>();\n // ...\n getObjectWithKnownName(guid: string): any {\n return this._objects.get(guid)!;\n }\n}\n","packages/playwright-core/src/client/connection.ts",[1948],{"type":29,"tag":59,"props":1949,"children":1950},{"__ignoreMap":7},[1951,1981,2030,2038,2081,2116,2124],{"type":29,"tag":63,"props":1952,"children":1953},{"class":65,"line":66},[1954,1958,1963,1967,1972,1977],{"type":29,"tag":63,"props":1955,"children":1956},{"style":70},[1957],{"type":44,"value":742},{"type":29,"tag":63,"props":1959,"children":1960},{"style":70},[1961],{"type":44,"value":1962}," class",{"type":29,"tag":63,"props":1964,"children":1965},{"style":117},[1966],{"type":44,"value":898},{"type":29,"tag":63,"props":1968,"children":1969},{"style":70},[1970],{"type":44,"value":1971}," extends",{"type":29,"tag":63,"props":1973,"children":1974},{"style":117},[1975],{"type":44,"value":1976}," EventEmitter",{"type":29,"tag":63,"props":1978,"children":1979},{"style":76},[1980],{"type":44,"value":135},{"type":29,"tag":63,"props":1982,"children":1983},{"class":65,"line":93},[1984,1989,1994,1998,2002,2007,2012,2017,2021,2025],{"type":29,"tag":63,"props":1985,"children":1986},{"style":70},[1987],{"type":44,"value":1988}," readonly",{"type":29,"tag":63,"props":1990,"children":1991},{"style":147},[1992],{"type":44,"value":1993}," _objects",{"type":29,"tag":63,"props":1995,"children":1996},{"style":70},[1997],{"type":44,"value":155},{"type":29,"tag":63,"props":1999,"children":2000},{"style":70},[2001],{"type":44,"value":893},{"type":29,"tag":63,"props":2003,"children":2004},{"style":117},[2005],{"type":44,"value":2006}," Map",{"type":29,"tag":63,"props":2008,"children":2009},{"style":76},[2010],{"type":44,"value":2011},"\u003C",{"type":29,"tag":63,"props":2013,"children":2014},{"style":394},[2015],{"type":44,"value":2016},"string",{"type":29,"tag":63,"props":2018,"children":2019},{"style":76},[2020],{"type":44,"value":912},{"type":29,"tag":63,"props":2022,"children":2023},{"style":117},[2024],{"type":44,"value":604},{"type":29,"tag":63,"props":2026,"children":2027},{"style":76},[2028],{"type":44,"value":2029},">();\n",{"type":29,"tag":63,"props":2031,"children":2032},{"class":65,"line":103},[2033],{"type":29,"tag":63,"props":2034,"children":2035},{"style":977},[2036],{"type":44,"value":2037}," // ...\n",{"type":29,"tag":63,"props":2039,"children":2040},{"class":65,"line":138},[2041,2046,2050,2055,2059,2064,2069,2073,2077],{"type":29,"tag":63,"props":2042,"children":2043},{"style":117},[2044],{"type":44,"value":2045}," getObjectWithKnownName",{"type":29,"tag":63,"props":2047,"children":2048},{"style":76},[2049],{"type":44,"value":238},{"type":29,"tag":63,"props":2051,"children":2052},{"style":147},[2053],{"type":44,"value":2054},"guid",{"type":29,"tag":63,"props":2056,"children":2057},{"style":70},[2058],{"type":44,"value":761},{"type":29,"tag":63,"props":2060,"children":2061},{"style":394},[2062],{"type":44,"value":2063}," string",{"type":29,"tag":63,"props":2065,"children":2066},{"style":76},[2067],{"type":44,"value":2068},")",{"type":29,"tag":63,"props":2070,"children":2071},{"style":70},[2072],{"type":44,"value":761},{"type":29,"tag":63,"props":2074,"children":2075},{"style":394},[2076],{"type":44,"value":1583},{"type":29,"tag":63,"props":2078,"children":2079},{"style":76},[2080],{"type":44,"value":135},{"type":29,"tag":63,"props":2082,"children":2083},{"class":65,"line":178},[2084,2089,2094,2099,2103,2108,2112],{"type":29,"tag":63,"props":2085,"children":2086},{"style":70},[2087],{"type":44,"value":2088}," return",{"type":29,"tag":63,"props":2090,"children":2091},{"style":394},[2092],{"type":44,"value":2093}," this",{"type":29,"tag":63,"props":2095,"children":2096},{"style":76},[2097],{"type":44,"value":2098},"._objects.",{"type":29,"tag":63,"props":2100,"children":2101},{"style":117},[2102],{"type":44,"value":1619},{"type":29,"tag":63,"props":2104,"children":2105},{"style":76},[2106],{"type":44,"value":2107},"(guid)",{"type":29,"tag":63,"props":2109,"children":2110},{"style":70},[2111],{"type":44,"value":1629},{"type":29,"tag":63,"props":2113,"children":2114},{"style":76},[2115],{"type":44,"value":1244},{"type":29,"tag":63,"props":2117,"children":2118},{"class":65,"line":213},[2119],{"type":29,"tag":63,"props":2120,"children":2121},{"style":76},[2122],{"type":44,"value":2123}," }\n",{"type":29,"tag":63,"props":2125,"children":2126},{"class":65,"line":251},[2127],{"type":29,"tag":63,"props":2128,"children":2129},{"style":76},[2130],{"type":44,"value":257},{"type":29,"tag":30,"props":2132,"children":2133},{},[2134,2136,2141,2143,2149,2151,2156,2158,2164],{"type":44,"value":2135},"which is even more opaque. From this all we know is the ",{"type":29,"tag":59,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":44,"value":679},{"type":44,"value":2142}," class keeps an ",{"type":29,"tag":59,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":44,"value":2148},"_objects",{"type":44,"value":2150}," map which at some point contains an instance of ",{"type":29,"tag":59,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":44,"value":1728},{"type":44,"value":2157},", so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within ",{"type":29,"tag":59,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":44,"value":2163},"inProcessFactory",{"type":44,"value":2165}," will give us a clear picture of how this library is wrapped together.",{"type":29,"tag":39,"props":2167,"children":2169},{"id":2168},"cross-communication-between-client-and-server",[2170],{"type":44,"value":2171},"Cross communication between client and server",{"type":29,"tag":30,"props":2173,"children":2174},{},[2175,2177,2182,2184,2190,2192,2198,2200,2205,2207,2212,2214,2220],{"type":44,"value":2176},"If you look through the script's imports, anything with ",{"type":29,"tag":59,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":44,"value":619},{"type":44,"value":2183}," in its name, and ",{"type":29,"tag":59,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":44,"value":2189},"createPlaywright",{"type":44,"value":2191},", come from the ",{"type":29,"tag":59,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":44,"value":2197},"server",{"type":44,"value":2199}," directroy. The ",{"type":29,"tag":59,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":44,"value":2189},{"type":44,"value":2206}," function creates an instance of the ",{"type":29,"tag":59,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":44,"value":12},{"type":44,"value":2213}," class defined in ",{"type":29,"tag":59,"props":2215,"children":2217},{"className":2216},[],[2218],{"type":44,"value":2219},"packages/playwright-core/server/playwright.ts",{"type":44,"value":228},{"type":29,"tag":30,"props":2222,"children":2223},{},[2224,2226,2231,2232,2237,2239,2244,2246,2251,2253,2258,2260,2266,2267,2272],{"type":44,"value":2225},"Similarly, the imports for ",{"type":29,"tag":59,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":44,"value":1728},{"type":44,"value":2238}," come from the ",{"type":29,"tag":59,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":44,"value":519},{"type":44,"value":2245}," directory. Looking through the first lines of ",{"type":29,"tag":59,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":44,"value":2163},{"type":44,"value":2252},", there is an instantiation of the server ",{"type":29,"tag":59,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":44,"value":12},{"type":44,"value":2259}," class and instantiation of objects for the ",{"type":29,"tag":59,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":44,"value":2265},"ClientConnection",{"type":44,"value":281},{"type":29,"tag":59,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":44,"value":687},{"type":44,"value":2273}," classes",{"type":29,"tag":52,"props":2275,"children":2277},{"className":54,"code":2276,"filename":730,"language":56,"meta":7,"style":7},"const playwright = createPlaywright({\n sdkLanguage:\n (process.env.PW_LANG_NAME as Language | undefined) || \"javascript\",\n});\n\nconst clientConnection = new Connection(undefined, undefined);\nclientConnection.useRawBuffers();\nconst dispatcherConnection = new DispatcherConnection(true /* local */);\n",[2278],{"type":29,"tag":59,"props":2279,"children":2280},{"__ignoreMap":7},[2281,2304,2312,2356,2364,2371,2414,2430],{"type":29,"tag":63,"props":2282,"children":2283},{"class":65,"line":66},[2284,2288,2292,2296,2300],{"type":29,"tag":63,"props":2285,"children":2286},{"style":70},[2287],{"type":44,"value":1842},{"type":29,"tag":63,"props":2289,"children":2290},{"style":394},[2291],{"type":44,"value":782},{"type":29,"tag":63,"props":2293,"children":2294},{"style":70},[2295],{"type":44,"value":155},{"type":29,"tag":63,"props":2297,"children":2298},{"style":117},[2299],{"type":44,"value":791},{"type":29,"tag":63,"props":2301,"children":2302},{"style":76},[2303],{"type":44,"value":796},{"type":29,"tag":63,"props":2305,"children":2306},{"class":65,"line":93},[2307],{"type":29,"tag":63,"props":2308,"children":2309},{"style":76},[2310],{"type":44,"value":2311}," sdkLanguage:\n",{"type":29,"tag":63,"props":2313,"children":2314},{"class":65,"line":103},[2315,2320,2324,2328,2332,2336,2340,2344,2348,2352],{"type":29,"tag":63,"props":2316,"children":2317},{"style":76},[2318],{"type":44,"value":2319}," (process.env.",{"type":29,"tag":63,"props":2321,"children":2322},{"style":394},[2323],{"type":44,"value":817},{"type":29,"tag":63,"props":2325,"children":2326},{"style":70},[2327],{"type":44,"value":822},{"type":29,"tag":63,"props":2329,"children":2330},{"style":117},[2331],{"type":44,"value":827},{"type":29,"tag":63,"props":2333,"children":2334},{"style":70},[2335],{"type":44,"value":832},{"type":29,"tag":63,"props":2337,"children":2338},{"style":394},[2339],{"type":44,"value":837},{"type":29,"tag":63,"props":2341,"children":2342},{"style":76},[2343],{"type":44,"value":842},{"type":29,"tag":63,"props":2345,"children":2346},{"style":70},[2347],{"type":44,"value":847},{"type":29,"tag":63,"props":2349,"children":2350},{"style":87},[2351],{"type":44,"value":852},{"type":29,"tag":63,"props":2353,"children":2354},{"style":76},[2355],{"type":44,"value":857},{"type":29,"tag":63,"props":2357,"children":2358},{"class":65,"line":138},[2359],{"type":29,"tag":63,"props":2360,"children":2361},{"style":76},[2362],{"type":44,"value":2363},"});\n",{"type":29,"tag":63,"props":2365,"children":2366},{"class":65,"line":178},[2367],{"type":29,"tag":63,"props":2368,"children":2369},{"emptyLinePlaceholder":97},[2370],{"type":44,"value":100},{"type":29,"tag":63,"props":2372,"children":2373},{"class":65,"line":213},[2374,2378,2382,2386,2390,2394,2398,2402,2406,2410],{"type":29,"tag":63,"props":2375,"children":2376},{"style":70},[2377],{"type":44,"value":1842},{"type":29,"tag":63,"props":2379,"children":2380},{"style":394},[2381],{"type":44,"value":884},{"type":29,"tag":63,"props":2383,"children":2384},{"style":70},[2385],{"type":44,"value":155},{"type":29,"tag":63,"props":2387,"children":2388},{"style":70},[2389],{"type":44,"value":893},{"type":29,"tag":63,"props":2391,"children":2392},{"style":117},[2393],{"type":44,"value":898},{"type":29,"tag":63,"props":2395,"children":2396},{"style":76},[2397],{"type":44,"value":238},{"type":29,"tag":63,"props":2399,"children":2400},{"style":394},[2401],{"type":44,"value":907},{"type":29,"tag":63,"props":2403,"children":2404},{"style":76},[2405],{"type":44,"value":912},{"type":29,"tag":63,"props":2407,"children":2408},{"style":394},[2409],{"type":44,"value":907},{"type":29,"tag":63,"props":2411,"children":2412},{"style":76},[2413],{"type":44,"value":429},{"type":29,"tag":63,"props":2415,"children":2416},{"class":65,"line":251},[2417,2422,2426],{"type":29,"tag":63,"props":2418,"children":2419},{"style":76},[2420],{"type":44,"value":2421},"clientConnection.",{"type":29,"tag":63,"props":2423,"children":2424},{"style":117},[2425],{"type":44,"value":934},{"type":29,"tag":63,"props":2427,"children":2428},{"style":76},[2429],{"type":44,"value":939},{"type":29,"tag":63,"props":2431,"children":2432},{"class":65,"line":923},[2433,2437,2441,2445,2449,2453,2457,2461,2465],{"type":29,"tag":63,"props":2434,"children":2435},{"style":70},[2436],{"type":44,"value":1842},{"type":29,"tag":63,"props":2438,"children":2439},{"style":394},[2440],{"type":44,"value":952},{"type":29,"tag":63,"props":2442,"children":2443},{"style":70},[2444],{"type":44,"value":155},{"type":29,"tag":63,"props":2446,"children":2447},{"style":70},[2448],{"type":44,"value":893},{"type":29,"tag":63,"props":2450,"children":2451},{"style":117},[2452],{"type":44,"value":965},{"type":29,"tag":63,"props":2454,"children":2455},{"style":76},[2456],{"type":44,"value":238},{"type":29,"tag":63,"props":2458,"children":2459},{"style":394},[2460],{"type":44,"value":974},{"type":29,"tag":63,"props":2462,"children":2463},{"style":977},[2464],{"type":44,"value":980},{"type":29,"tag":63,"props":2466,"children":2467},{"style":76},[2468],{"type":44,"value":429},{"type":29,"tag":30,"props":2470,"children":2471},{},[2472],{"type":44,"value":2473},"The next lines of code are the bridge between the internal client and server libraries",{"type":29,"tag":52,"props":2475,"children":2477},{"className":54,"code":2476,"filename":730,"language":56,"meta":7,"style":7},"dispatcherConnection.onmessage = (message) =>\n clientConnection.dispatch(message);\nclientConnection.onmessage = (message) =>\n dispatcherConnection.dispatch(message);\n",[2478],{"type":29,"tag":59,"props":2479,"children":2480},{"__ignoreMap":7},[2481,2513,2528,2559],{"type":29,"tag":63,"props":2482,"children":2483},{"class":65,"line":66},[2484,2489,2493,2497,2501,2505,2509],{"type":29,"tag":63,"props":2485,"children":2486},{"style":76},[2487],{"type":44,"value":2488},"dispatcherConnection.",{"type":29,"tag":63,"props":2490,"children":2491},{"style":117},[2492],{"type":44,"value":1015},{"type":29,"tag":63,"props":2494,"children":2495},{"style":70},[2496],{"type":44,"value":155},{"type":29,"tag":63,"props":2498,"children":2499},{"style":76},[2500],{"type":44,"value":1024},{"type":29,"tag":63,"props":2502,"children":2503},{"style":147},[2504],{"type":44,"value":1029},{"type":29,"tag":63,"props":2506,"children":2507},{"style":76},[2508],{"type":44,"value":842},{"type":29,"tag":63,"props":2510,"children":2511},{"style":70},[2512],{"type":44,"value":1038},{"type":29,"tag":63,"props":2514,"children":2515},{"class":65,"line":93},[2516,2520,2524],{"type":29,"tag":63,"props":2517,"children":2518},{"style":76},[2519],{"type":44,"value":929},{"type":29,"tag":63,"props":2521,"children":2522},{"style":117},[2523],{"type":44,"value":1051},{"type":29,"tag":63,"props":2525,"children":2526},{"style":76},[2527],{"type":44,"value":1056},{"type":29,"tag":63,"props":2529,"children":2530},{"class":65,"line":103},[2531,2535,2539,2543,2547,2551,2555],{"type":29,"tag":63,"props":2532,"children":2533},{"style":76},[2534],{"type":44,"value":2421},{"type":29,"tag":63,"props":2536,"children":2537},{"style":117},[2538],{"type":44,"value":1015},{"type":29,"tag":63,"props":2540,"children":2541},{"style":70},[2542],{"type":44,"value":155},{"type":29,"tag":63,"props":2544,"children":2545},{"style":76},[2546],{"type":44,"value":1024},{"type":29,"tag":63,"props":2548,"children":2549},{"style":147},[2550],{"type":44,"value":1029},{"type":29,"tag":63,"props":2552,"children":2553},{"style":76},[2554],{"type":44,"value":842},{"type":29,"tag":63,"props":2556,"children":2557},{"style":70},[2558],{"type":44,"value":1038},{"type":29,"tag":63,"props":2560,"children":2561},{"class":65,"line":138},[2562,2566,2570],{"type":29,"tag":63,"props":2563,"children":2564},{"style":76},[2565],{"type":44,"value":1010},{"type":29,"tag":63,"props":2567,"children":2568},{"style":117},[2569],{"type":44,"value":1051},{"type":29,"tag":63,"props":2571,"children":2572},{"style":76},[2573],{"type":44,"value":1056},{"type":29,"tag":30,"props":2575,"children":2576},{},[2577,2579,2584,2586,2591,2593,2598,2600,2606,2608,2614,2616,2621,2623,2629],{"type":44,"value":2578},"given by setting the ",{"type":29,"tag":59,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":44,"value":1015},{"type":44,"value":2585}," properties for each of these objects. Notice each ",{"type":29,"tag":59,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":44,"value":1015},{"type":44,"value":2592}," calls the other's ",{"type":29,"tag":59,"props":2594,"children":2596},{"className":2595},[],[2597],{"type":44,"value":1051},{"type":44,"value":2599}," method; i.e., ",{"type":29,"tag":59,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":44,"value":2605},"dispatcherConnection",{"type":44,"value":2607}," calls the ",{"type":29,"tag":59,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":44,"value":2613},"clientConnection.dispatch",{"type":44,"value":2615}," through ",{"type":29,"tag":59,"props":2617,"children":2619},{"className":2618},[],[2620],{"type":44,"value":1015},{"type":44,"value":2622}," and vice versa. This gives us the hint somehow ",{"type":29,"tag":59,"props":2624,"children":2626},{"className":2625},[],[2627],{"type":44,"value":2628},"dispatcherConnection.onmessage",{"type":44,"value":2630}," will be called somewhere in the codebase.",{"type":29,"tag":269,"props":2632,"children":2634},{"id":2633},"server-side-createplaywright",[2635],{"type":44,"value":2636},"Server-side createPlaywright",{"type":29,"tag":30,"props":2638,"children":2639},{},[2640,2642,2647,2649,2654,2656,2661,2662,2667],{"type":44,"value":2641},"Before we continue down the logic within ",{"type":29,"tag":59,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":44,"value":504},{"type":44,"value":2648},", let's go over what the ",{"type":29,"tag":59,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":44,"value":2189},{"type":44,"value":2655}," function actually does. It is a simple function call which instantiates the ",{"type":29,"tag":59,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":44,"value":12},{"type":44,"value":2213},{"type":29,"tag":59,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":44,"value":2219},{"type":44,"value":2668},". Below is a simplified version of it",{"type":29,"tag":52,"props":2670,"children":2672},{"className":54,"code":2671,"filename":2219,"language":56,"meta":7,"style":7},"import { Chromium } from \"./chromium/chromium\";\nimport { Firefox } from \"./firefox/firefox\";\nimport { Selectors } from \"./selectors\";\nimport { WebKit } from \"./webkit/webkit\";\nimport { createInstrumentation, SdkObject } from \"./instrumentation\";\n\nexport class Playwright extends SdkObject {\n readonly selectors: Selectors;\n readonly chromium: Chromium;\n readonly android: Android;\n readonly electron: Electron;\n readonly firefox: Firefox;\n readonly webkit: WebKit;\n readonly options: PlaywrightOptions;\n readonly debugController: DebugController;\n\n constructor(options: PlaywrightOptions) {\n super(\n { attribution: {}, instrumentation: createInstrumentation() } as any,\n undefined,\n \"Playwright\"\n );\n this.options = options;\n this.chromium = new Chromium(this);\n this.firefox = new Firefox(this);\n this.webkit = new WebKit(this);\n this.selectors = new Selectors();\n this.debugController = new DebugController(this);\n }\n}\n",[2673],{"type":29,"tag":59,"props":2674,"children":2675},{"__ignoreMap":7},[2676,2701,2726,2751,2776,2801,2808,2837,2862,2887,2912,2937,2962,2987,3012,3037,3044,3074,3086,3116,3128,3136,3144,3166,3203,3239,3275,3303,3339,3346],{"type":29,"tag":63,"props":2677,"children":2678},{"class":65,"line":66},[2679,2683,2688,2692,2697],{"type":29,"tag":63,"props":2680,"children":2681},{"style":70},[2682],{"type":44,"value":73},{"type":29,"tag":63,"props":2684,"children":2685},{"style":76},[2686],{"type":44,"value":2687}," { Chromium } ",{"type":29,"tag":63,"props":2689,"children":2690},{"style":70},[2691],{"type":44,"value":84},{"type":29,"tag":63,"props":2693,"children":2694},{"style":87},[2695],{"type":44,"value":2696}," \"./chromium/chromium\"",{"type":29,"tag":63,"props":2698,"children":2699},{"style":76},[2700],{"type":44,"value":1244},{"type":29,"tag":63,"props":2702,"children":2703},{"class":65,"line":93},[2704,2708,2713,2717,2722],{"type":29,"tag":63,"props":2705,"children":2706},{"style":70},[2707],{"type":44,"value":73},{"type":29,"tag":63,"props":2709,"children":2710},{"style":76},[2711],{"type":44,"value":2712}," { Firefox } ",{"type":29,"tag":63,"props":2714,"children":2715},{"style":70},[2716],{"type":44,"value":84},{"type":29,"tag":63,"props":2718,"children":2719},{"style":87},[2720],{"type":44,"value":2721}," \"./firefox/firefox\"",{"type":29,"tag":63,"props":2723,"children":2724},{"style":76},[2725],{"type":44,"value":1244},{"type":29,"tag":63,"props":2727,"children":2728},{"class":65,"line":103},[2729,2733,2738,2742,2747],{"type":29,"tag":63,"props":2730,"children":2731},{"style":70},[2732],{"type":44,"value":73},{"type":29,"tag":63,"props":2734,"children":2735},{"style":76},[2736],{"type":44,"value":2737}," { Selectors } ",{"type":29,"tag":63,"props":2739,"children":2740},{"style":70},[2741],{"type":44,"value":84},{"type":29,"tag":63,"props":2743,"children":2744},{"style":87},[2745],{"type":44,"value":2746}," \"./selectors\"",{"type":29,"tag":63,"props":2748,"children":2749},{"style":76},[2750],{"type":44,"value":1244},{"type":29,"tag":63,"props":2752,"children":2753},{"class":65,"line":138},[2754,2758,2763,2767,2772],{"type":29,"tag":63,"props":2755,"children":2756},{"style":70},[2757],{"type":44,"value":73},{"type":29,"tag":63,"props":2759,"children":2760},{"style":76},[2761],{"type":44,"value":2762}," { WebKit } ",{"type":29,"tag":63,"props":2764,"children":2765},{"style":70},[2766],{"type":44,"value":84},{"type":29,"tag":63,"props":2768,"children":2769},{"style":87},[2770],{"type":44,"value":2771}," \"./webkit/webkit\"",{"type":29,"tag":63,"props":2773,"children":2774},{"style":76},[2775],{"type":44,"value":1244},{"type":29,"tag":63,"props":2777,"children":2778},{"class":65,"line":178},[2779,2783,2788,2792,2797],{"type":29,"tag":63,"props":2780,"children":2781},{"style":70},[2782],{"type":44,"value":73},{"type":29,"tag":63,"props":2784,"children":2785},{"style":76},[2786],{"type":44,"value":2787}," { createInstrumentation, SdkObject } ",{"type":29,"tag":63,"props":2789,"children":2790},{"style":70},[2791],{"type":44,"value":84},{"type":29,"tag":63,"props":2793,"children":2794},{"style":87},[2795],{"type":44,"value":2796}," \"./instrumentation\"",{"type":29,"tag":63,"props":2798,"children":2799},{"style":76},[2800],{"type":44,"value":1244},{"type":29,"tag":63,"props":2802,"children":2803},{"class":65,"line":213},[2804],{"type":29,"tag":63,"props":2805,"children":2806},{"emptyLinePlaceholder":97},[2807],{"type":44,"value":100},{"type":29,"tag":63,"props":2809,"children":2810},{"class":65,"line":251},[2811,2815,2819,2824,2828,2833],{"type":29,"tag":63,"props":2812,"children":2813},{"style":70},[2814],{"type":44,"value":742},{"type":29,"tag":63,"props":2816,"children":2817},{"style":70},[2818],{"type":44,"value":1962},{"type":29,"tag":63,"props":2820,"children":2821},{"style":117},[2822],{"type":44,"value":2823}," Playwright",{"type":29,"tag":63,"props":2825,"children":2826},{"style":70},[2827],{"type":44,"value":1971},{"type":29,"tag":63,"props":2829,"children":2830},{"style":117},[2831],{"type":44,"value":2832}," SdkObject",{"type":29,"tag":63,"props":2834,"children":2835},{"style":76},[2836],{"type":44,"value":135},{"type":29,"tag":63,"props":2838,"children":2839},{"class":65,"line":923},[2840,2844,2849,2853,2858],{"type":29,"tag":63,"props":2841,"children":2842},{"style":70},[2843],{"type":44,"value":1988},{"type":29,"tag":63,"props":2845,"children":2846},{"style":147},[2847],{"type":44,"value":2848}," selectors",{"type":29,"tag":63,"props":2850,"children":2851},{"style":70},[2852],{"type":44,"value":761},{"type":29,"tag":63,"props":2854,"children":2855},{"style":117},[2856],{"type":44,"value":2857}," Selectors",{"type":29,"tag":63,"props":2859,"children":2860},{"style":76},[2861],{"type":44,"value":1244},{"type":29,"tag":63,"props":2863,"children":2864},{"class":65,"line":942},[2865,2869,2874,2878,2883],{"type":29,"tag":63,"props":2866,"children":2867},{"style":70},[2868],{"type":44,"value":1988},{"type":29,"tag":63,"props":2870,"children":2871},{"style":147},[2872],{"type":44,"value":2873}," chromium",{"type":29,"tag":63,"props":2875,"children":2876},{"style":70},[2877],{"type":44,"value":761},{"type":29,"tag":63,"props":2879,"children":2880},{"style":117},[2881],{"type":44,"value":2882}," Chromium",{"type":29,"tag":63,"props":2884,"children":2885},{"style":76},[2886],{"type":44,"value":1244},{"type":29,"tag":63,"props":2888,"children":2889},{"class":65,"line":987},[2890,2894,2899,2903,2908],{"type":29,"tag":63,"props":2891,"children":2892},{"style":70},[2893],{"type":44,"value":1988},{"type":29,"tag":63,"props":2895,"children":2896},{"style":147},[2897],{"type":44,"value":2898}," android",{"type":29,"tag":63,"props":2900,"children":2901},{"style":70},[2902],{"type":44,"value":761},{"type":29,"tag":63,"props":2904,"children":2905},{"style":117},[2906],{"type":44,"value":2907}," Android",{"type":29,"tag":63,"props":2909,"children":2910},{"style":76},[2911],{"type":44,"value":1244},{"type":29,"tag":63,"props":2913,"children":2914},{"class":65,"line":995},[2915,2919,2924,2928,2933],{"type":29,"tag":63,"props":2916,"children":2917},{"style":70},[2918],{"type":44,"value":1988},{"type":29,"tag":63,"props":2920,"children":2921},{"style":147},[2922],{"type":44,"value":2923}," electron",{"type":29,"tag":63,"props":2925,"children":2926},{"style":70},[2927],{"type":44,"value":761},{"type":29,"tag":63,"props":2929,"children":2930},{"style":117},[2931],{"type":44,"value":2932}," Electron",{"type":29,"tag":63,"props":2934,"children":2935},{"style":76},[2936],{"type":44,"value":1244},{"type":29,"tag":63,"props":2938,"children":2939},{"class":65,"line":1004},[2940,2944,2949,2953,2958],{"type":29,"tag":63,"props":2941,"children":2942},{"style":70},[2943],{"type":44,"value":1988},{"type":29,"tag":63,"props":2945,"children":2946},{"style":147},[2947],{"type":44,"value":2948}," firefox",{"type":29,"tag":63,"props":2950,"children":2951},{"style":70},[2952],{"type":44,"value":761},{"type":29,"tag":63,"props":2954,"children":2955},{"style":117},[2956],{"type":44,"value":2957}," Firefox",{"type":29,"tag":63,"props":2959,"children":2960},{"style":76},[2961],{"type":44,"value":1244},{"type":29,"tag":63,"props":2963,"children":2964},{"class":65,"line":23},[2965,2969,2974,2978,2983],{"type":29,"tag":63,"props":2966,"children":2967},{"style":70},[2968],{"type":44,"value":1988},{"type":29,"tag":63,"props":2970,"children":2971},{"style":147},[2972],{"type":44,"value":2973}," webkit",{"type":29,"tag":63,"props":2975,"children":2976},{"style":70},[2977],{"type":44,"value":761},{"type":29,"tag":63,"props":2979,"children":2980},{"style":117},[2981],{"type":44,"value":2982}," WebKit",{"type":29,"tag":63,"props":2984,"children":2985},{"style":76},[2986],{"type":44,"value":1244},{"type":29,"tag":63,"props":2988,"children":2989},{"class":65,"line":1059},[2990,2994,2999,3003,3008],{"type":29,"tag":63,"props":2991,"children":2992},{"style":70},[2993],{"type":44,"value":1988},{"type":29,"tag":63,"props":2995,"children":2996},{"style":147},[2997],{"type":44,"value":2998}," options",{"type":29,"tag":63,"props":3000,"children":3001},{"style":70},[3002],{"type":44,"value":761},{"type":29,"tag":63,"props":3004,"children":3005},{"style":117},[3006],{"type":44,"value":3007}," PlaywrightOptions",{"type":29,"tag":63,"props":3009,"children":3010},{"style":76},[3011],{"type":44,"value":1244},{"type":29,"tag":63,"props":3013,"children":3014},{"class":65,"line":1091},[3015,3019,3024,3028,3033],{"type":29,"tag":63,"props":3016,"children":3017},{"style":70},[3018],{"type":44,"value":1988},{"type":29,"tag":63,"props":3020,"children":3021},{"style":147},[3022],{"type":44,"value":3023}," debugController",{"type":29,"tag":63,"props":3025,"children":3026},{"style":70},[3027],{"type":44,"value":761},{"type":29,"tag":63,"props":3029,"children":3030},{"style":117},[3031],{"type":44,"value":3032}," DebugController",{"type":29,"tag":63,"props":3034,"children":3035},{"style":76},[3036],{"type":44,"value":1244},{"type":29,"tag":63,"props":3038,"children":3039},{"class":65,"line":1108},[3040],{"type":29,"tag":63,"props":3041,"children":3042},{"emptyLinePlaceholder":97},[3043],{"type":44,"value":100},{"type":29,"tag":63,"props":3045,"children":3046},{"class":65,"line":1116},[3047,3052,3056,3061,3065,3069],{"type":29,"tag":63,"props":3048,"children":3049},{"style":70},[3050],{"type":44,"value":3051}," constructor",{"type":29,"tag":63,"props":3053,"children":3054},{"style":76},[3055],{"type":44,"value":238},{"type":29,"tag":63,"props":3057,"children":3058},{"style":147},[3059],{"type":44,"value":3060},"options",{"type":29,"tag":63,"props":3062,"children":3063},{"style":70},[3064],{"type":44,"value":761},{"type":29,"tag":63,"props":3066,"children":3067},{"style":117},[3068],{"type":44,"value":3007},{"type":29,"tag":63,"props":3070,"children":3071},{"style":76},[3072],{"type":44,"value":3073},") {\n",{"type":29,"tag":63,"props":3075,"children":3076},{"class":65,"line":1147},[3077,3082],{"type":29,"tag":63,"props":3078,"children":3079},{"style":394},[3080],{"type":44,"value":3081}," super",{"type":29,"tag":63,"props":3083,"children":3084},{"style":76},[3085],{"type":44,"value":1212},{"type":29,"tag":63,"props":3087,"children":3088},{"class":65,"line":1155},[3089,3094,3099,3104,3108,3112],{"type":29,"tag":63,"props":3090,"children":3091},{"style":76},[3092],{"type":44,"value":3093}," { attribution: {}, instrumentation: ",{"type":29,"tag":63,"props":3095,"children":3096},{"style":117},[3097],{"type":44,"value":3098},"createInstrumentation",{"type":29,"tag":63,"props":3100,"children":3101},{"style":76},[3102],{"type":44,"value":3103},"() } ",{"type":29,"tag":63,"props":3105,"children":3106},{"style":70},[3107],{"type":44,"value":1235},{"type":29,"tag":63,"props":3109,"children":3110},{"style":394},[3111],{"type":44,"value":1583},{"type":29,"tag":63,"props":3113,"children":3114},{"style":76},[3115],{"type":44,"value":857},{"type":29,"tag":63,"props":3117,"children":3118},{"class":65,"line":1164},[3119,3124],{"type":29,"tag":63,"props":3120,"children":3121},{"style":394},[3122],{"type":44,"value":3123}," undefined",{"type":29,"tag":63,"props":3125,"children":3126},{"style":76},[3127],{"type":44,"value":857},{"type":29,"tag":63,"props":3129,"children":3130},{"class":65,"line":1183},[3131],{"type":29,"tag":63,"props":3132,"children":3133},{"style":87},[3134],{"type":44,"value":3135}," \"Playwright\"\n",{"type":29,"tag":63,"props":3137,"children":3138},{"class":65,"line":1215},[3139],{"type":29,"tag":63,"props":3140,"children":3141},{"style":76},[3142],{"type":44,"value":3143}," );\n",{"type":29,"tag":63,"props":3145,"children":3146},{"class":65,"line":1224},[3147,3152,3157,3161],{"type":29,"tag":63,"props":3148,"children":3149},{"style":394},[3150],{"type":44,"value":3151}," this",{"type":29,"tag":63,"props":3153,"children":3154},{"style":76},[3155],{"type":44,"value":3156},".options ",{"type":29,"tag":63,"props":3158,"children":3159},{"style":70},[3160],{"type":44,"value":1258},{"type":29,"tag":63,"props":3162,"children":3163},{"style":76},[3164],{"type":44,"value":3165}," options;\n",{"type":29,"tag":63,"props":3167,"children":3168},{"class":65,"line":1247},[3169,3173,3178,3182,3186,3190,3194,3199],{"type":29,"tag":63,"props":3170,"children":3171},{"style":394},[3172],{"type":44,"value":3151},{"type":29,"tag":63,"props":3174,"children":3175},{"style":76},[3176],{"type":44,"value":3177},".chromium ",{"type":29,"tag":63,"props":3179,"children":3180},{"style":70},[3181],{"type":44,"value":1258},{"type":29,"tag":63,"props":3183,"children":3184},{"style":70},[3185],{"type":44,"value":893},{"type":29,"tag":63,"props":3187,"children":3188},{"style":117},[3189],{"type":44,"value":2882},{"type":29,"tag":63,"props":3191,"children":3192},{"style":76},[3193],{"type":44,"value":238},{"type":29,"tag":63,"props":3195,"children":3196},{"style":394},[3197],{"type":44,"value":3198},"this",{"type":29,"tag":63,"props":3200,"children":3201},{"style":76},[3202],{"type":44,"value":429},{"type":29,"tag":63,"props":3204,"children":3205},{"class":65,"line":1274},[3206,3210,3215,3219,3223,3227,3231,3235],{"type":29,"tag":63,"props":3207,"children":3208},{"style":394},[3209],{"type":44,"value":3151},{"type":29,"tag":63,"props":3211,"children":3212},{"style":76},[3213],{"type":44,"value":3214},".firefox ",{"type":29,"tag":63,"props":3216,"children":3217},{"style":70},[3218],{"type":44,"value":1258},{"type":29,"tag":63,"props":3220,"children":3221},{"style":70},[3222],{"type":44,"value":893},{"type":29,"tag":63,"props":3224,"children":3225},{"style":117},[3226],{"type":44,"value":2957},{"type":29,"tag":63,"props":3228,"children":3229},{"style":76},[3230],{"type":44,"value":238},{"type":29,"tag":63,"props":3232,"children":3233},{"style":394},[3234],{"type":44,"value":3198},{"type":29,"tag":63,"props":3236,"children":3237},{"style":76},[3238],{"type":44,"value":429},{"type":29,"tag":63,"props":3240,"children":3241},{"class":65,"line":1283},[3242,3246,3251,3255,3259,3263,3267,3271],{"type":29,"tag":63,"props":3243,"children":3244},{"style":394},[3245],{"type":44,"value":3151},{"type":29,"tag":63,"props":3247,"children":3248},{"style":76},[3249],{"type":44,"value":3250},".webkit ",{"type":29,"tag":63,"props":3252,"children":3253},{"style":70},[3254],{"type":44,"value":1258},{"type":29,"tag":63,"props":3256,"children":3257},{"style":70},[3258],{"type":44,"value":893},{"type":29,"tag":63,"props":3260,"children":3261},{"style":117},[3262],{"type":44,"value":2982},{"type":29,"tag":63,"props":3264,"children":3265},{"style":76},[3266],{"type":44,"value":238},{"type":29,"tag":63,"props":3268,"children":3269},{"style":394},[3270],{"type":44,"value":3198},{"type":29,"tag":63,"props":3272,"children":3273},{"style":76},[3274],{"type":44,"value":429},{"type":29,"tag":63,"props":3276,"children":3277},{"class":65,"line":1292},[3278,3282,3287,3291,3295,3299],{"type":29,"tag":63,"props":3279,"children":3280},{"style":394},[3281],{"type":44,"value":3151},{"type":29,"tag":63,"props":3283,"children":3284},{"style":76},[3285],{"type":44,"value":3286},".selectors ",{"type":29,"tag":63,"props":3288,"children":3289},{"style":70},[3290],{"type":44,"value":1258},{"type":29,"tag":63,"props":3292,"children":3293},{"style":70},[3294],{"type":44,"value":893},{"type":29,"tag":63,"props":3296,"children":3297},{"style":117},[3298],{"type":44,"value":2857},{"type":29,"tag":63,"props":3300,"children":3301},{"style":76},[3302],{"type":44,"value":939},{"type":29,"tag":63,"props":3304,"children":3305},{"class":65,"line":1317},[3306,3310,3315,3319,3323,3327,3331,3335],{"type":29,"tag":63,"props":3307,"children":3308},{"style":394},[3309],{"type":44,"value":3151},{"type":29,"tag":63,"props":3311,"children":3312},{"style":76},[3313],{"type":44,"value":3314},".debugController ",{"type":29,"tag":63,"props":3316,"children":3317},{"style":70},[3318],{"type":44,"value":1258},{"type":29,"tag":63,"props":3320,"children":3321},{"style":70},[3322],{"type":44,"value":893},{"type":29,"tag":63,"props":3324,"children":3325},{"style":117},[3326],{"type":44,"value":3032},{"type":29,"tag":63,"props":3328,"children":3329},{"style":76},[3330],{"type":44,"value":238},{"type":29,"tag":63,"props":3332,"children":3333},{"style":394},[3334],{"type":44,"value":3198},{"type":29,"tag":63,"props":3336,"children":3337},{"style":76},[3338],{"type":44,"value":429},{"type":29,"tag":63,"props":3340,"children":3341},{"class":65,"line":1326},[3342],{"type":29,"tag":63,"props":3343,"children":3344},{"style":76},[3345],{"type":44,"value":2123},{"type":29,"tag":63,"props":3347,"children":3348},{"class":65,"line":1334},[3349],{"type":29,"tag":63,"props":3350,"children":3351},{"style":76},[3352],{"type":44,"value":257},{"type":29,"tag":30,"props":3354,"children":3355},{},[3356,3358,3364,3366,3371],{"type":44,"value":3357},"This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into ",{"type":29,"tag":59,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":44,"value":3363},"packages/playwright-core/server/chromium/",{"type":44,"value":3365}," you will see all the functionality for automating a ",{"type":29,"tag":59,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":44,"value":1801},{"type":44,"value":201},{"type":29,"tag":269,"props":3373,"children":3375},{"id":3374},"rootdispatcher-and-server-side-playwright",[3376],{"type":44,"value":3377},"RootDispatcher and server-side Playwright",{"type":29,"tag":30,"props":3379,"children":3380},{},[3381,3383,3388,3390,3396,3398,3404],{"type":44,"value":3382},"Continuing down ",{"type":29,"tag":59,"props":3384,"children":3386},{"className":3385},[],[3387],{"type":44,"value":504},{"type":44,"value":3389},", we see there's the construction of a ",{"type":29,"tag":59,"props":3391,"children":3393},{"className":3392},[],[3394],{"type":44,"value":3395},"RootDispatcher",{"type":44,"value":3397}," instance, and a ",{"type":29,"tag":59,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":44,"value":3403},"PlaywrightDispatcher",{"type":44,"value":3405}," instance.",{"type":29,"tag":52,"props":3407,"children":3409},{"className":54,"code":3408,"filename":730,"language":56,"meta":7,"style":7},"const rootScope = new RootDispatcher(dispatcherConnection);\n\n// Initialize Playwright channel.\nnew PlaywrightDispatcher(rootScope, playwright);\n",[3410],{"type":29,"tag":59,"props":3411,"children":3412},{"__ignoreMap":7},[3413,3440,3447,3455],{"type":29,"tag":63,"props":3414,"children":3415},{"class":65,"line":66},[3416,3420,3424,3428,3432,3436],{"type":29,"tag":63,"props":3417,"children":3418},{"style":70},[3419],{"type":44,"value":1842},{"type":29,"tag":63,"props":3421,"children":3422},{"style":394},[3423],{"type":44,"value":1126},{"type":29,"tag":63,"props":3425,"children":3426},{"style":70},[3427],{"type":44,"value":155},{"type":29,"tag":63,"props":3429,"children":3430},{"style":70},[3431],{"type":44,"value":893},{"type":29,"tag":63,"props":3433,"children":3434},{"style":117},[3435],{"type":44,"value":1139},{"type":29,"tag":63,"props":3437,"children":3438},{"style":76},[3439],{"type":44,"value":1144},{"type":29,"tag":63,"props":3441,"children":3442},{"class":65,"line":93},[3443],{"type":29,"tag":63,"props":3444,"children":3445},{"emptyLinePlaceholder":97},[3446],{"type":44,"value":100},{"type":29,"tag":63,"props":3448,"children":3449},{"class":65,"line":103},[3450],{"type":29,"tag":63,"props":3451,"children":3452},{"style":977},[3453],{"type":44,"value":3454},"// Initialize Playwright channel.\n",{"type":29,"tag":63,"props":3456,"children":3457},{"class":65,"line":138},[3458,3463,3467],{"type":29,"tag":63,"props":3459,"children":3460},{"style":70},[3461],{"type":44,"value":3462},"new",{"type":29,"tag":63,"props":3464,"children":3465},{"style":117},[3466],{"type":44,"value":1175},{"type":29,"tag":63,"props":3468,"children":3469},{"style":76},[3470],{"type":44,"value":1180},{"type":29,"tag":30,"props":3472,"children":3473},{},[3474,3476,3482,3484,3489,3491,3496,3498,3503,3505,3510,3512,3517,3519,3524,3526,3531],{"type":44,"value":3475},"Note the ",{"type":29,"tag":59,"props":3477,"children":3479},{"className":3478},[],[3480],{"type":44,"value":3481},"rootScope",{"type":44,"value":3483}," object is referenced throughout the dispatcher classes, and acts as a wrapper around the ",{"type":29,"tag":59,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":44,"value":2605},{"type":44,"value":3490}," object instantiated above, so that each of the child ",{"type":29,"tag":59,"props":3492,"children":3494},{"className":3493},[],[3495],{"type":44,"value":619},{"type":44,"value":3497}," classes will have access to the ",{"type":29,"tag":59,"props":3499,"children":3501},{"className":3500},[],[3502],{"type":44,"value":2605},{"type":44,"value":3504}," through the ",{"type":29,"tag":59,"props":3506,"children":3508},{"className":3507},[],[3509],{"type":44,"value":3481},{"type":44,"value":3511}," object. This wrapping functionality will become clearer when we dive into ",{"type":29,"tag":59,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":44,"value":3403},{"type":44,"value":3518},"'s constructor, where it passes the ",{"type":29,"tag":59,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":44,"value":3481},{"type":44,"value":3525}," to all of the child ",{"type":29,"tag":59,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":44,"value":619},{"type":44,"value":3532}," classes.",{"type":29,"tag":30,"props":3534,"children":3535},{},[3536,3538,3544],{"type":44,"value":3537},"Here's a simplified version of what's happening in the constructor for ",{"type":29,"tag":59,"props":3539,"children":3541},{"className":3540},[],[3542],{"type":44,"value":3543},"Rootscope",{"type":44,"value":761},{"type":29,"tag":52,"props":3546,"children":3549},{"className":54,"code":3547,"filename":3548,"language":56,"meta":7,"style":7},"class RootDispatcher extends Dispatcher {\n constructor(connection: DispatcherConnection) {\n super(connection, { guid: \"\" }, \"Root\", {});\n }\n}\n\nclass Dispatcher extends EventEmitter {\n _connection: DispatcherConnection;\n _parent: DispatcherConnection | undefined;\n\n constructor(\n parent: ParentScopeType | DispatcherConnection,\n object: Type,\n type: string,\n initializer: channels.InitializerTraits\u003CType>\n ) {\n super();\n\n this._connection =\n parent instanceof DispatcherConnection ? parent : parent._connection;\n this._parent = parent instanceof DispatcherConnection ? undefined : parent;\n\n this._guid = object.guid;\n this._type = type;\n this._object = object;\n\n this._connection.registerDispatcher(this);\n\n if (this._parent)\n this._connection.sendCreate(\n this._parent,\n type,\n guid,\n initializer,\n this._parent._object\n );\n }\n}\n","playwright-core/src/server/dispatchers/dispatcher.ts",[3550],{"type":29,"tag":59,"props":3551,"children":3552},{"__ignoreMap":7},[3553,3578,3606,3637,3644,3651,3658,3681,3701,3729,3736,3747,3776,3797,3817,3857,3865,3876,3883,3900,3936,3982,3989,4010,4031,4052,4059,4088,4095,4116,4137,4150,4158,4166,4174,4186,4194,4201],{"type":29,"tag":63,"props":3554,"children":3555},{"class":65,"line":66},[3556,3561,3565,3569,3574],{"type":29,"tag":63,"props":3557,"children":3558},{"style":70},[3559],{"type":44,"value":3560},"class",{"type":29,"tag":63,"props":3562,"children":3563},{"style":117},[3564],{"type":44,"value":1139},{"type":29,"tag":63,"props":3566,"children":3567},{"style":70},[3568],{"type":44,"value":1971},{"type":29,"tag":63,"props":3570,"children":3571},{"style":117},[3572],{"type":44,"value":3573}," Dispatcher",{"type":29,"tag":63,"props":3575,"children":3576},{"style":76},[3577],{"type":44,"value":135},{"type":29,"tag":63,"props":3579,"children":3580},{"class":65,"line":93},[3581,3585,3589,3594,3598,3602],{"type":29,"tag":63,"props":3582,"children":3583},{"style":70},[3584],{"type":44,"value":3051},{"type":29,"tag":63,"props":3586,"children":3587},{"style":76},[3588],{"type":44,"value":238},{"type":29,"tag":63,"props":3590,"children":3591},{"style":147},[3592],{"type":44,"value":3593},"connection",{"type":29,"tag":63,"props":3595,"children":3596},{"style":70},[3597],{"type":44,"value":761},{"type":29,"tag":63,"props":3599,"children":3600},{"style":117},[3601],{"type":44,"value":965},{"type":29,"tag":63,"props":3603,"children":3604},{"style":76},[3605],{"type":44,"value":3073},{"type":29,"tag":63,"props":3607,"children":3608},{"class":65,"line":103},[3609,3613,3618,3622,3627,3632],{"type":29,"tag":63,"props":3610,"children":3611},{"style":394},[3612],{"type":44,"value":3081},{"type":29,"tag":63,"props":3614,"children":3615},{"style":76},[3616],{"type":44,"value":3617},"(connection, { guid: ",{"type":29,"tag":63,"props":3619,"children":3620},{"style":87},[3621],{"type":44,"value":1660},{"type":29,"tag":63,"props":3623,"children":3624},{"style":76},[3625],{"type":44,"value":3626}," }, ",{"type":29,"tag":63,"props":3628,"children":3629},{"style":87},[3630],{"type":44,"value":3631},"\"Root\"",{"type":29,"tag":63,"props":3633,"children":3634},{"style":76},[3635],{"type":44,"value":3636},", {});\n",{"type":29,"tag":63,"props":3638,"children":3639},{"class":65,"line":138},[3640],{"type":29,"tag":63,"props":3641,"children":3642},{"style":76},[3643],{"type":44,"value":2123},{"type":29,"tag":63,"props":3645,"children":3646},{"class":65,"line":178},[3647],{"type":29,"tag":63,"props":3648,"children":3649},{"style":76},[3650],{"type":44,"value":257},{"type":29,"tag":63,"props":3652,"children":3653},{"class":65,"line":213},[3654],{"type":29,"tag":63,"props":3655,"children":3656},{"emptyLinePlaceholder":97},[3657],{"type":44,"value":100},{"type":29,"tag":63,"props":3659,"children":3660},{"class":65,"line":251},[3661,3665,3669,3673,3677],{"type":29,"tag":63,"props":3662,"children":3663},{"style":70},[3664],{"type":44,"value":3560},{"type":29,"tag":63,"props":3666,"children":3667},{"style":117},[3668],{"type":44,"value":3573},{"type":29,"tag":63,"props":3670,"children":3671},{"style":70},[3672],{"type":44,"value":1971},{"type":29,"tag":63,"props":3674,"children":3675},{"style":117},[3676],{"type":44,"value":1976},{"type":29,"tag":63,"props":3678,"children":3679},{"style":76},[3680],{"type":44,"value":135},{"type":29,"tag":63,"props":3682,"children":3683},{"class":65,"line":923},[3684,3689,3693,3697],{"type":29,"tag":63,"props":3685,"children":3686},{"style":147},[3687],{"type":44,"value":3688}," _connection",{"type":29,"tag":63,"props":3690,"children":3691},{"style":70},[3692],{"type":44,"value":761},{"type":29,"tag":63,"props":3694,"children":3695},{"style":117},[3696],{"type":44,"value":965},{"type":29,"tag":63,"props":3698,"children":3699},{"style":76},[3700],{"type":44,"value":1244},{"type":29,"tag":63,"props":3702,"children":3703},{"class":65,"line":942},[3704,3709,3713,3717,3721,3725],{"type":29,"tag":63,"props":3705,"children":3706},{"style":147},[3707],{"type":44,"value":3708}," _parent",{"type":29,"tag":63,"props":3710,"children":3711},{"style":70},[3712],{"type":44,"value":761},{"type":29,"tag":63,"props":3714,"children":3715},{"style":117},[3716],{"type":44,"value":965},{"type":29,"tag":63,"props":3718,"children":3719},{"style":70},[3720],{"type":44,"value":832},{"type":29,"tag":63,"props":3722,"children":3723},{"style":394},[3724],{"type":44,"value":837},{"type":29,"tag":63,"props":3726,"children":3727},{"style":76},[3728],{"type":44,"value":1244},{"type":29,"tag":63,"props":3730,"children":3731},{"class":65,"line":987},[3732],{"type":29,"tag":63,"props":3733,"children":3734},{"emptyLinePlaceholder":97},[3735],{"type":44,"value":100},{"type":29,"tag":63,"props":3737,"children":3738},{"class":65,"line":995},[3739,3743],{"type":29,"tag":63,"props":3740,"children":3741},{"style":70},[3742],{"type":44,"value":3051},{"type":29,"tag":63,"props":3744,"children":3745},{"style":76},[3746],{"type":44,"value":1212},{"type":29,"tag":63,"props":3748,"children":3749},{"class":65,"line":1004},[3750,3755,3759,3764,3768,3772],{"type":29,"tag":63,"props":3751,"children":3752},{"style":147},[3753],{"type":44,"value":3754}," parent",{"type":29,"tag":63,"props":3756,"children":3757},{"style":70},[3758],{"type":44,"value":761},{"type":29,"tag":63,"props":3760,"children":3761},{"style":117},[3762],{"type":44,"value":3763}," ParentScopeType",{"type":29,"tag":63,"props":3765,"children":3766},{"style":70},[3767],{"type":44,"value":832},{"type":29,"tag":63,"props":3769,"children":3770},{"style":117},[3771],{"type":44,"value":965},{"type":29,"tag":63,"props":3773,"children":3774},{"style":76},[3775],{"type":44,"value":857},{"type":29,"tag":63,"props":3777,"children":3778},{"class":65,"line":23},[3779,3784,3788,3793],{"type":29,"tag":63,"props":3780,"children":3781},{"style":147},[3782],{"type":44,"value":3783}," object",{"type":29,"tag":63,"props":3785,"children":3786},{"style":70},[3787],{"type":44,"value":761},{"type":29,"tag":63,"props":3789,"children":3790},{"style":117},[3791],{"type":44,"value":3792}," Type",{"type":29,"tag":63,"props":3794,"children":3795},{"style":76},[3796],{"type":44,"value":857},{"type":29,"tag":63,"props":3798,"children":3799},{"class":65,"line":1059},[3800,3805,3809,3813],{"type":29,"tag":63,"props":3801,"children":3802},{"style":147},[3803],{"type":44,"value":3804}," type",{"type":29,"tag":63,"props":3806,"children":3807},{"style":70},[3808],{"type":44,"value":761},{"type":29,"tag":63,"props":3810,"children":3811},{"style":394},[3812],{"type":44,"value":2063},{"type":29,"tag":63,"props":3814,"children":3815},{"style":76},[3816],{"type":44,"value":857},{"type":29,"tag":63,"props":3818,"children":3819},{"class":65,"line":1091},[3820,3825,3829,3834,3838,3843,3847,3852],{"type":29,"tag":63,"props":3821,"children":3822},{"style":147},[3823],{"type":44,"value":3824}," initializer",{"type":29,"tag":63,"props":3826,"children":3827},{"style":70},[3828],{"type":44,"value":761},{"type":29,"tag":63,"props":3830,"children":3831},{"style":117},[3832],{"type":44,"value":3833}," channels",{"type":29,"tag":63,"props":3835,"children":3836},{"style":76},[3837],{"type":44,"value":228},{"type":29,"tag":63,"props":3839,"children":3840},{"style":117},[3841],{"type":44,"value":3842},"InitializerTraits",{"type":29,"tag":63,"props":3844,"children":3845},{"style":76},[3846],{"type":44,"value":2011},{"type":29,"tag":63,"props":3848,"children":3849},{"style":117},[3850],{"type":44,"value":3851},"Type",{"type":29,"tag":63,"props":3853,"children":3854},{"style":76},[3855],{"type":44,"value":3856},">\n",{"type":29,"tag":63,"props":3858,"children":3859},{"class":65,"line":1108},[3860],{"type":29,"tag":63,"props":3861,"children":3862},{"style":76},[3863],{"type":44,"value":3864}," ) {\n",{"type":29,"tag":63,"props":3866,"children":3867},{"class":65,"line":1116},[3868,3872],{"type":29,"tag":63,"props":3869,"children":3870},{"style":394},[3871],{"type":44,"value":3081},{"type":29,"tag":63,"props":3873,"children":3874},{"style":76},[3875],{"type":44,"value":939},{"type":29,"tag":63,"props":3877,"children":3878},{"class":65,"line":1147},[3879],{"type":29,"tag":63,"props":3880,"children":3881},{"emptyLinePlaceholder":97},[3882],{"type":44,"value":100},{"type":29,"tag":63,"props":3884,"children":3885},{"class":65,"line":1155},[3886,3890,3895],{"type":29,"tag":63,"props":3887,"children":3888},{"style":394},[3889],{"type":44,"value":3151},{"type":29,"tag":63,"props":3891,"children":3892},{"style":76},[3893],{"type":44,"value":3894},"._connection ",{"type":29,"tag":63,"props":3896,"children":3897},{"style":70},[3898],{"type":44,"value":3899},"=\n",{"type":29,"tag":63,"props":3901,"children":3902},{"class":65,"line":1164},[3903,3908,3913,3917,3922,3927,3931],{"type":29,"tag":63,"props":3904,"children":3905},{"style":76},[3906],{"type":44,"value":3907}," parent ",{"type":29,"tag":63,"props":3909,"children":3910},{"style":70},[3911],{"type":44,"value":3912},"instanceof",{"type":29,"tag":63,"props":3914,"children":3915},{"style":117},[3916],{"type":44,"value":965},{"type":29,"tag":63,"props":3918,"children":3919},{"style":70},[3920],{"type":44,"value":3921}," ?",{"type":29,"tag":63,"props":3923,"children":3924},{"style":76},[3925],{"type":44,"value":3926}," parent ",{"type":29,"tag":63,"props":3928,"children":3929},{"style":70},[3930],{"type":44,"value":761},{"type":29,"tag":63,"props":3932,"children":3933},{"style":76},[3934],{"type":44,"value":3935}," parent._connection;\n",{"type":29,"tag":63,"props":3937,"children":3938},{"class":65,"line":1183},[3939,3943,3948,3952,3956,3960,3964,3968,3972,3977],{"type":29,"tag":63,"props":3940,"children":3941},{"style":394},[3942],{"type":44,"value":3151},{"type":29,"tag":63,"props":3944,"children":3945},{"style":76},[3946],{"type":44,"value":3947},"._parent ",{"type":29,"tag":63,"props":3949,"children":3950},{"style":70},[3951],{"type":44,"value":1258},{"type":29,"tag":63,"props":3953,"children":3954},{"style":76},[3955],{"type":44,"value":3926},{"type":29,"tag":63,"props":3957,"children":3958},{"style":70},[3959],{"type":44,"value":3912},{"type":29,"tag":63,"props":3961,"children":3962},{"style":117},[3963],{"type":44,"value":965},{"type":29,"tag":63,"props":3965,"children":3966},{"style":70},[3967],{"type":44,"value":3921},{"type":29,"tag":63,"props":3969,"children":3970},{"style":394},[3971],{"type":44,"value":837},{"type":29,"tag":63,"props":3973,"children":3974},{"style":70},[3975],{"type":44,"value":3976}," :",{"type":29,"tag":63,"props":3978,"children":3979},{"style":76},[3980],{"type":44,"value":3981}," parent;\n",{"type":29,"tag":63,"props":3983,"children":3984},{"class":65,"line":1215},[3985],{"type":29,"tag":63,"props":3986,"children":3987},{"emptyLinePlaceholder":97},[3988],{"type":44,"value":100},{"type":29,"tag":63,"props":3990,"children":3991},{"class":65,"line":1224},[3992,3996,4001,4005],{"type":29,"tag":63,"props":3993,"children":3994},{"style":394},[3995],{"type":44,"value":3151},{"type":29,"tag":63,"props":3997,"children":3998},{"style":76},[3999],{"type":44,"value":4000},"._guid ",{"type":29,"tag":63,"props":4002,"children":4003},{"style":70},[4004],{"type":44,"value":1258},{"type":29,"tag":63,"props":4006,"children":4007},{"style":76},[4008],{"type":44,"value":4009}," object.guid;\n",{"type":29,"tag":63,"props":4011,"children":4012},{"class":65,"line":1247},[4013,4017,4022,4026],{"type":29,"tag":63,"props":4014,"children":4015},{"style":394},[4016],{"type":44,"value":3151},{"type":29,"tag":63,"props":4018,"children":4019},{"style":76},[4020],{"type":44,"value":4021},"._type ",{"type":29,"tag":63,"props":4023,"children":4024},{"style":70},[4025],{"type":44,"value":1258},{"type":29,"tag":63,"props":4027,"children":4028},{"style":76},[4029],{"type":44,"value":4030}," type;\n",{"type":29,"tag":63,"props":4032,"children":4033},{"class":65,"line":1274},[4034,4038,4043,4047],{"type":29,"tag":63,"props":4035,"children":4036},{"style":394},[4037],{"type":44,"value":3151},{"type":29,"tag":63,"props":4039,"children":4040},{"style":76},[4041],{"type":44,"value":4042},"._object ",{"type":29,"tag":63,"props":4044,"children":4045},{"style":70},[4046],{"type":44,"value":1258},{"type":29,"tag":63,"props":4048,"children":4049},{"style":76},[4050],{"type":44,"value":4051}," object;\n",{"type":29,"tag":63,"props":4053,"children":4054},{"class":65,"line":1283},[4055],{"type":29,"tag":63,"props":4056,"children":4057},{"emptyLinePlaceholder":97},[4058],{"type":44,"value":100},{"type":29,"tag":63,"props":4060,"children":4061},{"class":65,"line":1292},[4062,4066,4071,4076,4080,4084],{"type":29,"tag":63,"props":4063,"children":4064},{"style":394},[4065],{"type":44,"value":3151},{"type":29,"tag":63,"props":4067,"children":4068},{"style":76},[4069],{"type":44,"value":4070},"._connection.",{"type":29,"tag":63,"props":4072,"children":4073},{"style":117},[4074],{"type":44,"value":4075},"registerDispatcher",{"type":29,"tag":63,"props":4077,"children":4078},{"style":76},[4079],{"type":44,"value":238},{"type":29,"tag":63,"props":4081,"children":4082},{"style":394},[4083],{"type":44,"value":3198},{"type":29,"tag":63,"props":4085,"children":4086},{"style":76},[4087],{"type":44,"value":429},{"type":29,"tag":63,"props":4089,"children":4090},{"class":65,"line":1317},[4091],{"type":29,"tag":63,"props":4092,"children":4093},{"emptyLinePlaceholder":97},[4094],{"type":44,"value":100},{"type":29,"tag":63,"props":4096,"children":4097},{"class":65,"line":1326},[4098,4103,4107,4111],{"type":29,"tag":63,"props":4099,"children":4100},{"style":70},[4101],{"type":44,"value":4102}," if",{"type":29,"tag":63,"props":4104,"children":4105},{"style":76},[4106],{"type":44,"value":1024},{"type":29,"tag":63,"props":4108,"children":4109},{"style":394},[4110],{"type":44,"value":3198},{"type":29,"tag":63,"props":4112,"children":4113},{"style":76},[4114],{"type":44,"value":4115},"._parent)\n",{"type":29,"tag":63,"props":4117,"children":4118},{"class":65,"line":1334},[4119,4124,4128,4133],{"type":29,"tag":63,"props":4120,"children":4121},{"style":394},[4122],{"type":44,"value":4123}," this",{"type":29,"tag":63,"props":4125,"children":4126},{"style":76},[4127],{"type":44,"value":4070},{"type":29,"tag":63,"props":4129,"children":4130},{"style":117},[4131],{"type":44,"value":4132},"sendCreate",{"type":29,"tag":63,"props":4134,"children":4135},{"style":76},[4136],{"type":44,"value":1212},{"type":29,"tag":63,"props":4138,"children":4139},{"class":65,"line":1359},[4140,4145],{"type":29,"tag":63,"props":4141,"children":4142},{"style":394},[4143],{"type":44,"value":4144}," this",{"type":29,"tag":63,"props":4146,"children":4147},{"style":76},[4148],{"type":44,"value":4149},"._parent,\n",{"type":29,"tag":63,"props":4151,"children":4152},{"class":65,"line":1368},[4153],{"type":29,"tag":63,"props":4154,"children":4155},{"style":76},[4156],{"type":44,"value":4157}," type,\n",{"type":29,"tag":63,"props":4159,"children":4160},{"class":65,"line":1376},[4161],{"type":29,"tag":63,"props":4162,"children":4163},{"style":76},[4164],{"type":44,"value":4165}," guid,\n",{"type":29,"tag":63,"props":4167,"children":4168},{"class":65,"line":1402},[4169],{"type":29,"tag":63,"props":4170,"children":4171},{"style":76},[4172],{"type":44,"value":4173}," initializer,\n",{"type":29,"tag":63,"props":4175,"children":4176},{"class":65,"line":1410},[4177,4181],{"type":29,"tag":63,"props":4178,"children":4179},{"style":394},[4180],{"type":44,"value":4144},{"type":29,"tag":63,"props":4182,"children":4183},{"style":76},[4184],{"type":44,"value":4185},"._parent._object\n",{"type":29,"tag":63,"props":4187,"children":4188},{"class":65,"line":1419},[4189],{"type":29,"tag":63,"props":4190,"children":4191},{"style":76},[4192],{"type":44,"value":4193}," );\n",{"type":29,"tag":63,"props":4195,"children":4196},{"class":65,"line":1451},[4197],{"type":29,"tag":63,"props":4198,"children":4199},{"style":76},[4200],{"type":44,"value":2123},{"type":29,"tag":63,"props":4202,"children":4203},{"class":65,"line":1482},[4204],{"type":29,"tag":63,"props":4205,"children":4206},{"style":76},[4207],{"type":44,"value":257},{"type":29,"tag":30,"props":4209,"children":4210},{},[4211,4213,4218,4220,4225,4227,4232,4234,4240,4242,4247,4249,4254,4256,4261,4263,4268,4270,4275,4277,4282,4284,4289,4291,4296],{"type":44,"value":4212},"In the ",{"type":29,"tag":59,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":44,"value":619},{"type":44,"value":4219}," constructor we see the connection always comes from either the inherited parent ",{"type":29,"tag":59,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":44,"value":619},{"type":44,"value":4226},", or from the ",{"type":29,"tag":59,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":44,"value":687},{"type":44,"value":4233}," passed into the ",{"type":29,"tag":59,"props":4235,"children":4237},{"className":4236},[],[4238],{"type":44,"value":4239},"parent",{"type":44,"value":4241}," parameter. This, coupled with ",{"type":29,"tag":59,"props":4243,"children":4245},{"className":4244},[],[4246],{"type":44,"value":3481},{"type":44,"value":4248}," having the name ",{"type":29,"tag":59,"props":4250,"children":4252},{"className":4251},[],[4253],{"type":44,"value":26},{"type":44,"value":4255},", gives us the hint that every dispatcher in the server library will have access to the ",{"type":29,"tag":59,"props":4257,"children":4259},{"className":4258},[],[4260],{"type":44,"value":2605},{"type":44,"value":4262}," instance (from ",{"type":29,"tag":59,"props":4264,"children":4266},{"className":4265},[],[4267],{"type":44,"value":504},{"type":44,"value":4269},"). Furthermore, the ",{"type":29,"tag":59,"props":4271,"children":4273},{"className":4272},[],[4274],{"type":44,"value":2605},{"type":44,"value":4276}," will register every instance of a subclass of ",{"type":29,"tag":59,"props":4278,"children":4280},{"className":4279},[],[4281],{"type":44,"value":619},{"type":44,"value":4283},", hinting that it will communicate with each of the ",{"type":29,"tag":59,"props":4285,"children":4287},{"className":4286},[],[4288],{"type":44,"value":619},{"type":44,"value":4290}," objects. These points will become more clear after looking at the ",{"type":29,"tag":59,"props":4292,"children":4294},{"className":4293},[],[4295],{"type":44,"value":3403},{"type":44,"value":4297},"'s constructor.",{"type":29,"tag":4299,"props":4300,"children":4302},"h4",{"id":4301},"playwrightdispatcher-and-its-constructor",[4303],{"type":44,"value":4304},"PlaywrightDispatcher and its constructor",{"type":29,"tag":30,"props":4306,"children":4307},{},[4308,4310,4315],{"type":44,"value":4309},"Let's look closer at a slightly simplified version of ",{"type":29,"tag":59,"props":4311,"children":4313},{"className":4312},[],[4314],{"type":44,"value":3403},{"type":44,"value":4316},"'s constructor",{"type":29,"tag":52,"props":4318,"children":4321},{"className":54,"code":4319,"filename":4320,"language":56,"meta":7,"style":7},"import type { Playwright } from \"playwright-core/src/server/playwright\";\n\nclass PlaywrightDispatcher extends Dispatcher {\n constructor(scope: RootDispatcher, playwright: Playwright) {\n super(scope, playwright, \"Playwright\", {\n chromium: new BrowserTypeDispatcher(scope, playwright.chromium),\n firefox: new BrowserTypeDispatcher(scope, playwright.firefox),\n webkit: new BrowserTypeDispatcher(scope, playwright.webkit),\n // ...\n });\n }\n}\n","packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts",[4322],{"type":29,"tag":59,"props":4323,"children":4324},{"__ignoreMap":7},[4325,4355,4362,4385,4429,4451,4473,4494,4515,4523,4531,4538],{"type":29,"tag":63,"props":4326,"children":4327},{"class":65,"line":66},[4328,4332,4337,4342,4346,4351],{"type":29,"tag":63,"props":4329,"children":4330},{"style":70},[4331],{"type":44,"value":73},{"type":29,"tag":63,"props":4333,"children":4334},{"style":70},[4335],{"type":44,"value":4336}," type",{"type":29,"tag":63,"props":4338,"children":4339},{"style":76},[4340],{"type":44,"value":4341}," { Playwright } ",{"type":29,"tag":63,"props":4343,"children":4344},{"style":70},[4345],{"type":44,"value":84},{"type":29,"tag":63,"props":4347,"children":4348},{"style":87},[4349],{"type":44,"value":4350}," \"playwright-core/src/server/playwright\"",{"type":29,"tag":63,"props":4352,"children":4353},{"style":76},[4354],{"type":44,"value":1244},{"type":29,"tag":63,"props":4356,"children":4357},{"class":65,"line":93},[4358],{"type":29,"tag":63,"props":4359,"children":4360},{"emptyLinePlaceholder":97},[4361],{"type":44,"value":100},{"type":29,"tag":63,"props":4363,"children":4364},{"class":65,"line":103},[4365,4369,4373,4377,4381],{"type":29,"tag":63,"props":4366,"children":4367},{"style":70},[4368],{"type":44,"value":3560},{"type":29,"tag":63,"props":4370,"children":4371},{"style":117},[4372],{"type":44,"value":1175},{"type":29,"tag":63,"props":4374,"children":4375},{"style":70},[4376],{"type":44,"value":1971},{"type":29,"tag":63,"props":4378,"children":4379},{"style":117},[4380],{"type":44,"value":3573},{"type":29,"tag":63,"props":4382,"children":4383},{"style":76},[4384],{"type":44,"value":135},{"type":29,"tag":63,"props":4386,"children":4387},{"class":65,"line":138},[4388,4392,4396,4401,4405,4409,4413,4417,4421,4425],{"type":29,"tag":63,"props":4389,"children":4390},{"style":70},[4391],{"type":44,"value":3051},{"type":29,"tag":63,"props":4393,"children":4394},{"style":76},[4395],{"type":44,"value":238},{"type":29,"tag":63,"props":4397,"children":4398},{"style":147},[4399],{"type":44,"value":4400},"scope",{"type":29,"tag":63,"props":4402,"children":4403},{"style":70},[4404],{"type":44,"value":761},{"type":29,"tag":63,"props":4406,"children":4407},{"style":117},[4408],{"type":44,"value":1139},{"type":29,"tag":63,"props":4410,"children":4411},{"style":76},[4412],{"type":44,"value":912},{"type":29,"tag":63,"props":4414,"children":4415},{"style":147},[4416],{"type":44,"value":5},{"type":29,"tag":63,"props":4418,"children":4419},{"style":70},[4420],{"type":44,"value":761},{"type":29,"tag":63,"props":4422,"children":4423},{"style":117},[4424],{"type":44,"value":2823},{"type":29,"tag":63,"props":4426,"children":4427},{"style":76},[4428],{"type":44,"value":3073},{"type":29,"tag":63,"props":4430,"children":4431},{"class":65,"line":178},[4432,4436,4441,4446],{"type":29,"tag":63,"props":4433,"children":4434},{"style":394},[4435],{"type":44,"value":3081},{"type":29,"tag":63,"props":4437,"children":4438},{"style":76},[4439],{"type":44,"value":4440},"(scope, playwright, ",{"type":29,"tag":63,"props":4442,"children":4443},{"style":87},[4444],{"type":44,"value":4445},"\"Playwright\"",{"type":29,"tag":63,"props":4447,"children":4448},{"style":76},[4449],{"type":44,"value":4450},", {\n",{"type":29,"tag":63,"props":4452,"children":4453},{"class":65,"line":213},[4454,4459,4463,4468],{"type":29,"tag":63,"props":4455,"children":4456},{"style":76},[4457],{"type":44,"value":4458}," chromium: ",{"type":29,"tag":63,"props":4460,"children":4461},{"style":70},[4462],{"type":44,"value":3462},{"type":29,"tag":63,"props":4464,"children":4465},{"style":117},[4466],{"type":44,"value":4467}," BrowserTypeDispatcher",{"type":29,"tag":63,"props":4469,"children":4470},{"style":76},[4471],{"type":44,"value":4472},"(scope, playwright.chromium),\n",{"type":29,"tag":63,"props":4474,"children":4475},{"class":65,"line":251},[4476,4481,4485,4489],{"type":29,"tag":63,"props":4477,"children":4478},{"style":76},[4479],{"type":44,"value":4480}," firefox: ",{"type":29,"tag":63,"props":4482,"children":4483},{"style":70},[4484],{"type":44,"value":3462},{"type":29,"tag":63,"props":4486,"children":4487},{"style":117},[4488],{"type":44,"value":4467},{"type":29,"tag":63,"props":4490,"children":4491},{"style":76},[4492],{"type":44,"value":4493},"(scope, playwright.firefox),\n",{"type":29,"tag":63,"props":4495,"children":4496},{"class":65,"line":923},[4497,4502,4506,4510],{"type":29,"tag":63,"props":4498,"children":4499},{"style":76},[4500],{"type":44,"value":4501}," webkit: ",{"type":29,"tag":63,"props":4503,"children":4504},{"style":70},[4505],{"type":44,"value":3462},{"type":29,"tag":63,"props":4507,"children":4508},{"style":117},[4509],{"type":44,"value":4467},{"type":29,"tag":63,"props":4511,"children":4512},{"style":76},[4513],{"type":44,"value":4514},"(scope, playwright.webkit),\n",{"type":29,"tag":63,"props":4516,"children":4517},{"class":65,"line":942},[4518],{"type":29,"tag":63,"props":4519,"children":4520},{"style":977},[4521],{"type":44,"value":4522}," // ...\n",{"type":29,"tag":63,"props":4524,"children":4525},{"class":65,"line":987},[4526],{"type":29,"tag":63,"props":4527,"children":4528},{"style":76},[4529],{"type":44,"value":4530}," });\n",{"type":29,"tag":63,"props":4532,"children":4533},{"class":65,"line":995},[4534],{"type":29,"tag":63,"props":4535,"children":4536},{"style":76},[4537],{"type":44,"value":2123},{"type":29,"tag":63,"props":4539,"children":4540},{"class":65,"line":1004},[4541],{"type":29,"tag":63,"props":4542,"children":4543},{"style":76},[4544],{"type":44,"value":257},{"type":29,"tag":30,"props":4546,"children":4547},{},[4548,4550,4556,4558,4563,4565,4570,4572,4577,4579,4584,4586,4592,4594,4600,4602,4608,4610,4615,4617,4622],{"type":44,"value":4549},"Notice the ",{"type":29,"tag":59,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":44,"value":4555},"super",{"type":44,"value":4557}," call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the ",{"type":29,"tag":59,"props":4559,"children":4561},{"className":4560},[],[4562],{"type":44,"value":3481},{"type":44,"value":4564}," from ",{"type":29,"tag":59,"props":4566,"children":4568},{"className":4567},[],[4569],{"type":44,"value":504},{"type":44,"value":4571}," passed into it as the first parameter. Every call to the server will run through the ",{"type":29,"tag":59,"props":4573,"children":4575},{"className":4574},[],[4576],{"type":44,"value":2605},{"type":44,"value":4578}," in the ",{"type":29,"tag":59,"props":4580,"children":4582},{"className":4581},[],[4583],{"type":44,"value":3481},{"type":44,"value":4585},", which then can be traced through calls in each of the dispatcher classes. ",{"type":29,"tag":59,"props":4587,"children":4589},{"className":4588},[],[4590],{"type":44,"value":4591},"BrowserTypeDispatcher",{"type":44,"value":4593}," will launch a ",{"type":29,"tag":59,"props":4595,"children":4597},{"className":4596},[],[4598],{"type":44,"value":4599},"BrowserDispatcher",{"type":44,"value":4601},", which is responsible for creating a ",{"type":29,"tag":59,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":44,"value":4607},"BrowserContextDispatcher",{"type":44,"value":4609},", which can create a ",{"type":29,"tag":59,"props":4611,"children":4613},{"className":4612},[],[4614],{"type":44,"value":664},{"type":44,"value":4616},", and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original ",{"type":29,"tag":59,"props":4618,"children":4620},{"className":4619},[],[4621],{"type":44,"value":2605},{"type":44,"value":4623}," defined in the factory method with confidence!",{"type":29,"tag":269,"props":4625,"children":4627},{"id":4626},"tying-back-to-the-onmessage-communication",[4628],{"type":44,"value":4629},"Tying back to the onmessage communication",{"type":29,"tag":30,"props":4631,"children":4632},{},[4633,4635,4640,4641,4647],{"type":44,"value":4634},"So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the ",{"type":29,"tag":59,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":44,"value":2628},{"type":44,"value":281},{"type":29,"tag":59,"props":4642,"children":4644},{"className":4643},[],[4645],{"type":44,"value":4646},"clientConnect.onmessage",{"type":44,"value":4648}," functions.",{"type":29,"tag":30,"props":4650,"children":4651},{},[4652,4654,4659,4661,4666,4668,4673,4674,4680,4682,4687,4689,4695,4697,4703,4705,4710,4712,4718,4719,4724,4725,4731,4733,4739,4741,4746,4748,4754,4756,4761],{"type":44,"value":4653},"From within ",{"type":29,"tag":59,"props":4655,"children":4657},{"className":4656},[],[4658],{"type":44,"value":2605},{"type":44,"value":4660}," its ",{"type":29,"tag":59,"props":4662,"children":4664},{"className":4663},[],[4665],{"type":44,"value":2628},{"type":44,"value":4667}," function is called from two main methods. These are ",{"type":29,"tag":59,"props":4669,"children":4671},{"className":4670},[],[4672],{"type":44,"value":1051},{"type":44,"value":281},{"type":29,"tag":59,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":44,"value":4679},"_sendMessageToClient",{"type":44,"value":4681},". The first, ",{"type":29,"tag":59,"props":4683,"children":4685},{"className":4684},[],[4686],{"type":44,"value":1051},{"type":44,"value":4688},", is called from within the ",{"type":29,"tag":59,"props":4690,"children":4692},{"className":4691},[],[4693],{"type":44,"value":4694},"clientConnection.onmessage",{"type":44,"value":4696},", so the ",{"type":29,"tag":59,"props":4698,"children":4700},{"className":4699},[],[4701],{"type":44,"value":4702},"dispatcher.onmessage",{"type":44,"value":4704}," call in that case acts as a response callback. The second, ",{"type":29,"tag":59,"props":4706,"children":4708},{"className":4707},[],[4709],{"type":44,"value":4679},{"type":44,"value":4711},", is called from the ",{"type":29,"tag":59,"props":4713,"children":4715},{"className":4714},[],[4716],{"type":44,"value":4717},"sendEvent",{"type":44,"value":912},{"type":29,"tag":59,"props":4720,"children":4722},{"className":4721},[],[4723],{"type":44,"value":4132},{"type":44,"value":912},{"type":29,"tag":59,"props":4726,"children":4728},{"className":4727},[],[4729],{"type":44,"value":4730},"sendAdopt",{"type":44,"value":4732},", and ",{"type":29,"tag":59,"props":4734,"children":4736},{"className":4735},[],[4737],{"type":44,"value":4738},"sendDestroy",{"type":44,"value":4740}," methods defined within the dispatcher. Calls to these functions are spread throughout the ",{"type":29,"tag":59,"props":4742,"children":4744},{"className":4743},[],[4745],{"type":44,"value":619},{"type":44,"value":4747}," subclasses which call these functions from their internal ",{"type":29,"tag":59,"props":4749,"children":4751},{"className":4750},[],[4752],{"type":44,"value":4753},"_connection",{"type":44,"value":4755}," variable. These will tell the client to construct, update, and destroy, their corresponding client side ",{"type":29,"tag":59,"props":4757,"children":4759},{"className":4758},[],[4760],{"type":44,"value":604},{"type":44,"value":4762}," objects.",{"type":29,"tag":30,"props":4764,"children":4765},{},[4766,4768,4773,4775,4781,4783,4788,4790,4795,4797,4802],{"type":44,"value":4767},"Separately on the client-side, ",{"type":29,"tag":59,"props":4769,"children":4771},{"className":4770},[],[4772],{"type":44,"value":4694},{"type":44,"value":4774}," is called from ",{"type":29,"tag":59,"props":4776,"children":4778},{"className":4777},[],[4779],{"type":44,"value":4780},"sendMessageToServer",{"type":44,"value":4782}," whenever you use a client-side API. This sends a message over to the ",{"type":29,"tag":59,"props":4784,"children":4786},{"className":4785},[],[4787],{"type":44,"value":2605},{"type":44,"value":4789},", which finds the corresponding ",{"type":29,"tag":59,"props":4791,"children":4793},{"className":4792},[],[4794],{"type":44,"value":619},{"type":44,"value":4796}," subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via ",{"type":29,"tag":59,"props":4798,"children":4800},{"className":4799},[],[4801],{"type":44,"value":4679},{"type":44,"value":4803},", as mentioned before.",{"type":29,"tag":269,"props":4805,"children":4807},{"id":4806},"synchronizing-objects-between-the-dispatchers-and-client-side-channelowners",[4808],{"type":44,"value":4809},"Synchronizing objects between the Dispatchers and client-side ChannelOwners",{"type":29,"tag":30,"props":4811,"children":4812},{},[4813,4815,4820,4822,4827,4829,4834,4836,4841,4843,4849],{"type":44,"value":4814},"The ",{"type":29,"tag":59,"props":4816,"children":4818},{"className":4817},[],[4819],{"type":44,"value":4132},{"type":44,"value":4821}," function is special because it is only called from within the ",{"type":29,"tag":59,"props":4823,"children":4825},{"className":4824},[],[4826],{"type":44,"value":619},{"type":44,"value":4828}," constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the ",{"type":29,"tag":59,"props":4830,"children":4832},{"className":4831},[],[4833],{"type":44,"value":4132},{"type":44,"value":4835}," implementation, internally it calls ",{"type":29,"tag":59,"props":4837,"children":4839},{"className":4838},[],[4840],{"type":44,"value":4679},{"type":44,"value":4842}," with the ",{"type":29,"tag":59,"props":4844,"children":4846},{"className":4845},[],[4847],{"type":44,"value":4848},"__create__",{"type":44,"value":4850}," parameter:",{"type":29,"tag":52,"props":4852,"children":4855},{"className":54,"code":4853,"filename":4854,"language":56,"meta":7,"style":7},"sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });\n this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);\n}\n","packages/playwright-core/src/server/dispatchers/dispatcher.ts",[4856],{"type":29,"tag":59,"props":4857,"children":4858},{"__ignoreMap":7},[4859,4881,4925,5015,5046],{"type":29,"tag":63,"props":4860,"children":4861},{"class":65,"line":66},[4862,4866,4871,4876],{"type":29,"tag":63,"props":4863,"children":4864},{"style":117},[4865],{"type":44,"value":4132},{"type":29,"tag":63,"props":4867,"children":4868},{"style":76},[4869],{"type":44,"value":4870},"(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject",{"type":29,"tag":63,"props":4872,"children":4873},{"style":70},[4874],{"type":44,"value":4875},"?:",{"type":29,"tag":63,"props":4877,"children":4878},{"style":76},[4879],{"type":44,"value":4880}," SdkObject) {\n",{"type":29,"tag":63,"props":4882,"children":4883},{"class":65,"line":93},[4884,4888,4893,4897,4902,4907,4912,4916,4921],{"type":29,"tag":63,"props":4885,"children":4886},{"style":70},[4887],{"type":44,"value":144},{"type":29,"tag":63,"props":4889,"children":4890},{"style":394},[4891],{"type":44,"value":4892}," validator",{"type":29,"tag":63,"props":4894,"children":4895},{"style":70},[4896],{"type":44,"value":155},{"type":29,"tag":63,"props":4898,"children":4899},{"style":117},[4900],{"type":44,"value":4901}," findValidator",{"type":29,"tag":63,"props":4903,"children":4904},{"style":76},[4905],{"type":44,"value":4906},"(type, ",{"type":29,"tag":63,"props":4908,"children":4909},{"style":87},[4910],{"type":44,"value":4911},"''",{"type":29,"tag":63,"props":4913,"children":4914},{"style":76},[4915],{"type":44,"value":912},{"type":29,"tag":63,"props":4917,"children":4918},{"style":87},[4919],{"type":44,"value":4920},"'Initializer'",{"type":29,"tag":63,"props":4922,"children":4923},{"style":76},[4924],{"type":44,"value":429},{"type":29,"tag":63,"props":4926,"children":4927},{"class":65,"line":103},[4928,4933,4937,4941,4946,4950,4955,4959,4964,4969,4973,4977,4982,4986,4991,4996,5001,5005,5010],{"type":29,"tag":63,"props":4929,"children":4930},{"style":76},[4931],{"type":44,"value":4932}," initializer ",{"type":29,"tag":63,"props":4934,"children":4935},{"style":70},[4936],{"type":44,"value":1258},{"type":29,"tag":63,"props":4938,"children":4939},{"style":117},[4940],{"type":44,"value":4892},{"type":29,"tag":63,"props":4942,"children":4943},{"style":76},[4944],{"type":44,"value":4945},"(initializer, ",{"type":29,"tag":63,"props":4947,"children":4948},{"style":87},[4949],{"type":44,"value":4911},{"type":29,"tag":63,"props":4951,"children":4952},{"style":76},[4953],{"type":44,"value":4954},", { tChannelImpl: ",{"type":29,"tag":63,"props":4956,"children":4957},{"style":394},[4958],{"type":44,"value":3198},{"type":29,"tag":63,"props":4960,"children":4961},{"style":76},[4962],{"type":44,"value":4963},"._tChannelImplToWire.",{"type":29,"tag":63,"props":4965,"children":4966},{"style":117},[4967],{"type":44,"value":4968},"bind",{"type":29,"tag":63,"props":4970,"children":4971},{"style":76},[4972],{"type":44,"value":238},{"type":29,"tag":63,"props":4974,"children":4975},{"style":394},[4976],{"type":44,"value":3198},{"type":29,"tag":63,"props":4978,"children":4979},{"style":76},[4980],{"type":44,"value":4981},"), binary: ",{"type":29,"tag":63,"props":4983,"children":4984},{"style":394},[4985],{"type":44,"value":3198},{"type":29,"tag":63,"props":4987,"children":4988},{"style":76},[4989],{"type":44,"value":4990},"._isLocal ",{"type":29,"tag":63,"props":4992,"children":4993},{"style":70},[4994],{"type":44,"value":4995},"?",{"type":29,"tag":63,"props":4997,"children":4998},{"style":87},[4999],{"type":44,"value":5000}," 'buffer'",{"type":29,"tag":63,"props":5002,"children":5003},{"style":70},[5004],{"type":44,"value":3976},{"type":29,"tag":63,"props":5006,"children":5007},{"style":87},[5008],{"type":44,"value":5009}," 'toBase64'",{"type":29,"tag":63,"props":5011,"children":5012},{"style":76},[5013],{"type":44,"value":5014}," });\n",{"type":29,"tag":63,"props":5016,"children":5017},{"class":65,"line":138},[5018,5023,5027,5031,5036,5041],{"type":29,"tag":63,"props":5019,"children":5020},{"style":394},[5021],{"type":44,"value":5022}," this",{"type":29,"tag":63,"props":5024,"children":5025},{"style":76},[5026],{"type":44,"value":228},{"type":29,"tag":63,"props":5028,"children":5029},{"style":117},[5030],{"type":44,"value":4679},{"type":29,"tag":63,"props":5032,"children":5033},{"style":76},[5034],{"type":44,"value":5035},"(parent._guid, type, ",{"type":29,"tag":63,"props":5037,"children":5038},{"style":87},[5039],{"type":44,"value":5040},"'__create__'",{"type":29,"tag":63,"props":5042,"children":5043},{"style":76},[5044],{"type":44,"value":5045},", { type, initializer, guid }, sdkObject);\n",{"type":29,"tag":63,"props":5047,"children":5048},{"class":65,"line":178},[5049],{"type":29,"tag":63,"props":5050,"children":5051},{"style":76},[5052],{"type":44,"value":257},{"type":29,"tag":30,"props":5054,"children":5055},{},[5056,5058,5063,5065,5070,5072,5078,5080,5085,5087,5092,5094,5099],{"type":44,"value":5057},"so if we search through the ",{"type":29,"tag":59,"props":5059,"children":5061},{"className":5060},[],[5062],{"type":44,"value":679},{"type":44,"value":5064}," class on the client side, sure enough in its ",{"type":29,"tag":59,"props":5066,"children":5068},{"className":5067},[],[5069],{"type":44,"value":1051},{"type":44,"value":5071}," function it has a call to ",{"type":29,"tag":59,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":44,"value":5077},"_createRemoteObject",{"type":44,"value":5079}," for the associated method ",{"type":29,"tag":59,"props":5081,"children":5083},{"className":5082},[],[5084],{"type":44,"value":4848},{"type":44,"value":5086},". This ",{"type":29,"tag":59,"props":5088,"children":5090},{"className":5089},[],[5091],{"type":44,"value":5077},{"type":44,"value":5093}," is what initializes the client-side ",{"type":29,"tag":59,"props":5095,"children":5097},{"className":5096},[],[5098],{"type":44,"value":12},{"type":44,"value":5100}," instance, and is the reason why we call",{"type":29,"tag":52,"props":5102,"children":5104},{"className":54,"code":5103,"language":56,"meta":7,"style":7},"const playwrightAPI = clientConnection.getObjectWithKnownName(\"Playwright\");\n",[5105],{"type":29,"tag":59,"props":5106,"children":5107},{"__ignoreMap":7},[5108],{"type":29,"tag":63,"props":5109,"children":5110},{"class":65,"line":66},[5111,5115,5119,5123,5127,5131,5135,5139],{"type":29,"tag":63,"props":5112,"children":5113},{"style":70},[5114],{"type":44,"value":1842},{"type":29,"tag":63,"props":5116,"children":5117},{"style":394},[5118],{"type":44,"value":1193},{"type":29,"tag":63,"props":5120,"children":5121},{"style":70},[5122],{"type":44,"value":155},{"type":29,"tag":63,"props":5124,"children":5125},{"style":76},[5126],{"type":44,"value":1202},{"type":29,"tag":63,"props":5128,"children":5129},{"style":117},[5130],{"type":44,"value":1207},{"type":29,"tag":63,"props":5132,"children":5133},{"style":76},[5134],{"type":44,"value":238},{"type":29,"tag":63,"props":5136,"children":5137},{"style":87},[5138],{"type":44,"value":4445},{"type":29,"tag":63,"props":5140,"children":5141},{"style":76},[5142],{"type":44,"value":429},{"type":29,"tag":30,"props":5144,"children":5145},{},[5146,5148,5153,5155,5161],{"type":44,"value":5147},"to access the playwright API. But let's dive a little deeper as to what's happening with the message from the ",{"type":29,"tag":59,"props":5149,"children":5151},{"className":5150},[],[5152],{"type":44,"value":2605},{"type":44,"value":5154}," over to the ",{"type":29,"tag":59,"props":5156,"children":5158},{"className":5157},[],[5159],{"type":44,"value":5160},"clientConnection",{"type":44,"value":5162},". For the Playwright create message, the message looks something like",{"type":29,"tag":52,"props":5164,"children":5166},{"className":54,"code":5165,"language":56,"meta":7,"style":7},"{\n guid: '',\n method: '__create__',\n params: {\n type: 'Playwright',\n initializer: {\n chromium: { guid: 'browser-type@024d5a494527ece580841844a9a933a6' },\n firefox: { guid: 'browser-type@fae8f48651c02682ad3b276f0a046d63' },\n webkit: { guid: 'browser-type@ed1c30ab794ec863fe5b9b208c3635e1' },\n android: { guid: 'android@832582c466c24c6933d3a5587059e1be' },\n electron: { guid: 'electron@3829a7608477101154e15c1e25bca9ca' },\n },\n guid: 'Playwright'\n }\n}\n",[5167],{"type":29,"tag":59,"props":5168,"children":5169},{"__ignoreMap":7},[5170,5178,5199,5219,5232,5252,5263,5294,5323,5352,5381,5410,5418,5435,5442],{"type":29,"tag":63,"props":5171,"children":5172},{"class":65,"line":66},[5173],{"type":29,"tag":63,"props":5174,"children":5175},{"style":76},[5176],{"type":44,"value":5177},"{\n",{"type":29,"tag":63,"props":5179,"children":5180},{"class":65,"line":93},[5181,5186,5191,5195],{"type":29,"tag":63,"props":5182,"children":5183},{"style":117},[5184],{"type":44,"value":5185}," guid",{"type":29,"tag":63,"props":5187,"children":5188},{"style":76},[5189],{"type":44,"value":5190},": ",{"type":29,"tag":63,"props":5192,"children":5193},{"style":87},[5194],{"type":44,"value":4911},{"type":29,"tag":63,"props":5196,"children":5197},{"style":76},[5198],{"type":44,"value":857},{"type":29,"tag":63,"props":5200,"children":5201},{"class":65,"line":103},[5202,5207,5211,5215],{"type":29,"tag":63,"props":5203,"children":5204},{"style":117},[5205],{"type":44,"value":5206}," method",{"type":29,"tag":63,"props":5208,"children":5209},{"style":76},[5210],{"type":44,"value":5190},{"type":29,"tag":63,"props":5212,"children":5213},{"style":87},[5214],{"type":44,"value":5040},{"type":29,"tag":63,"props":5216,"children":5217},{"style":76},[5218],{"type":44,"value":857},{"type":29,"tag":63,"props":5220,"children":5221},{"class":65,"line":138},[5222,5227],{"type":29,"tag":63,"props":5223,"children":5224},{"style":117},[5225],{"type":44,"value":5226}," params",{"type":29,"tag":63,"props":5228,"children":5229},{"style":76},[5230],{"type":44,"value":5231},": {\n",{"type":29,"tag":63,"props":5233,"children":5234},{"class":65,"line":178},[5235,5239,5243,5248],{"type":29,"tag":63,"props":5236,"children":5237},{"style":117},[5238],{"type":44,"value":3804},{"type":29,"tag":63,"props":5240,"children":5241},{"style":76},[5242],{"type":44,"value":5190},{"type":29,"tag":63,"props":5244,"children":5245},{"style":87},[5246],{"type":44,"value":5247},"'Playwright'",{"type":29,"tag":63,"props":5249,"children":5250},{"style":76},[5251],{"type":44,"value":857},{"type":29,"tag":63,"props":5253,"children":5254},{"class":65,"line":213},[5255,5259],{"type":29,"tag":63,"props":5256,"children":5257},{"style":117},[5258],{"type":44,"value":3824},{"type":29,"tag":63,"props":5260,"children":5261},{"style":76},[5262],{"type":44,"value":5231},{"type":29,"tag":63,"props":5264,"children":5265},{"class":65,"line":251},[5266,5271,5276,5280,5284,5289],{"type":29,"tag":63,"props":5267,"children":5268},{"style":117},[5269],{"type":44,"value":5270}," chromium",{"type":29,"tag":63,"props":5272,"children":5273},{"style":76},[5274],{"type":44,"value":5275},": { ",{"type":29,"tag":63,"props":5277,"children":5278},{"style":117},[5279],{"type":44,"value":2054},{"type":29,"tag":63,"props":5281,"children":5282},{"style":76},[5283],{"type":44,"value":5190},{"type":29,"tag":63,"props":5285,"children":5286},{"style":87},[5287],{"type":44,"value":5288},"'browser-type@024d5a494527ece580841844a9a933a6'",{"type":29,"tag":63,"props":5290,"children":5291},{"style":76},[5292],{"type":44,"value":5293}," },\n",{"type":29,"tag":63,"props":5295,"children":5296},{"class":65,"line":923},[5297,5302,5306,5310,5314,5319],{"type":29,"tag":63,"props":5298,"children":5299},{"style":117},[5300],{"type":44,"value":5301}," firefox",{"type":29,"tag":63,"props":5303,"children":5304},{"style":76},[5305],{"type":44,"value":5275},{"type":29,"tag":63,"props":5307,"children":5308},{"style":117},[5309],{"type":44,"value":2054},{"type":29,"tag":63,"props":5311,"children":5312},{"style":76},[5313],{"type":44,"value":5190},{"type":29,"tag":63,"props":5315,"children":5316},{"style":87},[5317],{"type":44,"value":5318},"'browser-type@fae8f48651c02682ad3b276f0a046d63'",{"type":29,"tag":63,"props":5320,"children":5321},{"style":76},[5322],{"type":44,"value":5293},{"type":29,"tag":63,"props":5324,"children":5325},{"class":65,"line":942},[5326,5331,5335,5339,5343,5348],{"type":29,"tag":63,"props":5327,"children":5328},{"style":117},[5329],{"type":44,"value":5330}," webkit",{"type":29,"tag":63,"props":5332,"children":5333},{"style":76},[5334],{"type":44,"value":5275},{"type":29,"tag":63,"props":5336,"children":5337},{"style":117},[5338],{"type":44,"value":2054},{"type":29,"tag":63,"props":5340,"children":5341},{"style":76},[5342],{"type":44,"value":5190},{"type":29,"tag":63,"props":5344,"children":5345},{"style":87},[5346],{"type":44,"value":5347},"'browser-type@ed1c30ab794ec863fe5b9b208c3635e1'",{"type":29,"tag":63,"props":5349,"children":5350},{"style":76},[5351],{"type":44,"value":5293},{"type":29,"tag":63,"props":5353,"children":5354},{"class":65,"line":987},[5355,5360,5364,5368,5372,5377],{"type":29,"tag":63,"props":5356,"children":5357},{"style":117},[5358],{"type":44,"value":5359}," android",{"type":29,"tag":63,"props":5361,"children":5362},{"style":76},[5363],{"type":44,"value":5275},{"type":29,"tag":63,"props":5365,"children":5366},{"style":117},[5367],{"type":44,"value":2054},{"type":29,"tag":63,"props":5369,"children":5370},{"style":76},[5371],{"type":44,"value":5190},{"type":29,"tag":63,"props":5373,"children":5374},{"style":87},[5375],{"type":44,"value":5376},"'android@832582c466c24c6933d3a5587059e1be'",{"type":29,"tag":63,"props":5378,"children":5379},{"style":76},[5380],{"type":44,"value":5293},{"type":29,"tag":63,"props":5382,"children":5383},{"class":65,"line":995},[5384,5389,5393,5397,5401,5406],{"type":29,"tag":63,"props":5385,"children":5386},{"style":117},[5387],{"type":44,"value":5388}," electron",{"type":29,"tag":63,"props":5390,"children":5391},{"style":76},[5392],{"type":44,"value":5275},{"type":29,"tag":63,"props":5394,"children":5395},{"style":117},[5396],{"type":44,"value":2054},{"type":29,"tag":63,"props":5398,"children":5399},{"style":76},[5400],{"type":44,"value":5190},{"type":29,"tag":63,"props":5402,"children":5403},{"style":87},[5404],{"type":44,"value":5405},"'electron@3829a7608477101154e15c1e25bca9ca'",{"type":29,"tag":63,"props":5407,"children":5408},{"style":76},[5409],{"type":44,"value":5293},{"type":29,"tag":63,"props":5411,"children":5412},{"class":65,"line":1004},[5413],{"type":29,"tag":63,"props":5414,"children":5415},{"style":76},[5416],{"type":44,"value":5417}," },\n",{"type":29,"tag":63,"props":5419,"children":5420},{"class":65,"line":23},[5421,5426,5430],{"type":29,"tag":63,"props":5422,"children":5423},{"style":117},[5424],{"type":44,"value":5425}," guid",{"type":29,"tag":63,"props":5427,"children":5428},{"style":76},[5429],{"type":44,"value":5190},{"type":29,"tag":63,"props":5431,"children":5432},{"style":87},[5433],{"type":44,"value":5434},"'Playwright'\n",{"type":29,"tag":63,"props":5436,"children":5437},{"class":65,"line":1059},[5438],{"type":29,"tag":63,"props":5439,"children":5440},{"style":76},[5441],{"type":44,"value":2123},{"type":29,"tag":63,"props":5443,"children":5444},{"class":65,"line":1091},[5445],{"type":29,"tag":63,"props":5446,"children":5447},{"style":76},[5448],{"type":44,"value":257},{"type":29,"tag":30,"props":5450,"children":5451},{},[5452,5454,5459,5461,5466,5468,5474,5476,5481,5482,5488,5490,5495,5497,5502],{"type":44,"value":5453},"Note before this ",{"type":29,"tag":59,"props":5455,"children":5457},{"className":5456},[],[5458],{"type":44,"value":4132},{"type":44,"value":5460}," message is passed to create the Playwright API on the client side, there were ",{"type":29,"tag":59,"props":5462,"children":5464},{"className":5463},[],[5465],{"type":44,"value":4132},{"type":44,"value":5467}," messages for each of the device types, meaning there already exists a client-side ",{"type":29,"tag":59,"props":5469,"children":5471},{"className":5470},[],[5472],{"type":44,"value":5473},"BrowserType",{"type":44,"value":5475}," for ",{"type":29,"tag":59,"props":5477,"children":5479},{"className":5478},[],[5480],{"type":44,"value":1801},{"type":44,"value":912},{"type":29,"tag":59,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":44,"value":5487},"firefox",{"type":44,"value":5489},", etc. before the ",{"type":29,"tag":59,"props":5491,"children":5493},{"className":5492},[],[5494],{"type":44,"value":4848},{"type":44,"value":5496}," message for ",{"type":29,"tag":59,"props":5498,"children":5500},{"className":5499},[],[5501],{"type":44,"value":12},{"type":44,"value":5503}," is sent.",{"type":29,"tag":30,"props":5505,"children":5506},{},[5507,5508,5513,5515,5520,5522,5527,5529,5535],{"type":44,"value":4814},{"type":29,"tag":59,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":44,"value":5160},{"type":44,"value":5514}," constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ",{"type":29,"tag":59,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":44,"value":604},{"type":44,"value":5521}," class, which is a concept for a later section. For now, let's trace what happens in the ",{"type":29,"tag":59,"props":5523,"children":5525},{"className":5524},[],[5526],{"type":44,"value":5160},{"type":44,"value":5528}," for the ",{"type":29,"tag":59,"props":5530,"children":5532},{"className":5531},[],[5533],{"type":44,"value":5534},"type: 'Playwright'",{"type":44,"value":5536}," message.",{"type":29,"tag":30,"props":5538,"children":5539},{},[5540,5541,5546,5548,5554,5556,5561,5563,5569],{"type":44,"value":4814},{"type":29,"tag":59,"props":5542,"children":5544},{"className":5543},[],[5545],{"type":44,"value":4132},{"type":44,"value":5547}," function calls ",{"type":29,"tag":59,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":44,"value":5553},"dispatchConnection.onmessage",{"type":44,"value":5555},", which calls the ",{"type":29,"tag":59,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":44,"value":2613},{"type":44,"value":5562}," function, which then calls the ",{"type":29,"tag":59,"props":5564,"children":5566},{"className":5565},[],[5567],{"type":44,"value":5568},"clientConnection._createRemoteObject",{"type":44,"value":5570}," function with the following parameters",{"type":29,"tag":52,"props":5572,"children":5574},{"className":54,"code":5573,"filename":1946,"language":56,"meta":7,"style":7},"this._createRemoteObject(\n \"\", // parentGuid - corresponds to Root, the root ChannelOwner\n \"Playwright\", // type\n \"Playwright\", // guid\n {\n // initializer\n chromium: { guid: \"browser-type@024d5a494527ece580841844a9a933a6\" },\n firefox: { guid: \"browser-type@fae8f48651c02682ad3b276f0a046d63\" },\n webkit: { guid: \"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\" },\n android: { guid: \"android@832582c466c24c6933d3a5587059e1be\" },\n electron: { guid: \"electron@3829a7608477101154e15c1e25bca9ca\" },\n }\n);\n",[5575],{"type":29,"tag":59,"props":5576,"children":5577},{"__ignoreMap":7},[5578,5597,5614,5631,5647,5655,5663,5680,5697,5714,5731,5748,5755],{"type":29,"tag":63,"props":5579,"children":5580},{"class":65,"line":66},[5581,5585,5589,5593],{"type":29,"tag":63,"props":5582,"children":5583},{"style":394},[5584],{"type":44,"value":3198},{"type":29,"tag":63,"props":5586,"children":5587},{"style":76},[5588],{"type":44,"value":228},{"type":29,"tag":63,"props":5590,"children":5591},{"style":117},[5592],{"type":44,"value":5077},{"type":29,"tag":63,"props":5594,"children":5595},{"style":76},[5596],{"type":44,"value":1212},{"type":29,"tag":63,"props":5598,"children":5599},{"class":65,"line":93},[5600,5605,5609],{"type":29,"tag":63,"props":5601,"children":5602},{"style":87},[5603],{"type":44,"value":5604}," \"\"",{"type":29,"tag":63,"props":5606,"children":5607},{"style":76},[5608],{"type":44,"value":912},{"type":29,"tag":63,"props":5610,"children":5611},{"style":977},[5612],{"type":44,"value":5613},"// parentGuid - corresponds to Root, the root ChannelOwner\n",{"type":29,"tag":63,"props":5615,"children":5616},{"class":65,"line":103},[5617,5622,5626],{"type":29,"tag":63,"props":5618,"children":5619},{"style":87},[5620],{"type":44,"value":5621}," \"Playwright\"",{"type":29,"tag":63,"props":5623,"children":5624},{"style":76},[5625],{"type":44,"value":912},{"type":29,"tag":63,"props":5627,"children":5628},{"style":977},[5629],{"type":44,"value":5630},"// type\n",{"type":29,"tag":63,"props":5632,"children":5633},{"class":65,"line":138},[5634,5638,5642],{"type":29,"tag":63,"props":5635,"children":5636},{"style":87},[5637],{"type":44,"value":5621},{"type":29,"tag":63,"props":5639,"children":5640},{"style":76},[5641],{"type":44,"value":912},{"type":29,"tag":63,"props":5643,"children":5644},{"style":977},[5645],{"type":44,"value":5646},"// guid\n",{"type":29,"tag":63,"props":5648,"children":5649},{"class":65,"line":178},[5650],{"type":29,"tag":63,"props":5651,"children":5652},{"style":76},[5653],{"type":44,"value":5654}," {\n",{"type":29,"tag":63,"props":5656,"children":5657},{"class":65,"line":213},[5658],{"type":29,"tag":63,"props":5659,"children":5660},{"style":977},[5661],{"type":44,"value":5662}," // initializer\n",{"type":29,"tag":63,"props":5664,"children":5665},{"class":65,"line":251},[5666,5671,5676],{"type":29,"tag":63,"props":5667,"children":5668},{"style":76},[5669],{"type":44,"value":5670}," chromium: { guid: ",{"type":29,"tag":63,"props":5672,"children":5673},{"style":87},[5674],{"type":44,"value":5675},"\"browser-type@024d5a494527ece580841844a9a933a6\"",{"type":29,"tag":63,"props":5677,"children":5678},{"style":76},[5679],{"type":44,"value":5293},{"type":29,"tag":63,"props":5681,"children":5682},{"class":65,"line":923},[5683,5688,5693],{"type":29,"tag":63,"props":5684,"children":5685},{"style":76},[5686],{"type":44,"value":5687}," firefox: { guid: ",{"type":29,"tag":63,"props":5689,"children":5690},{"style":87},[5691],{"type":44,"value":5692},"\"browser-type@fae8f48651c02682ad3b276f0a046d63\"",{"type":29,"tag":63,"props":5694,"children":5695},{"style":76},[5696],{"type":44,"value":5293},{"type":29,"tag":63,"props":5698,"children":5699},{"class":65,"line":942},[5700,5705,5710],{"type":29,"tag":63,"props":5701,"children":5702},{"style":76},[5703],{"type":44,"value":5704}," webkit: { guid: ",{"type":29,"tag":63,"props":5706,"children":5707},{"style":87},[5708],{"type":44,"value":5709},"\"browser-type@ed1c30ab794ec863fe5b9b208c3635e1\"",{"type":29,"tag":63,"props":5711,"children":5712},{"style":76},[5713],{"type":44,"value":5293},{"type":29,"tag":63,"props":5715,"children":5716},{"class":65,"line":987},[5717,5722,5727],{"type":29,"tag":63,"props":5718,"children":5719},{"style":76},[5720],{"type":44,"value":5721}," android: { guid: ",{"type":29,"tag":63,"props":5723,"children":5724},{"style":87},[5725],{"type":44,"value":5726},"\"android@832582c466c24c6933d3a5587059e1be\"",{"type":29,"tag":63,"props":5728,"children":5729},{"style":76},[5730],{"type":44,"value":5293},{"type":29,"tag":63,"props":5732,"children":5733},{"class":65,"line":995},[5734,5739,5744],{"type":29,"tag":63,"props":5735,"children":5736},{"style":76},[5737],{"type":44,"value":5738}," electron: { guid: ",{"type":29,"tag":63,"props":5740,"children":5741},{"style":87},[5742],{"type":44,"value":5743},"\"electron@3829a7608477101154e15c1e25bca9ca\"",{"type":29,"tag":63,"props":5745,"children":5746},{"style":76},[5747],{"type":44,"value":5293},{"type":29,"tag":63,"props":5749,"children":5750},{"class":65,"line":1004},[5751],{"type":29,"tag":63,"props":5752,"children":5753},{"style":76},[5754],{"type":44,"value":2123},{"type":29,"tag":63,"props":5756,"children":5757},{"class":65,"line":23},[5758],{"type":29,"tag":63,"props":5759,"children":5760},{"style":76},[5761],{"type":44,"value":429},{"type":29,"tag":30,"props":5763,"children":5764},{},[5765,5766,5771,5773,5779],{"type":44,"value":4212},{"type":29,"tag":59,"props":5767,"children":5769},{"className":5768},[],[5770],{"type":44,"value":5568},{"type":44,"value":5772}," function there is a transformation of the data and then a large ",{"type":29,"tag":59,"props":5774,"children":5776},{"className":5775},[],[5777],{"type":44,"value":5778},"switch-case",{"type":44,"value":5780}," function instantiating the corresponding client class.",{"type":29,"tag":52,"props":5782,"children":5784},{"className":54,"code":5783,"filename":1946,"language":56,"meta":7,"style":7},"_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {\n const parent = this._objects.get(parentGuid); // here the parentGuid is ''\n if (!parent)\n throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);\n let result: ChannelOwner\u003Cany>;\n const validator = findValidator(type, '', 'Initializer');\n initializer = validator(\n initializer,\n '',\n {\n tChannelImpl: this._tChannelImplFromWire.bind(this),\n binary: this._rawBuffers ? 'buffer' : 'fromBase64'\n }\n );\n switch (type) {\n // ...\n case 'Playwright':\n result = new Playwright(parent, type, guid, initializer);\n break;\n // ...\n }\n return result;\n}\n",[5785],{"type":29,"tag":59,"props":5786,"children":5787},{"__ignoreMap":7},[5788,5800,5838,5859,5908,5944,5983,6002,6010,6022,6030,6064,6098,6106,6113,6126,6134,6152,6177,6189,6196,6203,6215],{"type":29,"tag":63,"props":5789,"children":5790},{"class":65,"line":66},[5791,5795],{"type":29,"tag":63,"props":5792,"children":5793},{"style":117},[5794],{"type":44,"value":5077},{"type":29,"tag":63,"props":5796,"children":5797},{"style":76},[5798],{"type":44,"value":5799},"(parentGuid: string, type: string, guid: string, initializer: any) {\n",{"type":29,"tag":63,"props":5801,"children":5802},{"class":65,"line":93},[5803,5807,5812,5816,5820,5824,5828,5833],{"type":29,"tag":63,"props":5804,"children":5805},{"style":70},[5806],{"type":44,"value":144},{"type":29,"tag":63,"props":5808,"children":5809},{"style":394},[5810],{"type":44,"value":5811}," parent",{"type":29,"tag":63,"props":5813,"children":5814},{"style":70},[5815],{"type":44,"value":155},{"type":29,"tag":63,"props":5817,"children":5818},{"style":394},[5819],{"type":44,"value":2093},{"type":29,"tag":63,"props":5821,"children":5822},{"style":76},[5823],{"type":44,"value":2098},{"type":29,"tag":63,"props":5825,"children":5826},{"style":117},[5827],{"type":44,"value":1619},{"type":29,"tag":63,"props":5829,"children":5830},{"style":76},[5831],{"type":44,"value":5832},"(parentGuid); ",{"type":29,"tag":63,"props":5834,"children":5835},{"style":977},[5836],{"type":44,"value":5837},"// here the parentGuid is ''\n",{"type":29,"tag":63,"props":5839,"children":5840},{"class":65,"line":103},[5841,5846,5850,5854],{"type":29,"tag":63,"props":5842,"children":5843},{"style":70},[5844],{"type":44,"value":5845}," if",{"type":29,"tag":63,"props":5847,"children":5848},{"style":76},[5849],{"type":44,"value":1024},{"type":29,"tag":63,"props":5851,"children":5852},{"style":70},[5853],{"type":44,"value":1629},{"type":29,"tag":63,"props":5855,"children":5856},{"style":76},[5857],{"type":44,"value":5858},"parent)\n",{"type":29,"tag":63,"props":5860,"children":5861},{"class":65,"line":138},[5862,5867,5871,5876,5880,5885,5890,5895,5899,5904],{"type":29,"tag":63,"props":5863,"children":5864},{"style":70},[5865],{"type":44,"value":5866}," throw",{"type":29,"tag":63,"props":5868,"children":5869},{"style":70},[5870],{"type":44,"value":893},{"type":29,"tag":63,"props":5872,"children":5873},{"style":117},[5874],{"type":44,"value":5875}," Error",{"type":29,"tag":63,"props":5877,"children":5878},{"style":76},[5879],{"type":44,"value":238},{"type":29,"tag":63,"props":5881,"children":5882},{"style":87},[5883],{"type":44,"value":5884},"`Cannot find parent object ${",{"type":29,"tag":63,"props":5886,"children":5887},{"style":76},[5888],{"type":44,"value":5889},"parentGuid",{"type":29,"tag":63,"props":5891,"children":5892},{"style":87},[5893],{"type":44,"value":5894},"} to create ${",{"type":29,"tag":63,"props":5896,"children":5897},{"style":76},[5898],{"type":44,"value":2054},{"type":29,"tag":63,"props":5900,"children":5901},{"style":87},[5902],{"type":44,"value":5903},"}`",{"type":29,"tag":63,"props":5905,"children":5906},{"style":76},[5907],{"type":44,"value":429},{"type":29,"tag":63,"props":5909,"children":5910},{"class":65,"line":178},[5911,5916,5921,5925,5930,5934,5939],{"type":29,"tag":63,"props":5912,"children":5913},{"style":70},[5914],{"type":44,"value":5915}," let",{"type":29,"tag":63,"props":5917,"children":5918},{"style":76},[5919],{"type":44,"value":5920}," result",{"type":29,"tag":63,"props":5922,"children":5923},{"style":70},[5924],{"type":44,"value":761},{"type":29,"tag":63,"props":5926,"children":5927},{"style":117},[5928],{"type":44,"value":5929}," ChannelOwner",{"type":29,"tag":63,"props":5931,"children":5932},{"style":76},[5933],{"type":44,"value":2011},{"type":29,"tag":63,"props":5935,"children":5936},{"style":394},[5937],{"type":44,"value":5938},"any",{"type":29,"tag":63,"props":5940,"children":5941},{"style":76},[5942],{"type":44,"value":5943},">;\n",{"type":29,"tag":63,"props":5945,"children":5946},{"class":65,"line":213},[5947,5951,5955,5959,5963,5967,5971,5975,5979],{"type":29,"tag":63,"props":5948,"children":5949},{"style":70},[5950],{"type":44,"value":144},{"type":29,"tag":63,"props":5952,"children":5953},{"style":394},[5954],{"type":44,"value":4892},{"type":29,"tag":63,"props":5956,"children":5957},{"style":70},[5958],{"type":44,"value":155},{"type":29,"tag":63,"props":5960,"children":5961},{"style":117},[5962],{"type":44,"value":4901},{"type":29,"tag":63,"props":5964,"children":5965},{"style":76},[5966],{"type":44,"value":4906},{"type":29,"tag":63,"props":5968,"children":5969},{"style":87},[5970],{"type":44,"value":4911},{"type":29,"tag":63,"props":5972,"children":5973},{"style":76},[5974],{"type":44,"value":912},{"type":29,"tag":63,"props":5976,"children":5977},{"style":87},[5978],{"type":44,"value":4920},{"type":29,"tag":63,"props":5980,"children":5981},{"style":76},[5982],{"type":44,"value":429},{"type":29,"tag":63,"props":5984,"children":5985},{"class":65,"line":251},[5986,5990,5994,5998],{"type":29,"tag":63,"props":5987,"children":5988},{"style":76},[5989],{"type":44,"value":4932},{"type":29,"tag":63,"props":5991,"children":5992},{"style":70},[5993],{"type":44,"value":1258},{"type":29,"tag":63,"props":5995,"children":5996},{"style":117},[5997],{"type":44,"value":4892},{"type":29,"tag":63,"props":5999,"children":6000},{"style":76},[6001],{"type":44,"value":1212},{"type":29,"tag":63,"props":6003,"children":6004},{"class":65,"line":923},[6005],{"type":29,"tag":63,"props":6006,"children":6007},{"style":76},[6008],{"type":44,"value":6009}," initializer,\n",{"type":29,"tag":63,"props":6011,"children":6012},{"class":65,"line":942},[6013,6018],{"type":29,"tag":63,"props":6014,"children":6015},{"style":87},[6016],{"type":44,"value":6017}," ''",{"type":29,"tag":63,"props":6019,"children":6020},{"style":76},[6021],{"type":44,"value":857},{"type":29,"tag":63,"props":6023,"children":6024},{"class":65,"line":987},[6025],{"type":29,"tag":63,"props":6026,"children":6027},{"style":76},[6028],{"type":44,"value":6029}," {\n",{"type":29,"tag":63,"props":6031,"children":6032},{"class":65,"line":995},[6033,6038,6042,6047,6051,6055,6059],{"type":29,"tag":63,"props":6034,"children":6035},{"style":76},[6036],{"type":44,"value":6037}," tChannelImpl: ",{"type":29,"tag":63,"props":6039,"children":6040},{"style":394},[6041],{"type":44,"value":3198},{"type":29,"tag":63,"props":6043,"children":6044},{"style":76},[6045],{"type":44,"value":6046},"._tChannelImplFromWire.",{"type":29,"tag":63,"props":6048,"children":6049},{"style":117},[6050],{"type":44,"value":4968},{"type":29,"tag":63,"props":6052,"children":6053},{"style":76},[6054],{"type":44,"value":238},{"type":29,"tag":63,"props":6056,"children":6057},{"style":394},[6058],{"type":44,"value":3198},{"type":29,"tag":63,"props":6060,"children":6061},{"style":76},[6062],{"type":44,"value":6063},"),\n",{"type":29,"tag":63,"props":6065,"children":6066},{"class":65,"line":1004},[6067,6072,6076,6081,6085,6089,6093],{"type":29,"tag":63,"props":6068,"children":6069},{"style":76},[6070],{"type":44,"value":6071}," binary: ",{"type":29,"tag":63,"props":6073,"children":6074},{"style":394},[6075],{"type":44,"value":3198},{"type":29,"tag":63,"props":6077,"children":6078},{"style":76},[6079],{"type":44,"value":6080},"._rawBuffers ",{"type":29,"tag":63,"props":6082,"children":6083},{"style":70},[6084],{"type":44,"value":4995},{"type":29,"tag":63,"props":6086,"children":6087},{"style":87},[6088],{"type":44,"value":5000},{"type":29,"tag":63,"props":6090,"children":6091},{"style":70},[6092],{"type":44,"value":3976},{"type":29,"tag":63,"props":6094,"children":6095},{"style":87},[6096],{"type":44,"value":6097}," 'fromBase64'\n",{"type":29,"tag":63,"props":6099,"children":6100},{"class":65,"line":23},[6101],{"type":29,"tag":63,"props":6102,"children":6103},{"style":76},[6104],{"type":44,"value":6105}," }\n",{"type":29,"tag":63,"props":6107,"children":6108},{"class":65,"line":1059},[6109],{"type":29,"tag":63,"props":6110,"children":6111},{"style":76},[6112],{"type":44,"value":1289},{"type":29,"tag":63,"props":6114,"children":6115},{"class":65,"line":1091},[6116,6121],{"type":29,"tag":63,"props":6117,"children":6118},{"style":70},[6119],{"type":44,"value":6120}," switch",{"type":29,"tag":63,"props":6122,"children":6123},{"style":76},[6124],{"type":44,"value":6125}," (type) {\n",{"type":29,"tag":63,"props":6127,"children":6128},{"class":65,"line":1108},[6129],{"type":29,"tag":63,"props":6130,"children":6131},{"style":977},[6132],{"type":44,"value":6133}," // ...\n",{"type":29,"tag":63,"props":6135,"children":6136},{"class":65,"line":1116},[6137,6142,6147],{"type":29,"tag":63,"props":6138,"children":6139},{"style":70},[6140],{"type":44,"value":6141}," case",{"type":29,"tag":63,"props":6143,"children":6144},{"style":87},[6145],{"type":44,"value":6146}," 'Playwright'",{"type":29,"tag":63,"props":6148,"children":6149},{"style":76},[6150],{"type":44,"value":6151},":\n",{"type":29,"tag":63,"props":6153,"children":6154},{"class":65,"line":1147},[6155,6160,6164,6168,6172],{"type":29,"tag":63,"props":6156,"children":6157},{"style":76},[6158],{"type":44,"value":6159}," result ",{"type":29,"tag":63,"props":6161,"children":6162},{"style":70},[6163],{"type":44,"value":1258},{"type":29,"tag":63,"props":6165,"children":6166},{"style":70},[6167],{"type":44,"value":893},{"type":29,"tag":63,"props":6169,"children":6170},{"style":117},[6171],{"type":44,"value":2823},{"type":29,"tag":63,"props":6173,"children":6174},{"style":76},[6175],{"type":44,"value":6176},"(parent, type, guid, initializer);\n",{"type":29,"tag":63,"props":6178,"children":6179},{"class":65,"line":1155},[6180,6185],{"type":29,"tag":63,"props":6181,"children":6182},{"style":70},[6183],{"type":44,"value":6184}," break",{"type":29,"tag":63,"props":6186,"children":6187},{"style":76},[6188],{"type":44,"value":1244},{"type":29,"tag":63,"props":6190,"children":6191},{"class":65,"line":1164},[6192],{"type":29,"tag":63,"props":6193,"children":6194},{"style":977},[6195],{"type":44,"value":6133},{"type":29,"tag":63,"props":6197,"children":6198},{"class":65,"line":1183},[6199],{"type":29,"tag":63,"props":6200,"children":6201},{"style":76},[6202],{"type":44,"value":2123},{"type":29,"tag":63,"props":6204,"children":6205},{"class":65,"line":1215},[6206,6210],{"type":29,"tag":63,"props":6207,"children":6208},{"style":70},[6209],{"type":44,"value":1704},{"type":29,"tag":63,"props":6211,"children":6212},{"style":76},[6213],{"type":44,"value":6214}," result;\n",{"type":29,"tag":63,"props":6216,"children":6217},{"class":65,"line":1224},[6218],{"type":29,"tag":63,"props":6219,"children":6220},{"style":76},[6221],{"type":44,"value":257},{"type":29,"tag":30,"props":6223,"children":6224},{},[6225,6227,6233,6234,6240,6242,6247,6249,6254,6256,6261,6263,6268,6270,6275,6277,6283,6285,6290,6292,6297,6299,6305],{"type":44,"value":6226},"The parameter ",{"type":29,"tag":59,"props":6228,"children":6230},{"className":6229},[],[6231],{"type":44,"value":6232},"tChannelImpl: _tChannelImplFromWire",{"type":44,"value":4578},{"type":29,"tag":59,"props":6235,"children":6237},{"className":6236},[],[6238],{"type":44,"value":6239},"validator",{"type":44,"value":6241}," function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the ",{"type":29,"tag":59,"props":6243,"children":6245},{"className":6244},[],[6246],{"type":44,"value":2148},{"type":44,"value":6248}," variable in the ",{"type":29,"tag":59,"props":6250,"children":6252},{"className":6251},[],[6253],{"type":44,"value":679},{"type":44,"value":6255}," class. If you look at the type definition in ",{"type":29,"tag":59,"props":6257,"children":6259},{"className":6258},[],[6260],{"type":44,"value":679},{"type":44,"value":6262}," the ",{"type":29,"tag":59,"props":6264,"children":6266},{"className":6265},[],[6267],{"type":44,"value":2148},{"type":44,"value":6269}," variable is a map returning one of the ",{"type":29,"tag":59,"props":6271,"children":6273},{"className":6272},[],[6274],{"type":44,"value":604},{"type":44,"value":6276}," subclasses. So in the result above for the ",{"type":29,"tag":59,"props":6278,"children":6280},{"className":6279},[],[6281],{"type":44,"value":6282},"case: 'Playwright'",{"type":44,"value":6284},", it returns a ",{"type":29,"tag":59,"props":6286,"children":6288},{"className":6287},[],[6289],{"type":44,"value":12},{"type":44,"value":6291}," instance, which is a subclass of ",{"type":29,"tag":59,"props":6293,"children":6295},{"className":6294},[],[6296],{"type":44,"value":604},{"type":44,"value":6298},", defined in ",{"type":29,"tag":59,"props":6300,"children":6302},{"className":6301},[],[6303],{"type":44,"value":6304},"client/playwright.ts",{"type":44,"value":228},{"type":29,"tag":39,"props":6307,"children":6309},{"id":6308},"launching-the-browser-instance",[6310],{"type":44,"value":6311},"Launching the browser instance",{"type":29,"tag":30,"props":6313,"children":6314},{},[6315,6317,6322,6324,6330],{"type":44,"value":6316},"The final bit of code in ",{"type":29,"tag":59,"props":6318,"children":6320},{"className":6319},[],[6321],{"type":44,"value":504},{"type":44,"value":6323}," to consider is the ",{"type":29,"tag":59,"props":6325,"children":6327},{"className":6326},[],[6328],{"type":44,"value":6329},"_serverLauncher",{"type":44,"value":6331}," variables being set in each of the drivers. This is written as",{"type":29,"tag":52,"props":6333,"children":6335},{"className":54,"code":6334,"filename":730,"language":56,"meta":7,"style":7},"playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(\n \"chromium\"\n);\nplaywrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(\n \"firefox\"\n);\nplaywrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(\"webkit\");\n",[6336],{"type":29,"tag":59,"props":6337,"children":6338},{"__ignoreMap":7},[6339,6363,6371,6378,6402,6410,6417],{"type":29,"tag":63,"props":6340,"children":6341},{"class":65,"line":66},[6342,6347,6351,6355,6359],{"type":29,"tag":63,"props":6343,"children":6344},{"style":76},[6345],{"type":44,"value":6346},"playwrightAPI.chromium._serverLauncher ",{"type":29,"tag":63,"props":6348,"children":6349},{"style":70},[6350],{"type":44,"value":1258},{"type":29,"tag":63,"props":6352,"children":6353},{"style":70},[6354],{"type":44,"value":893},{"type":29,"tag":63,"props":6356,"children":6357},{"style":117},[6358],{"type":44,"value":1267},{"type":29,"tag":63,"props":6360,"children":6361},{"style":76},[6362],{"type":44,"value":1212},{"type":29,"tag":63,"props":6364,"children":6365},{"class":65,"line":93},[6366],{"type":29,"tag":63,"props":6367,"children":6368},{"style":87},[6369],{"type":44,"value":6370}," \"chromium\"\n",{"type":29,"tag":63,"props":6372,"children":6373},{"class":65,"line":103},[6374],{"type":29,"tag":63,"props":6375,"children":6376},{"style":76},[6377],{"type":44,"value":429},{"type":29,"tag":63,"props":6379,"children":6380},{"class":65,"line":138},[6381,6386,6390,6394,6398],{"type":29,"tag":63,"props":6382,"children":6383},{"style":76},[6384],{"type":44,"value":6385},"playwrightAPI.firefox._serverLauncher ",{"type":29,"tag":63,"props":6387,"children":6388},{"style":70},[6389],{"type":44,"value":1258},{"type":29,"tag":63,"props":6391,"children":6392},{"style":70},[6393],{"type":44,"value":893},{"type":29,"tag":63,"props":6395,"children":6396},{"style":117},[6397],{"type":44,"value":1267},{"type":29,"tag":63,"props":6399,"children":6400},{"style":76},[6401],{"type":44,"value":1212},{"type":29,"tag":63,"props":6403,"children":6404},{"class":65,"line":178},[6405],{"type":29,"tag":63,"props":6406,"children":6407},{"style":87},[6408],{"type":44,"value":6409}," \"firefox\"\n",{"type":29,"tag":63,"props":6411,"children":6412},{"class":65,"line":213},[6413],{"type":29,"tag":63,"props":6414,"children":6415},{"style":76},[6416],{"type":44,"value":429},{"type":29,"tag":63,"props":6418,"children":6419},{"class":65,"line":251},[6420,6425,6429,6433,6437,6441,6446],{"type":29,"tag":63,"props":6421,"children":6422},{"style":76},[6423],{"type":44,"value":6424},"playwrightAPI.webkit._serverLauncher ",{"type":29,"tag":63,"props":6426,"children":6427},{"style":70},[6428],{"type":44,"value":1258},{"type":29,"tag":63,"props":6430,"children":6431},{"style":70},[6432],{"type":44,"value":893},{"type":29,"tag":63,"props":6434,"children":6435},{"style":117},[6436],{"type":44,"value":1267},{"type":29,"tag":63,"props":6438,"children":6439},{"style":76},[6440],{"type":44,"value":238},{"type":29,"tag":63,"props":6442,"children":6443},{"style":87},[6444],{"type":44,"value":6445},"\"webkit\"",{"type":29,"tag":63,"props":6447,"children":6448},{"style":76},[6449],{"type":44,"value":429},{"type":29,"tag":30,"props":6451,"children":6452},{},[6453,6454,6460,6462,6467,6469,6475,6477,6483],{"type":44,"value":3475},{"type":29,"tag":59,"props":6455,"children":6457},{"className":6456},[],[6458],{"type":44,"value":6459},"BrowserServerLauncherImpl",{"type":44,"value":6461}," class is defined next to the ",{"type":29,"tag":59,"props":6463,"children":6465},{"className":6464},[],[6466],{"type":44,"value":496},{"type":44,"value":6468}," file in ",{"type":29,"tag":59,"props":6470,"children":6472},{"className":6471},[],[6473],{"type":44,"value":6474},"browserServerLauncherImpl.ts",{"type":44,"value":6476},". The main functionality in this class lies in the ",{"type":29,"tag":59,"props":6478,"children":6480},{"className":6479},[],[6481],{"type":44,"value":6482},"launchServer",{"type":44,"value":6484}," function, and is only called when you use the",{"type":29,"tag":52,"props":6486,"children":6489},{"className":54,"code":6487,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\nplaywright.chromium.launchServer(serverOptions);\n","my-script.ts",[6490],{"type":29,"tag":59,"props":6491,"children":6492},{"__ignoreMap":7},[6493,6517,6524],{"type":29,"tag":63,"props":6494,"children":6495},{"class":65,"line":66},[6496,6500,6505,6509,6513],{"type":29,"tag":63,"props":6497,"children":6498},{"style":70},[6499],{"type":44,"value":73},{"type":29,"tag":63,"props":6501,"children":6502},{"style":76},[6503],{"type":44,"value":6504}," playwright ",{"type":29,"tag":63,"props":6506,"children":6507},{"style":70},[6508],{"type":44,"value":84},{"type":29,"tag":63,"props":6510,"children":6511},{"style":87},[6512],{"type":44,"value":1779},{"type":29,"tag":63,"props":6514,"children":6515},{"style":76},[6516],{"type":44,"value":1244},{"type":29,"tag":63,"props":6518,"children":6519},{"class":65,"line":93},[6520],{"type":29,"tag":63,"props":6521,"children":6522},{"emptyLinePlaceholder":97},[6523],{"type":44,"value":100},{"type":29,"tag":63,"props":6525,"children":6526},{"class":65,"line":103},[6527,6532,6536],{"type":29,"tag":63,"props":6528,"children":6529},{"style":76},[6530],{"type":44,"value":6531},"playwright.chromium.",{"type":29,"tag":63,"props":6533,"children":6534},{"style":117},[6535],{"type":44,"value":6482},{"type":29,"tag":63,"props":6537,"children":6538},{"style":76},[6539],{"type":44,"value":6540},"(serverOptions);\n",{"type":29,"tag":30,"props":6542,"children":6543},{},[6544,6546,6552],{"type":44,"value":6545},"function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the ",{"type":29,"tag":59,"props":6547,"children":6549},{"className":6548},[],[6550],{"type":44,"value":6551},"'playwright-core'",{"type":44,"value":6553}," library, something like",{"type":29,"tag":52,"props":6555,"children":6557},{"className":54,"code":6556,"filename":6488,"language":56,"meta":7,"style":7},"import playwright from \"playwright-core\";\n\n(async function () {\n const browser = await playwright.chromium.launch({ headless: false });\n const page = await browser.newPage();\n await page.goto(\"https://playwright.dev\");\n // ... automate page interactions here\n})();\n",[6558],{"type":29,"tag":59,"props":6559,"children":6560},{"__ignoreMap":7},[6561,6584,6591,6611,6653,6684,6713,6721],{"type":29,"tag":63,"props":6562,"children":6563},{"class":65,"line":66},[6564,6568,6572,6576,6580],{"type":29,"tag":63,"props":6565,"children":6566},{"style":70},[6567],{"type":44,"value":73},{"type":29,"tag":63,"props":6569,"children":6570},{"style":76},[6571],{"type":44,"value":6504},{"type":29,"tag":63,"props":6573,"children":6574},{"style":70},[6575],{"type":44,"value":84},{"type":29,"tag":63,"props":6577,"children":6578},{"style":87},[6579],{"type":44,"value":1779},{"type":29,"tag":63,"props":6581,"children":6582},{"style":76},[6583],{"type":44,"value":1244},{"type":29,"tag":63,"props":6585,"children":6586},{"class":65,"line":93},[6587],{"type":29,"tag":63,"props":6588,"children":6589},{"emptyLinePlaceholder":97},[6590],{"type":44,"value":100},{"type":29,"tag":63,"props":6592,"children":6593},{"class":65,"line":103},[6594,6598,6602,6606],{"type":29,"tag":63,"props":6595,"children":6596},{"style":76},[6597],{"type":44,"value":238},{"type":29,"tag":63,"props":6599,"children":6600},{"style":70},[6601],{"type":44,"value":109},{"type":29,"tag":63,"props":6603,"children":6604},{"style":70},[6605],{"type":44,"value":114},{"type":29,"tag":63,"props":6607,"children":6608},{"style":76},[6609],{"type":44,"value":6610}," () {\n",{"type":29,"tag":63,"props":6612,"children":6613},{"class":65,"line":138},[6614,6618,6622,6626,6630,6635,6639,6644,6649],{"type":29,"tag":63,"props":6615,"children":6616},{"style":70},[6617],{"type":44,"value":144},{"type":29,"tag":63,"props":6619,"children":6620},{"style":394},[6621],{"type":44,"value":150},{"type":29,"tag":63,"props":6623,"children":6624},{"style":70},[6625],{"type":44,"value":155},{"type":29,"tag":63,"props":6627,"children":6628},{"style":70},[6629],{"type":44,"value":160},{"type":29,"tag":63,"props":6631,"children":6632},{"style":76},[6633],{"type":44,"value":6634}," playwright.chromium.",{"type":29,"tag":63,"props":6636,"children":6637},{"style":117},[6638],{"type":44,"value":170},{"type":29,"tag":63,"props":6640,"children":6641},{"style":76},[6642],{"type":44,"value":6643},"({ headless: ",{"type":29,"tag":63,"props":6645,"children":6646},{"style":394},[6647],{"type":44,"value":6648},"false",{"type":29,"tag":63,"props":6650,"children":6651},{"style":76},[6652],{"type":44,"value":5014},{"type":29,"tag":63,"props":6654,"children":6655},{"class":65,"line":178},[6656,6660,6664,6668,6672,6676,6680],{"type":29,"tag":63,"props":6657,"children":6658},{"style":70},[6659],{"type":44,"value":144},{"type":29,"tag":63,"props":6661,"children":6662},{"style":394},[6663],{"type":44,"value":188},{"type":29,"tag":63,"props":6665,"children":6666},{"style":70},[6667],{"type":44,"value":155},{"type":29,"tag":63,"props":6669,"children":6670},{"style":70},[6671],{"type":44,"value":160},{"type":29,"tag":63,"props":6673,"children":6674},{"style":76},[6675],{"type":44,"value":201},{"type":29,"tag":63,"props":6677,"children":6678},{"style":117},[6679],{"type":44,"value":206},{"type":29,"tag":63,"props":6681,"children":6682},{"style":76},[6683],{"type":44,"value":939},{"type":29,"tag":63,"props":6685,"children":6686},{"class":65,"line":213},[6687,6691,6696,6700,6704,6709],{"type":29,"tag":63,"props":6688,"children":6689},{"style":70},[6690],{"type":44,"value":219},{"type":29,"tag":63,"props":6692,"children":6693},{"style":76},[6694],{"type":44,"value":6695}," page.",{"type":29,"tag":63,"props":6697,"children":6698},{"style":117},[6699],{"type":44,"value":233},{"type":29,"tag":63,"props":6701,"children":6702},{"style":76},[6703],{"type":44,"value":238},{"type":29,"tag":63,"props":6705,"children":6706},{"style":87},[6707],{"type":44,"value":6708},"\"https://playwright.dev\"",{"type":29,"tag":63,"props":6710,"children":6711},{"style":76},[6712],{"type":44,"value":429},{"type":29,"tag":63,"props":6714,"children":6715},{"class":65,"line":251},[6716],{"type":29,"tag":63,"props":6717,"children":6718},{"style":977},[6719],{"type":44,"value":6720}," // ... automate page interactions here\n",{"type":29,"tag":63,"props":6722,"children":6723},{"class":65,"line":923},[6724],{"type":29,"tag":63,"props":6725,"children":6726},{"style":76},[6727],{"type":44,"value":6728},"})();\n",{"type":29,"tag":30,"props":6730,"children":6731},{},[6732,6734,6739],{"type":44,"value":6733},"so for now we skip giving an overview of the ",{"type":29,"tag":59,"props":6735,"children":6737},{"className":6736},[],[6738],{"type":44,"value":6459},{"type":44,"value":6740}," code and defer it to a later post.",{"type":29,"tag":39,"props":6742,"children":6744},{"id":6743},"recap",[6745],{"type":44,"value":6746},"Recap",{"type":29,"tag":30,"props":6748,"children":6749},{},[6750],{"type":44,"value":6751},"Whew! That was quite the journey, so let's recap the main points we covered in this post:",{"type":29,"tag":6753,"props":6754,"children":6755},"ul",{},[6756,6780,6798,6822,6833,6859,6882,6894,6939],{"type":29,"tag":6757,"props":6758,"children":6759},"li",{},[6760,6765,6767,6772,6774,6779],{"type":29,"tag":59,"props":6761,"children":6763},{"className":6762},[],[6764],{"type":44,"value":298},{"type":44,"value":6766}," is a wrapper around the test runner package ",{"type":29,"tag":59,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":44,"value":313},{"type":44,"value":6773}," and the browser automation package ",{"type":29,"tag":59,"props":6775,"children":6777},{"className":6776},[],[6778],{"type":44,"value":306},{"type":44,"value":228},{"type":29,"tag":6757,"props":6781,"children":6782},{},[6783,6785,6790,6792,6797],{"type":44,"value":6784},"Importing from ",{"type":29,"tag":59,"props":6786,"children":6788},{"className":6787},[],[6789],{"type":44,"value":287},{"type":44,"value":6791}," is a dynamically generated process under the hood, which is done in ",{"type":29,"tag":59,"props":6793,"children":6795},{"className":6794},[],[6796],{"type":44,"value":730},{"type":44,"value":228},{"type":29,"tag":6757,"props":6799,"children":6800},{},[6801,6802,6807,6809,6814,6815,6820],{"type":44,"value":570},{"type":29,"tag":59,"props":6803,"children":6805},{"className":6804},[],[6806],{"type":44,"value":287},{"type":44,"value":6808}," there are two main libraries, the ",{"type":29,"tag":59,"props":6810,"children":6812},{"className":6811},[],[6813],{"type":44,"value":519},{"type":44,"value":281},{"type":29,"tag":59,"props":6816,"children":6818},{"className":6817},[],[6819],{"type":44,"value":527},{"type":44,"value":6821}," libraries.",{"type":29,"tag":6757,"props":6823,"children":6824},{},[6825,6827,6832],{"type":44,"value":6826},"This separation exists so other programming languages can easily build a client library which communicates with the ",{"type":29,"tag":59,"props":6828,"children":6830},{"className":6829},[],[6831],{"type":44,"value":527},{"type":44,"value":559},{"type":29,"tag":6757,"props":6834,"children":6835},{},[6836,6838,6843,6845,6850,6852,6857],{"type":44,"value":6837},"The client-side API and server-side API communicate with each other over a client-side ",{"type":29,"tag":59,"props":6839,"children":6841},{"className":6840},[],[6842],{"type":44,"value":679},{"type":44,"value":6844}," object and a server-side ",{"type":29,"tag":59,"props":6846,"children":6848},{"className":6847},[],[6849],{"type":44,"value":687},{"type":44,"value":6851}," object. These pass messages with one another through their runtime-defined ",{"type":29,"tag":59,"props":6853,"children":6855},{"className":6854},[],[6856],{"type":44,"value":1015},{"type":44,"value":6858}," callback.",{"type":29,"tag":6757,"props":6860,"children":6861},{},[6862,6867,6869,6874,6875,6880],{"type":29,"tag":59,"props":6863,"children":6865},{"className":6864},[],[6866],{"type":44,"value":679},{"type":44,"value":6868}," is responsible for constructing client side API's, the API methods you import from ",{"type":29,"tag":59,"props":6870,"children":6872},{"className":6871},[],[6873],{"type":44,"value":287},{"type":44,"value":4732},{"type":29,"tag":59,"props":6876,"children":6878},{"className":6877},[],[6879],{"type":44,"value":687},{"type":44,"value":6881}," is responsible for keeping track of the dispatcher objects on the server side.",{"type":29,"tag":6757,"props":6883,"children":6884},{},[6885,6887,6892],{"type":44,"value":6886},"The instances of the ",{"type":29,"tag":59,"props":6888,"children":6890},{"className":6889},[],[6891],{"type":44,"value":619},{"type":44,"value":6893}," subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.",{"type":29,"tag":6757,"props":6895,"children":6896},{},[6897,6902,6904,6909,6911,6916,6918,6923,6925,6930,6932,6937],{"type":29,"tag":59,"props":6898,"children":6900},{"className":6899},[],[6901],{"type":44,"value":679},{"type":44,"value":6903}," is wrapped by ",{"type":29,"tag":59,"props":6905,"children":6907},{"className":6906},[],[6908],{"type":44,"value":604},{"type":44,"value":6910}," subclasses, which all point to the same instance of ",{"type":29,"tag":59,"props":6912,"children":6914},{"className":6913},[],[6915],{"type":44,"value":679},{"type":44,"value":6917}," and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. ",{"type":29,"tag":59,"props":6919,"children":6921},{"className":6920},[],[6922],{"type":44,"value":642},{"type":44,"value":6924},". Similarly, ",{"type":29,"tag":59,"props":6926,"children":6928},{"className":6927},[],[6929],{"type":44,"value":687},{"type":44,"value":6931}," is wrapped by a subclass of ",{"type":29,"tag":59,"props":6933,"children":6935},{"className":6934},[],[6936],{"type":44,"value":619},{"type":44,"value":6938}," which is responsible for a part of the automated browser.",{"type":29,"tag":6757,"props":6940,"children":6941},{},[6942,6944,6949,6950,6955,6957,6963],{"type":44,"value":6943},"Both the ",{"type":29,"tag":59,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6951,"children":6953},{"className":6952},[],[6954],{"type":44,"value":687},{"type":44,"value":6956}," classes keep track of the same object on each side of the client/server side of the divide with a unique ",{"type":29,"tag":59,"props":6958,"children":6960},{"className":6959},[],[6961],{"type":44,"value":6962},"GUID",{"type":44,"value":228},{"type":29,"tag":30,"props":6965,"children":6966},{},[6967,6969,6974,6975,6980],{"type":44,"value":6968},"Once you have parsed the functionality of ",{"type":29,"tag":59,"props":6970,"children":6972},{"className":6971},[],[6973],{"type":44,"value":679},{"type":44,"value":281},{"type":29,"tag":59,"props":6976,"children":6978},{"className":6977},[],[6979],{"type":44,"value":687},{"type":44,"value":6981},", and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.",{"type":29,"tag":6983,"props":6984,"children":6985},"style",{},[6986],{"type":44,"value":6987},"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);}",{"title":7,"searchDepth":93,"depth":93,"links":6989},[6990,6995,6996,7002,7003],{"id":41,"depth":93,"text":45,"children":6991},[6992,6994],{"id":271,"depth":103,"text":6993},"Merging playwright and playwright-core",{"id":562,"depth":103,"text":565},{"id":704,"depth":93,"text":707},{"id":2168,"depth":93,"text":2171,"children":6997},[6998,6999,7000,7001],{"id":2633,"depth":103,"text":2636},{"id":3374,"depth":103,"text":3377},{"id":4626,"depth":103,"text":4629},{"id":4806,"depth":103,"text":4809},{"id":6308,"depth":93,"text":6311},{"id":6743,"depth":93,"text":6746},"markdown","content:playwright:how-playwright-initializes.md","content","playwright/how-playwright-initializes.md","md",1717143082854] \ No newline at end of file diff --git a/playwright/how-playwright-initializes/index.html b/playwright/how-playwright-initializes/index.html index b682c24..58605ec 100644 --- a/playwright/how-playwright-initializes/index.html +++ b/playwright/how-playwright-initializes/index.html @@ -22,52 +22,53 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Diagram of playwright-core initialization process

Peering into Playwright's import process

Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet

import { chromium } from '@playwright/test'
+
+

Diagram of playwright-core initialization process

Peering into Playwright's import process

Whenever you import playwright, there's a lot of code being executed before you can actually execute anything with its APIs. In the following short snippet

import { chromium } from '@playwright/test'
 
 async function main () => {
   const browser = await chromium.launch()
   const page = await browser.newPage()
   await page.goto("https://qacomet.com")
 }
-

Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.

In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.

Merging playwright and playwright-core

Internally, when you import from @playwright/test, there is an underlying call to import from two merged packages, packages/playwright-core and packages/playwright. This merge happens in packages/playwright/test, since @playwright/test is just an outward facinging export of require('playwright/test'), an alias for packages/playwright/test. This is where the test execution API's from packages/playwright are combined with the browser automation API's from packages/playwright-core.

We will focus on the import from playwright-core, since it provides the core browser automation and is the code every other client library wraps. Looking at its index.js file

packages/playwright-core/index.js
module.exports = require("./lib/inprocess");
-

gives an export from its lib/inprocess.ts file (note the src directory is compiled to the lib directory after playwright runs its build script, and is what's found in node_modules/playwright-core, hence the require imports from ./lib/ and not ./src/). The inprocess.ts file just imports from the adjacent inProcessFactory.ts and executes the function from there, called createInProcessPlaywright. We include the source below in its own section but note createInProcessPlaywright dynamically intiailizes the interface between the client library, defined in src/client, and the server library, defined in src/server. The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.

This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the playwright-python source code, you will find the same design patterns and classes defined in playwright-core's src/client library.

Rapid overview of the client and server libraries

In playwright-core the main functionality can be found in the src/client and src/server folders. The client folder contains classes, many of which are subclasses of the ChannelOwner class. This ChannelOwner class is a client-side representation of a corresponding server-side Dispatcher class in the src/server/dispatchers folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ChannelOwner subclass called Page, containing the client side APIs (such as page.goto), there is a corresponding Dispatcher subclass called PageDispatcher. When we call page.goto a message is send over the unique client Connection instance to the unique DispatcherConnection instance, which calls the corresponding PageDispatcher, which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.

Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.

Playwright's core API factory, createInProcessPlaywright

This file, inProcessFactory.ts, contains only one function called createInProcessPlaywright. We include it here as a reference:

packages/playwright-core/src/inProcessFactory.ts
export function createInProcessPlaywright(): PlaywrightAPI {
+

Playwright is initializing a server controlling the browser instance, building a connection between its underlying client and server library, and using a factory method to create a client-facing API for manipulating the browser. This long seemingly roundabout process is actually Playwright's secret sauce for much of its functionality. Because of this architectural decision, it is now possible to create client API's for Playwright in multiple languages, all which use the same underlying software architecture. This gives a consistent developer experience across projects spanning multiple languages, such as Javascript, Python, Java, and .NET. In addition, it's now easier to build future community supported clients in other languages, such as in Ruby, because of the replicability of Playwright's core interfaces.

In order to see how the general project is structured, and how its design patterns can be replicated across clients, we trace through Playwright's initialization process in its core Typescript project, on which every other client library depends. By doing this, we will view its internals giving a clear picture of its internal architecture.

Merging playwright and playwright-core

Internally, when you import from @playwright/test, there is an underlying call to import from two merged packages, packages/playwright-core and packages/playwright. This merge happens in packages/playwright/test, since @playwright/test is just an outward facinging export of require('playwright/test'), an alias for packages/playwright/test. This is where the test execution API's from packages/playwright are combined with the browser automation API's from packages/playwright-core.

We will focus on the import from playwright-core, since it provides the core browser automation and is the code every other client library wraps. Looking at its index.js file

packages/playwright-core/index.js
module.exports = require("./lib/inprocess");
+

gives an export from its lib/inprocess.ts file (note the src directory is compiled to the lib directory after playwright runs its build script, and is what's found in node_modules/playwright-core, hence the require imports from ./lib/ and not ./src/). The inprocess.ts file just imports from the adjacent inProcessFactory.ts and executes the function from there, called createInProcessPlaywright. We include the source below in its own section but note createInProcessPlaywright dynamically intiailizes the interface between the client library, defined in src/client, and the server library, defined in src/server. The server library is responsible for dispatching browser automation actions over a browser automation protocol, such as the Chrome Devtools Protocol, abbreviated as CDP, while the client library gives a public API for playwright users to interact with the server library.

This separation of logic between client and server is what gives implementations of the client library in multiple languages. For example, if you look in the playwright-python source code, you will find the same design patterns and classes defined in playwright-core's src/client library.

Rapid overview of the client and server libraries

In playwright-core the main functionality can be found in the src/client and src/server folders. The client folder contains classes, many of which are subclasses of the ChannelOwner class. This ChannelOwner class is a client-side representation of a corresponding server-side Dispatcher class in the src/server/dispatchers folder. These dispatcher classes manage communication from the server library to the browser being automated. So for a ChannelOwner subclass called Page, containing the client side APIs (such as page.goto), there is a corresponding Dispatcher subclass called PageDispatcher. When we call page.goto a message is send over the unique client Connection instance to the unique DispatcherConnection instance, which calls the corresponding PageDispatcher, which then marshalls the automation command to the running browser process. This is a repeated pattern for many of the client-facing APIs you use while writing browser automation scripts with Playwright.

Understanding the inner workings of these abstractions is essential for grokking the architecture of Playwright, which we touch on soon. But first, let's go back to tracing the import process from Playwright and see how that works.

Playwright's core API factory, createInProcessPlaywright

This file, inProcessFactory.ts, contains only one function called createInProcessPlaywright. We include it here as a reference:

packages/playwright-core/src/inProcessFactory.ts
export function createInProcessPlaywright(): PlaywrightAPI {
   const playwright = createPlaywright({
     sdkLanguage:
       (process.env.PW_LANG_NAME as Language | undefined) || "javascript",
@@ -114,20 +115,20 @@
   (playwrightAPI as any)._toImpl = clientConnection.toImpl;
   return playwrightAPI;
 }
-

If you scan through the script and look at the return value, you'll see Playwright is returning the PlaywrightAPI instance playwrightAPI, which is defined somewhere within the client library playwright-core/src/client/ (which we find from our type hints). So when we write a script using playwright-core

my-automation-script.ts
import { chromium } from "playwright-core";
-

really we are making an import of the playwrightAPI object and accessing its chromium property, so our script is secretly

my-automation-script.ts
import playwrightAPI from "playwright-core";
+

If you scan through the script and look at the return value, you'll see Playwright is returning the PlaywrightAPI instance playwrightAPI, which is defined somewhere within the client library playwright-core/src/client/ (which we find from our type hints). So when we write a script using playwright-core

my-automation-script.ts
import { chromium } from "playwright-core";
+

really we are making an import of the playwrightAPI object and accessing its chromium property, so our script is secretly

my-automation-script.ts
import playwrightAPI from "playwright-core";
 const { chromium } = playwrightAPI;
-

Tracing where this object is instantiated, we find the call

packages/playwright-core/src/inProcessFactory.ts
const playwrightAPI = clientConnection.getObjectWithKnownName(
+

Tracing where this object is instantiated, we find the call

packages/playwright-core/src/inProcessFactory.ts
const playwrightAPI = clientConnection.getObjectWithKnownName(
   "Playwright"
 ) as PlaywrightAPI;
-

which is not very descriptive. If you try looking in the Connection class definition, you won't get very far either, you'll just see

packages/playwright-core/src/client/connection.ts
export class Connection extends EventEmitter {
+

which is not very descriptive. If you try looking in the Connection class definition, you won't get very far either, you'll just see

packages/playwright-core/src/client/connection.ts
export class Connection extends EventEmitter {
   readonly _objects = new Map<string, ChannelOwner>();
   // ...
   getObjectWithKnownName(guid: string): any {
     return this._objects.get(guid)!;
   }
 }
-

which is even more opaque. From this all we know is the Connection class keeps an _objects map which at some point contains an instance of PlaywrightAPI, so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within inProcessFactory will give us a clear picture of how this library is wrapped together.

Cross communication between client and server

If you look through the script's imports, anything with Dispatcher in its name, and createPlaywright, come from the server directroy. The createPlaywright function creates an instance of the Playwright class defined in packages/playwright-core/server/playwright.ts.

Similarly, the imports for Connection and PlaywrightAPI come from the src/client directory. Looking through the first lines of inProcessFactory, there is an instantiation of the server Playwright class and instantiation of objects for the ClientConnection and DispatcherConnection classes

packages/playwright-core/src/inProcessFactory.ts
const playwright = createPlaywright({
+

which is even more opaque. From this all we know is the Connection class keeps an _objects map which at some point contains an instance of PlaywrightAPI, so tracing the calls directly is not the most helpful choice for understanding Playwright's initialization. Instead, going through the logic within inProcessFactory will give us a clear picture of how this library is wrapped together.

Cross communication between client and server

If you look through the script's imports, anything with Dispatcher in its name, and createPlaywright, come from the server directroy. The createPlaywright function creates an instance of the Playwright class defined in packages/playwright-core/server/playwright.ts.

Similarly, the imports for Connection and PlaywrightAPI come from the src/client directory. Looking through the first lines of inProcessFactory, there is an instantiation of the server Playwright class and instantiation of objects for the ClientConnection and DispatcherConnection classes

packages/playwright-core/src/inProcessFactory.ts
const playwright = createPlaywright({
   sdkLanguage:
     (process.env.PW_LANG_NAME as Language | undefined) || "javascript",
 });
@@ -135,11 +136,11 @@
 const clientConnection = new Connection(undefined, undefined);
 clientConnection.useRawBuffers();
 const dispatcherConnection = new DispatcherConnection(true /* local */);
-

The next lines of code are the bridge between the internal client and server libraries

packages/playwright-core/src/inProcessFactory.ts
dispatcherConnection.onmessage = (message) =>
+

The next lines of code are the bridge between the internal client and server libraries

packages/playwright-core/src/inProcessFactory.ts
dispatcherConnection.onmessage = (message) =>
   clientConnection.dispatch(message);
 clientConnection.onmessage = (message) =>
   dispatcherConnection.dispatch(message);
-

given by setting the onmessage properties for each of these objects. Notice each onmessage calls the other's dispatch method; i.e., dispatcherConnection calls the clientConnection.dispatch through onmessage and vice versa. This gives us the hint somehow dispatcherConnection.onmessage will be called somewhere in the codebase.

Server-side createPlaywright

Before we continue down the logic within createInProcessPlaywright, let's go over what the createPlaywright function actually does. It is a simple function call which instantiates the Playwright class defined in packages/playwright-core/server/playwright.ts. Below is a simplified version of it

packages/playwright-core/server/playwright.ts
import { Chromium } from "./chromium/chromium";
+

given by setting the onmessage properties for each of these objects. Notice each onmessage calls the other's dispatch method; i.e., dispatcherConnection calls the clientConnection.dispatch through onmessage and vice versa. This gives us the hint somehow dispatcherConnection.onmessage will be called somewhere in the codebase.

Server-side createPlaywright

Before we continue down the logic within createInProcessPlaywright, let's go over what the createPlaywright function actually does. It is a simple function call which instantiates the Playwright class defined in packages/playwright-core/server/playwright.ts. Below is a simplified version of it

packages/playwright-core/server/playwright.ts
import { Chromium } from "./chromium/chromium";
 import { Firefox } from "./firefox/firefox";
 import { Selectors } from "./selectors";
 import { WebKit } from "./webkit/webkit";
@@ -169,11 +170,11 @@
     this.debugController = new DebugController(this);
   }
 }
-

This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into packages/playwright-core/server/chromium/ you will see all the functionality for automating a chromium browser.

RootDispatcher and server-side Playwright

Continuing down createInProcessPlaywright, we see there's the construction of a RootDispatcher instance, and a PlaywrightDispatcher instance.

packages/playwright-core/src/inProcessFactory.ts
const rootScope = new RootDispatcher(dispatcherConnection);
+

This class contains all of the core browser automation functionality for Playwright. Diving deeper, if you look into packages/playwright-core/server/chromium/ you will see all the functionality for automating a chromium browser.

RootDispatcher and server-side Playwright

Continuing down createInProcessPlaywright, we see there's the construction of a RootDispatcher instance, and a PlaywrightDispatcher instance.

packages/playwright-core/src/inProcessFactory.ts
const rootScope = new RootDispatcher(dispatcherConnection);
 
 // Initialize Playwright channel.
 new PlaywrightDispatcher(rootScope, playwright);
-

Note the rootScope object is referenced throughout the dispatcher classes, and acts as a wrapper around the dispatcherConnection object instantiated above, so that each of the child Dispatcher classes will have access to the dispatcherConnection through the rootScope object. This wrapping functionality will become clearer when we dive into PlaywrightDispatcher's constructor, where it passes the rootScope to all of the child Dispatcher classes.

Here's a simplified version of what's happening in the constructor for Rootscope:

playwright-core/src/server/dispatchers/dispatcher.ts
class RootDispatcher extends Dispatcher {
+

Note the rootScope object is referenced throughout the dispatcher classes, and acts as a wrapper around the dispatcherConnection object instantiated above, so that each of the child Dispatcher classes will have access to the dispatcherConnection through the rootScope object. This wrapping functionality will become clearer when we dive into PlaywrightDispatcher's constructor, where it passes the rootScope to all of the child Dispatcher classes.

Here's a simplified version of what's happening in the constructor for Rootscope:

playwright-core/src/server/dispatchers/dispatcher.ts
class RootDispatcher extends Dispatcher {
   constructor(connection: DispatcherConnection) {
     super(connection, { guid: "" }, "Root", {});
   }
@@ -211,7 +212,7 @@
       );
   }
 }
-

In the Dispatcher constructor we see the connection always comes from either the inherited parent Dispatcher, or from the DispatcherConnection passed into the parent parameter. This, coupled with rootScope having the name root, gives us the hint that every dispatcher in the server library will have access to the dispatcherConnection instance (from createInProcessPlaywright). Furthermore, the dispatcherConnection will register every instance of a subclass of Dispatcher, hinting that it will communicate with each of the Dispatcher objects. These points will become more clear after looking at the PlaywrightDispatcher's constructor.

PlaywrightDispatcher and its constructor

Let's look closer at a slightly simplified version of PlaywrightDispatcher's constructor

packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts
import type { Playwright } from "playwright-core/src/server/playwright";
+

In the Dispatcher constructor we see the connection always comes from either the inherited parent Dispatcher, or from the DispatcherConnection passed into the parent parameter. This, coupled with rootScope having the name root, gives us the hint that every dispatcher in the server library will have access to the dispatcherConnection instance (from createInProcessPlaywright). Furthermore, the dispatcherConnection will register every instance of a subclass of Dispatcher, hinting that it will communicate with each of the Dispatcher objects. These points will become more clear after looking at the PlaywrightDispatcher's constructor.

PlaywrightDispatcher and its constructor

Let's look closer at a slightly simplified version of PlaywrightDispatcher's constructor

packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts
import type { Playwright } from "playwright-core/src/server/playwright";
 
 class PlaywrightDispatcher extends Dispatcher {
   constructor(scope: RootDispatcher, playwright: Playwright) {
@@ -223,7 +224,7 @@
     });
   }
 }
-

Notice the super call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the rootScope from createInProcessPlaywright passed into it as the first parameter. Every call to the server will run through the dispatcherConnection in the rootScope, which then can be traced through calls in each of the dispatcher classes. BrowserTypeDispatcher will launch a BrowserDispatcher, which is responsible for creating a BrowserContextDispatcher, which can create a PageDispatcher, and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original dispatcherConnection defined in the factory method with confidence!

Tying back to the onmessage communication

So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the dispatcherConnection.onmessage and clientConnect.onmessage functions.

From within dispatcherConnection its dispatcherConnection.onmessage function is called from two main methods. These are dispatch and _sendMessageToClient. The first, dispatch, is called from within the clientConnection.onmessage, so the dispatcher.onmessage call in that case acts as a response callback. The second, _sendMessageToClient, is called from the sendEvent, sendCreate, sendAdopt, and sendDestroy methods defined within the dispatcher. Calls to these functions are spread throughout the Dispatcher subclasses which call these functions from their internal _connection variable. These will tell the client to construct, update, and destroy, their corresponding client side ChannelOwner objects.

Separately on the client-side, clientConnection.onmessage is called from sendMessageToServer whenever you use a client-side API. This sends a message over to the dispatcherConnection, which finds the corresponding Dispatcher subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via _sendMessageToClient, as mentioned before.

Synchronizing objects between the Dispatchers and client-side ChannelOwners

The sendCreate function is special because it is only called from within the Dispatcher constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the sendCreate implementation, internally it calls _sendMessageToClient with the __create__ parameter:

packages/playwright-core/src/server/dispatchers/dispatcher.ts
sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {
+

Notice the super call has parameters for each of the driver types (chromium, firefox, etc.), in its initializers object. And each of the values have the rootScope from createInProcessPlaywright passed into it as the first parameter. Every call to the server will run through the dispatcherConnection in the rootScope, which then can be traced through calls in each of the dispatcher classes. BrowserTypeDispatcher will launch a BrowserDispatcher, which is responsible for creating a BrowserContextDispatcher, which can create a PageDispatcher, and so on. The whole hierarchy of dispatchers directly interacting with the automated browser is contained within these few dispatcher initializations. So now we can trace all calls back to the original dispatcherConnection defined in the factory method with confidence!

Tying back to the onmessage communication

So now that we have these server-side dispatchers constructed, let's look back at how the client-side and server-side API's are connected via the dispatcherConnection.onmessage and clientConnect.onmessage functions.

From within dispatcherConnection its dispatcherConnection.onmessage function is called from two main methods. These are dispatch and _sendMessageToClient. The first, dispatch, is called from within the clientConnection.onmessage, so the dispatcher.onmessage call in that case acts as a response callback. The second, _sendMessageToClient, is called from the sendEvent, sendCreate, sendAdopt, and sendDestroy methods defined within the dispatcher. Calls to these functions are spread throughout the Dispatcher subclasses which call these functions from their internal _connection variable. These will tell the client to construct, update, and destroy, their corresponding client side ChannelOwner objects.

Separately on the client-side, clientConnection.onmessage is called from sendMessageToServer whenever you use a client-side API. This sends a message over to the dispatcherConnection, which finds the corresponding Dispatcher subclass, which executes to the corresponding API call to the browser being automated. This will respond back to the client via _sendMessageToClient, as mentioned before.

Synchronizing objects between the Dispatchers and client-side ChannelOwners

The sendCreate function is special because it is only called from within the Dispatcher constructor, hence the constructor of each of its subclasses. This method tells the client connection to create a corresponding client-side class which handles messaging to this dispatcher. Moreover, looking into the sendCreate implementation, internally it calls _sendMessageToClient with the __create__ parameter:

packages/playwright-core/src/server/dispatchers/dispatcher.ts
sendCreate(parent: DispatcherScope, type: string, guid: string, initializer: any, sdkObject?: SdkObject) {
   const validator = findValidator(type, '', 'Initializer');
   initializer = validator(initializer, '', { tChannelImpl: this._tChannelImplToWire.bind(this), binary: this._isLocal ? 'buffer' : 'toBase64' });
   this._sendMessageToClient(parent._guid, type, '__create__', { type, initializer, guid }, sdkObject);
@@ -244,7 +245,7 @@
     guid: 'Playwright'
   }
 }
-

Note before this sendCreate message is passed to create the Playwright API on the client side, there were sendCreate messages for each of the device types, meaning there already exists a client-side BrowserType for chromium, firefox, etc. before the __create__ message for Playwright is sent.

The clientConnection constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ChannelOwner class, which is a concept for a later section. For now, let's trace what happens in the clientConnection for the type: 'Playwright' message.

The sendCreate function calls dispatchConnection.onmessage, which calls the clientConnection.dispatch function, which then calls the clientConnection._createRemoteObject function with the following parameters

packages/playwright-core/src/client/connection.ts
this._createRemoteObject(
+

Note before this sendCreate message is passed to create the Playwright API on the client side, there were sendCreate messages for each of the device types, meaning there already exists a client-side BrowserType for chromium, firefox, etc. before the __create__ message for Playwright is sent.

The clientConnection constructs objects on the client side corresponding to dispatcher objects on the server side. These client side API's are provided by subclasses of the ChannelOwner class, which is a concept for a later section. For now, let's trace what happens in the clientConnection for the type: 'Playwright' message.

The sendCreate function calls dispatchConnection.onmessage, which calls the clientConnection.dispatch function, which then calls the clientConnection._createRemoteObject function with the following parameters

packages/playwright-core/src/client/connection.ts
this._createRemoteObject(
   "", // parentGuid - corresponds to Root, the root ChannelOwner
   "Playwright", // type
   "Playwright", // guid
@@ -257,7 +258,7 @@
     electron: { guid: "electron@3829a7608477101154e15c1e25bca9ca" },
   }
 );
-

In the clientConnection._createRemoteObject function there is a transformation of the data and then a large switch-case function instantiating the corresponding client class.

packages/playwright-core/src/client/connection.ts
_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {
+

In the clientConnection._createRemoteObject function there is a transformation of the data and then a large switch-case function instantiating the corresponding client class.

packages/playwright-core/src/client/connection.ts
_createRemoteObject(parentGuid: string, type: string, guid: string, initializer: any) {
   const parent = this._objects.get(parentGuid); // here the parentGuid is ''
   if (!parent)
     throw new Error(`Cannot find parent object ${parentGuid} to create ${guid}`);
@@ -280,17 +281,17 @@
   }
   return result;
 }
-

The parameter tChannelImpl: _tChannelImplFromWire in the validator function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the _objects variable in the Connection class. If you look at the type definition in Connection the _objects variable is a map returning one of the ChannelOwner subclasses. So in the result above for the case: 'Playwright', it returns a Playwright instance, which is a subclass of ChannelOwner, defined in client/playwright.ts.

Launching the browser instance

The final bit of code in createInProcessPlaywright to consider is the _serverLauncher variables being set in each of the drivers. This is written as

packages/playwright-core/src/inProcessFactory.ts
playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(
+

The parameter tChannelImpl: _tChannelImplFromWire in the validator function is responsible for taking the initializer object above, which contains a guid for each browser, and convert it to the corresponding object stored in the _objects variable in the Connection class. If you look at the type definition in Connection the _objects variable is a map returning one of the ChannelOwner subclasses. So in the result above for the case: 'Playwright', it returns a Playwright instance, which is a subclass of ChannelOwner, defined in client/playwright.ts.

Launching the browser instance

The final bit of code in createInProcessPlaywright to consider is the _serverLauncher variables being set in each of the drivers. This is written as

packages/playwright-core/src/inProcessFactory.ts
playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(
   "chromium"
 );
 playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(
   "firefox"
 );
 playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl("webkit");
-

Note the BrowserServerLauncherImpl class is defined next to the inProcessFactory.ts file in browserServerLauncherImpl.ts. The main functionality in this class lies in the launchServer function, and is only called when you use the

my-script.ts
import playwright from "playwright-core";
+

Note the BrowserServerLauncherImpl class is defined next to the inProcessFactory.ts file in browserServerLauncherImpl.ts. The main functionality in this class lies in the launchServer function, and is only called when you use the

my-script.ts
import playwright from "playwright-core";
 
 playwright.chromium.launchServer(serverOptions);
-

function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the 'playwright-core' library, something like

my-script.ts
import playwright from "playwright-core";
+

function. This is for launching a server which exposes a websocket for other programs to interact with the playwright API. This is not used if you are just writing a node script which accesses the 'playwright-core' library, something like

my-script.ts
import playwright from "playwright-core";
 
 (async function () {
   const browser = await playwright.chromium.launch({ headless: false });
@@ -298,5 +299,5 @@
   await page.goto("https://playwright.dev");
   // ... automate page interactions here
 })();
-

so for now we skip giving an overview of the BrowserServerLauncherImpl code and defer it to a later post.

Recap

Whew! That was quite the journey, so let's recap the main points we covered in this post:

  • @playwright/test is a wrapper around the test runner package packages/playwright and the browser automation package packages/playwright-core.
  • Importing from playwright-core is a dynamically generated process under the hood, which is done in packages/playwright-core/src/inProcessFactory.ts.
  • In playwright-core there are two main libraries, the src/client and src/server libraries.
  • This separation exists so other programming languages can easily build a client library which communicates with the src/server library.
  • The client-side API and server-side API communicate with each other over a client-side Connection object and a server-side DispatcherConnection object. These pass messages with one another through their runtime-defined onmessage callback.
  • Connection is responsible for constructing client side API's, the API methods you import from playwright-core, and DispatcherConnection is responsible for keeping track of the dispatcher objects on the server side.
  • The instances of the Dispatcher subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.
  • Connection is wrapped by ChannelOwner subclasses, which all point to the same instance of Connection and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. Page. Similarly, DispatcherConnection is wrapped by a subclass of Dispatcher which is responsible for a part of the automated browser.
  • Both the Connection and DispatcherConnection classes keep track of the same object on each side of the client/server side of the divide with a unique GUID.

Once you have parsed the functionality of Connection and DispatcherConnection, and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.

- \ No newline at end of file +

so for now we skip giving an overview of the BrowserServerLauncherImpl code and defer it to a later post.

Recap

Whew! That was quite the journey, so let's recap the main points we covered in this post:

  • @playwright/test is a wrapper around the test runner package packages/playwright and the browser automation package packages/playwright-core.
  • Importing from playwright-core is a dynamically generated process under the hood, which is done in packages/playwright-core/src/inProcessFactory.ts.
  • In playwright-core there are two main libraries, the src/client and src/server libraries.
  • This separation exists so other programming languages can easily build a client library which communicates with the src/server library.
  • The client-side API and server-side API communicate with each other over a client-side Connection object and a server-side DispatcherConnection object. These pass messages with one another through their runtime-defined onmessage callback.
  • Connection is responsible for constructing client side API's, the API methods you import from playwright-core, and DispatcherConnection is responsible for keeping track of the dispatcher objects on the server side.
  • The instances of the Dispatcher subclasses are responsible for communicating with the browser. They will send automation commands for their specific scope of functionality.
  • Connection is wrapped by ChannelOwner subclasses, which all point to the same instance of Connection and are responsible for the client-side APIs. Each of which corresponds to a specific component of the browser, e.g. Page. Similarly, DispatcherConnection is wrapped by a subclass of Dispatcher which is responsible for a part of the automated browser.
  • Both the Connection and DispatcherConnection classes keep track of the same object on each side of the client/server side of the divide with a unique GUID.

Once you have parsed the functionality of Connection and DispatcherConnection, and their wrapper APIs, you are at an excellent spot for understanding the whole architecture of Playwright. These core components are essential for providing the client-facing interface used by test-engineers and the facade provided by the server, giving a unified API to automate browser actions.

+ \ No newline at end of file diff --git a/playwright/index.html b/playwright/index.html index 77321e3..4bd0621 100644 --- a/playwright/index.html +++ b/playwright/index.html @@ -21,22 +21,23 @@ - - + + - + - - - - - - - - - - - + + + + + + + + + + + -

Playwright Internals

A series on the inner workings of Microsoft's Playwright framework

Mar
13
2024

How importing from Playwright works

Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured. Continue Reading

Mar
11
2024

Architecture of Playwright

Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components. Continue Reading

- \ No newline at end of file + +

Playwright Internals

A series on the inner workings of Microsoft's Playwright framework

Mar
13
2024

How importing from Playwright works

Importing from playwright is a complex process with many interacting components. Let's look under the hood to discover how playwright-core is structured. Continue Reading

Mar
11
2024

Architecture of Playwright

Let's dive into Playwright's internals by looking at how the project is structured and discover its essential components. Continue Reading

+ \ No newline at end of file diff --git a/privacy-policy/_payload.json b/privacy-policy/_payload.json index 31b3dc7..09f0a31 100644 --- a/privacy-policy/_payload.json +++ b/privacy-policy/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":503},["Reactive",2],{"content-query-LjPlv9Sq1J":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":498,"_id":499,"_source":500,"_file":501,"_extension":502},"/privacy-policy","",false,"Privacy Policy","Effective Date: This Privacy Policy is effective as of February 16, 2024.",{"type":10,"children":11,"toc":481},"root",[12,31,36,43,48,60,71,82,93,104,115,126,131,137,142,149,164,170,188,194,222,227,233,238,267,272,278,283,311,317,322,327,343,356,361,367,372,377,382,387,392,398,403,438,443,449,454,459,464,470],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17,24,26],{"type":13,"tag":18,"props":19,"children":20},"strong",{},[21],{"type":22,"value":23},"text","Effective Date",{"type":22,"value":25},": ",{"type":13,"tag":18,"props":27,"children":28},{},[29],{"type":22,"value":30},"This Privacy Policy is effective as of February 16, 2024.",{"type":13,"tag":14,"props":32,"children":33},{},[34],{"type":22,"value":35},"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information.",{"type":13,"tag":37,"props":38,"children":40},"h2",{"id":39},"definitions",[41],{"type":22,"value":42},"DEFINITIONS:",{"type":13,"tag":14,"props":44,"children":45},{},[46],{"type":22,"value":47},"In this Privacy Policy, unless the context otherwise requires:",{"type":13,"tag":14,"props":49,"children":50},{},[51,53,58],{"type":22,"value":52},"\"",{"type":13,"tag":18,"props":54,"children":55},{},[56],{"type":22,"value":57},"QAComet",{"type":22,"value":59},"\" refers to the website operated by QAComet LLC accessible at QAComet.com",{"type":13,"tag":14,"props":61,"children":62},{},[63,64,69],{"type":22,"value":52},{"type":13,"tag":18,"props":65,"children":66},{},[67],{"type":22,"value":68},"Personal Information",{"type":22,"value":70},"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user.",{"type":13,"tag":14,"props":72,"children":73},{},[74,75,80],{"type":22,"value":52},{"type":13,"tag":18,"props":76,"children":77},{},[78],{"type":22,"value":79},"Non-Personal Information",{"type":22,"value":81},"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":14,"props":83,"children":84},{},[85,86,91],{"type":22,"value":52},{"type":13,"tag":18,"props":87,"children":88},{},[89],{"type":22,"value":90},"Cookies",{"type":22,"value":92},"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content.",{"type":13,"tag":14,"props":94,"children":95},{},[96,97,102],{"type":22,"value":52},{"type":13,"tag":18,"props":98,"children":99},{},[100],{"type":22,"value":101},"Google Analytics",{"type":22,"value":103},"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited.",{"type":13,"tag":14,"props":105,"children":106},{},[107,108,113],{"type":22,"value":52},{"type":13,"tag":18,"props":109,"children":110},{},[111],{"type":22,"value":112},"User",{"type":22,"value":114},"\" refers to any individual who accesses or uses the QAComet website.",{"type":13,"tag":14,"props":116,"children":117},{},[118,119,124],{"type":22,"value":52},{"type":13,"tag":18,"props":120,"children":121},{},[122],{"type":22,"value":123},"Owner",{"type":22,"value":125},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website.",{"type":13,"tag":14,"props":127,"children":128},{},[129],{"type":22,"value":130},"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein.",{"type":13,"tag":37,"props":132,"children":134},{"id":133},"_1-information-collection",[135],{"type":22,"value":136},"1. INFORMATION COLLECTION:",{"type":13,"tag":14,"props":138,"children":139},{},[140],{"type":22,"value":141},"We collect two types of information from users: personal information and non-personal information.",{"type":13,"tag":143,"props":144,"children":146},"h3",{"id":145},"personal-information",[147],{"type":22,"value":148},"Personal Information:",{"type":13,"tag":150,"props":151,"children":152},"ul",{},[153,159],{"type":13,"tag":154,"props":155,"children":156},"li",{},[157],{"type":22,"value":158},"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website.",{"type":13,"tag":154,"props":160,"children":161},{},[162],{"type":22,"value":163},"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website.",{"type":13,"tag":143,"props":165,"children":167},{"id":166},"non-personal-information",[168],{"type":22,"value":169},"Non-Personal Information:",{"type":13,"tag":150,"props":171,"children":172},{},[173,178,183],{"type":13,"tag":154,"props":174,"children":175},{},[176],{"type":22,"value":177},"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":154,"props":179,"children":180},{},[181],{"type":22,"value":182},"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience.",{"type":13,"tag":154,"props":184,"children":185},{},[186],{"type":22,"value":187},"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information.",{"type":13,"tag":143,"props":189,"children":191},{"id":190},"google-analytics",[192],{"type":22,"value":193},"Google Analytics:",{"type":13,"tag":150,"props":195,"children":196},{},[197,202,207,212,217],{"type":13,"tag":154,"props":198,"children":199},{},[200],{"type":22,"value":201},"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website.",{"type":13,"tag":154,"props":203,"children":204},{},[205],{"type":22,"value":206},"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited.",{"type":13,"tag":154,"props":208,"children":209},{},[210],{"type":22,"value":211},"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage.",{"type":13,"tag":154,"props":213,"children":214},{},[215],{"type":22,"value":216},"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google.",{"type":13,"tag":154,"props":218,"children":219},{},[220],{"type":22,"value":221},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy.",{"type":13,"tag":14,"props":223,"children":224},{},[225],{"type":22,"value":226},"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent.",{"type":13,"tag":37,"props":228,"children":230},{"id":229},"_2-use-of-information",[231],{"type":22,"value":232},"2. USE OF INFORMATION:",{"type":13,"tag":14,"props":234,"children":235},{},[236],{"type":22,"value":237},"We use the information collected from users for the following purposes:",{"type":13,"tag":239,"props":240,"children":241},"ol",{},[242,247,252,257,262],{"type":13,"tag":154,"props":243,"children":244},{},[245],{"type":22,"value":246},"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues.",{"type":13,"tag":154,"props":248,"children":249},{},[250],{"type":22,"value":251},"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services.",{"type":13,"tag":154,"props":253,"children":254},{},[255],{"type":22,"value":256},"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website.",{"type":13,"tag":154,"props":258,"children":259},{},[260],{"type":22,"value":261},"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity.",{"type":13,"tag":154,"props":263,"children":264},{},[265],{"type":22,"value":266},"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences.",{"type":13,"tag":14,"props":268,"children":269},{},[270],{"type":22,"value":271},"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies.",{"type":13,"tag":37,"props":273,"children":275},{"id":274},"_3-sharing-of-information",[276],{"type":22,"value":277},"3. SHARING OF INFORMATION:",{"type":13,"tag":14,"props":279,"children":280},{},[281],{"type":22,"value":282},"We may share both personal and non-personal information collected from users in the following circumstances:",{"type":13,"tag":239,"props":284,"children":285},{},[286,291,296,301,306],{"type":13,"tag":154,"props":287,"children":288},{},[289],{"type":22,"value":290},"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose.",{"type":13,"tag":154,"props":292,"children":293},{},[294],{"type":22,"value":295},"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others.",{"type":13,"tag":154,"props":297,"children":298},{},[299],{"type":22,"value":300},"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy.",{"type":13,"tag":154,"props":302,"children":303},{},[304],{"type":22,"value":305},"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications.",{"type":13,"tag":154,"props":307,"children":308},{},[309],{"type":22,"value":310},"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone.",{"type":13,"tag":37,"props":312,"children":314},{"id":313},"_4-google-analytics",[315],{"type":22,"value":316},"4. GOOGLE ANALYTICS:",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":22,"value":321},"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States.",{"type":13,"tag":14,"props":323,"children":324},{},[325],{"type":22,"value":326},"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience.",{"type":13,"tag":14,"props":328,"children":329},{},[330,332,341],{"type":22,"value":331},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: ",{"type":13,"tag":333,"props":334,"children":338},"a",{"href":335,"rel":336},"https://tools.google.com/dlpage/gaoptout",[337],"nofollow",[339],{"type":22,"value":340},"Google Analytics Opt-out Browser Add-on",{"type":22,"value":342},".",{"type":13,"tag":14,"props":344,"children":345},{},[346,348,355],{"type":22,"value":347},"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: ",{"type":13,"tag":333,"props":349,"children":352},{"href":350,"rel":351},"https://policies.google.com/privacy?hl=en-US",[337],[353],{"type":22,"value":354},"Google Privacy Policy",{"type":22,"value":342},{"type":13,"tag":14,"props":357,"children":358},{},[359],{"type":22,"value":360},"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website.",{"type":13,"tag":37,"props":362,"children":364},{"id":363},"_5-data-security",[365],{"type":22,"value":366},"5. DATA SECURITY:",{"type":13,"tag":14,"props":368,"children":369},{},[370],{"type":22,"value":371},"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information.",{"type":13,"tag":14,"props":373,"children":374},{},[375],{"type":22,"value":376},"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices.",{"type":13,"tag":14,"props":378,"children":379},{},[380],{"type":22,"value":381},"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security.",{"type":13,"tag":14,"props":383,"children":384},{},[385],{"type":22,"value":386},"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary.",{"type":13,"tag":14,"props":388,"children":389},{},[390],{"type":22,"value":391},"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels.",{"type":13,"tag":37,"props":393,"children":395},{"id":394},"_6-user-controls",[396],{"type":22,"value":397},"6. USER CONTROLS:",{"type":13,"tag":14,"props":399,"children":400},{},[401],{"type":22,"value":402},"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:",{"type":13,"tag":239,"props":404,"children":405},{},[406,411,416,428,433],{"type":13,"tag":154,"props":407,"children":408},{},[409],{"type":22,"value":410},"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website.",{"type":13,"tag":154,"props":412,"children":413},{},[414],{"type":22,"value":415},"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior.",{"type":13,"tag":154,"props":417,"children":418},{},[419,421,426],{"type":22,"value":420},"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at ",{"type":13,"tag":333,"props":422,"children":424},{"href":335,"rel":423},[337],[425],{"type":22,"value":340},{"type":22,"value":427},". This browser add-on allows users to prevent their data from being collected and used by Google Analytics.",{"type":13,"tag":154,"props":429,"children":430},{},[431],{"type":22,"value":432},"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services.",{"type":13,"tag":154,"props":434,"children":435},{},[436],{"type":22,"value":437},"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration.",{"type":13,"tag":14,"props":439,"children":440},{},[441],{"type":22,"value":442},"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights.",{"type":13,"tag":37,"props":444,"children":446},{"id":445},"_7-changes-to-the-privacy-policy",[447],{"type":22,"value":448},"7. CHANGES TO THE PRIVACY POLICY:",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":22,"value":453},"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":22,"value":458},"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":22,"value":463},"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law.",{"type":13,"tag":37,"props":465,"children":467},{"id":466},"_8-contact-information",[468],{"type":22,"value":469},"8. CONTACT INFORMATION:",{"type":13,"tag":14,"props":471,"children":472},{},[473,475],{"type":22,"value":474},"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please ",{"type":13,"tag":333,"props":476,"children":478},{"href":477},"mailto:contact@QAComet.com",[479],{"type":22,"value":480},"Contact Us",{"title":5,"searchDepth":482,"depth":482,"links":483},2,[484,485,491,492,493,494,495,496,497],{"id":39,"depth":482,"text":42},{"id":133,"depth":482,"text":136,"children":486},[487,489,490],{"id":145,"depth":488,"text":148},3,{"id":166,"depth":488,"text":169},{"id":190,"depth":488,"text":193},{"id":229,"depth":482,"text":232},{"id":274,"depth":482,"text":277},{"id":313,"depth":482,"text":316},{"id":363,"depth":482,"text":366},{"id":394,"depth":482,"text":397},{"id":445,"depth":482,"text":448},{"id":466,"depth":482,"text":469},"markdown","content:privacy-policy.md","content","privacy-policy.md","md",1714258649625] \ No newline at end of file +[{"data":1,"prerenderedAt":503},["Reactive",2],{"content-query-LjPlv9Sq1J":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":498,"_id":499,"_source":500,"_file":501,"_extension":502},"/privacy-policy","",false,"Privacy Policy","Effective Date: This Privacy Policy is effective as of February 16, 2024.",{"type":10,"children":11,"toc":481},"root",[12,31,36,43,48,60,71,82,93,104,115,126,131,137,142,149,164,170,188,194,222,227,233,238,267,272,278,283,311,317,322,327,343,356,361,367,372,377,382,387,392,398,403,438,443,449,454,459,464,470],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17,24,26],{"type":13,"tag":18,"props":19,"children":20},"strong",{},[21],{"type":22,"value":23},"text","Effective Date",{"type":22,"value":25},": ",{"type":13,"tag":18,"props":27,"children":28},{},[29],{"type":22,"value":30},"This Privacy Policy is effective as of February 16, 2024.",{"type":13,"tag":14,"props":32,"children":33},{},[34],{"type":22,"value":35},"Welcome to the Privacy Policy of QAComet (\"we,\" \"us,\" or \"our\"). This Privacy Policy outlines how we collect, use, share, and protect information obtained from visitors (\"users\" or \"you\") of the QAComet website. We are committed to safeguarding your privacy and ensuring the security of your personal information. By accessing or using the QAComet website, you acknowledge that you have read, understood, and agree to the practices described in this Privacy Policy. If you do not agree with this Privacy Policy, please refrain from using our website. This Privacy Policy applies solely to information collected by QAComet and does not apply to information collected by any third-party websites or services that may be linked to or from our website. We encourage you to review the privacy policies of those third-party websites or services before providing any personal information.",{"type":13,"tag":37,"props":38,"children":40},"h2",{"id":39},"definitions",[41],{"type":22,"value":42},"DEFINITIONS:",{"type":13,"tag":14,"props":44,"children":45},{},[46],{"type":22,"value":47},"In this Privacy Policy, unless the context otherwise requires:",{"type":13,"tag":14,"props":49,"children":50},{},[51,53,58],{"type":22,"value":52},"\"",{"type":13,"tag":18,"props":54,"children":55},{},[56],{"type":22,"value":57},"QAComet",{"type":22,"value":59},"\" refers to the website operated by QAComet LLC accessible at QAComet.com",{"type":13,"tag":14,"props":61,"children":62},{},[63,64,69],{"type":22,"value":52},{"type":13,"tag":18,"props":65,"children":66},{},[67],{"type":22,"value":68},"Personal Information",{"type":22,"value":70},"\" refers to any information that can be used to identify or contact an individual, such as name, email address, postal address, phone number, or any other information voluntarily provided by the user.",{"type":13,"tag":14,"props":72,"children":73},{},[74,75,80],{"type":22,"value":52},{"type":13,"tag":18,"props":76,"children":77},{},[78],{"type":22,"value":79},"Non-Personal Information",{"type":22,"value":81},"\" refers to data that does not directly identify an individual, including browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":14,"props":83,"children":84},{},[85,86,91],{"type":22,"value":52},{"type":13,"tag":18,"props":87,"children":88},{},[89],{"type":22,"value":90},"Cookies",{"type":22,"value":92},"\" are small text files stored on a user's device when visiting a website, used to track and analyze website usage and personalize content.",{"type":13,"tag":14,"props":94,"children":95},{},[96,97,102],{"type":22,"value":52},{"type":13,"tag":18,"props":98,"children":99},{},[100],{"type":22,"value":101},"Google Analytics",{"type":22,"value":103},"\" is a web analytics service provided by Google LLC (\"Google\"), used to collect and analyze data about website usage, including IP addresses, browser types, operating systems, and pages visited.",{"type":13,"tag":14,"props":105,"children":106},{},[107,108,113],{"type":22,"value":52},{"type":13,"tag":18,"props":109,"children":110},{},[111],{"type":22,"value":112},"User",{"type":22,"value":114},"\" refers to any individual who accesses or uses the QAComet website.",{"type":13,"tag":14,"props":116,"children":117},{},[118,119,124],{"type":22,"value":52},{"type":13,"tag":18,"props":120,"children":121},{},[122],{"type":22,"value":123},"Owner",{"type":22,"value":125},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the QAComet website.",{"type":13,"tag":14,"props":127,"children":128},{},[129],{"type":22,"value":130},"By accessing or using the QAComet website, you acknowledge and agree to the terms outlined in this Privacy Policy and the definitions provided herein.",{"type":13,"tag":37,"props":132,"children":134},{"id":133},"_1-information-collection",[135],{"type":22,"value":136},"1. INFORMATION COLLECTION:",{"type":13,"tag":14,"props":138,"children":139},{},[140],{"type":22,"value":141},"We collect two types of information from users: personal information and non-personal information.",{"type":13,"tag":143,"props":144,"children":146},"h3",{"id":145},"personal-information",[147],{"type":22,"value":148},"Personal Information:",{"type":13,"tag":150,"props":151,"children":152},"ul",{},[153,159],{"type":13,"tag":154,"props":155,"children":156},"li",{},[157],{"type":22,"value":158},"Personal information is data that can be used to identify or contact an individual. This may include, but is not limited to, your name, email address, postal address, phone number, or any other information you voluntarily provide to us through forms on the QAComet website.",{"type":13,"tag":154,"props":160,"children":161},{},[162],{"type":22,"value":163},"We collect personal information only if you voluntarily submit it to us, such as when you sign up for our newsletter, register for an account, or contact us through the website.",{"type":13,"tag":143,"props":165,"children":167},{"id":166},"non-personal-information",[168],{"type":22,"value":169},"Non-Personal Information:",{"type":13,"tag":150,"props":171,"children":172},{},[173,178,183],{"type":13,"tag":154,"props":174,"children":175},{},[176],{"type":22,"value":177},"Non-personal information is data that does not directly identify you as an individual. This may include, but is not limited to, your browser type, IP address, device type, operating system, and browsing behavior.",{"type":13,"tag":154,"props":179,"children":180},{},[181],{"type":22,"value":182},"We also use cookies and similar tracking technologies to collect non-personal information about your interactions with the QAComet website. Cookies are small text files that are stored on your device when you visit a website, and they help us analyze website traffic, customize content, and improve your user experience.",{"type":13,"tag":154,"props":184,"children":185},{},[186],{"type":22,"value":187},"We may also use third-party services, such as Google Analytics, to collect and analyze non-personal information about website usage. These services may use cookies and other tracking technologies to gather data about your activities on the QAComet website. Please refer to the \"Google Analytics\" section of this Privacy Policy for more information.",{"type":13,"tag":143,"props":189,"children":191},{"id":190},"google-analytics",[192],{"type":22,"value":193},"Google Analytics:",{"type":13,"tag":150,"props":195,"children":196},{},[197,202,207,212,217],{"type":13,"tag":154,"props":198,"children":199},{},[200],{"type":22,"value":201},"We use Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze information about how users interact with the QAComet website.",{"type":13,"tag":154,"props":203,"children":204},{},[205],{"type":22,"value":206},"Google Analytics uses cookies to collect data about your interactions with the website, including your IP address, browser type, operating system, referral sources, and pages visited.",{"type":13,"tag":154,"props":208,"children":209},{},[210],{"type":22,"value":211},"This information is transmitted to and stored by Google on servers in the United States. Google uses this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage.",{"type":13,"tag":154,"props":213,"children":214},{},[215],{"type":22,"value":216},"Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google's behalf. Google will not associate your IP address with any other data held by Google.",{"type":13,"tag":154,"props":218,"children":219},{},[220],{"type":22,"value":221},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes set out above. For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please see Google's Privacy Policy.",{"type":13,"tag":14,"props":223,"children":224},{},[225],{"type":22,"value":226},"We use the information collected from users to provide, maintain, and improve the QAComet website, as well as to communicate with users, personalize content, and analyze website traffic and usage patterns. We do not sell, trade, or rent personal information to third parties without your consent.",{"type":13,"tag":37,"props":228,"children":230},{"id":229},"_2-use-of-information",[231],{"type":22,"value":232},"2. USE OF INFORMATION:",{"type":13,"tag":14,"props":234,"children":235},{},[236],{"type":22,"value":237},"We use the information collected from users for the following purposes:",{"type":13,"tag":239,"props":240,"children":241},"ol",{},[242,247,252,257,262],{"type":13,"tag":154,"props":243,"children":244},{},[245],{"type":22,"value":246},"To Provide and Improve Services: We may use both personal and non-personal information to provide, maintain, and improve the QAComet website, including monitoring and analyzing website usage, identifying trends, and troubleshooting technical issues.",{"type":13,"tag":154,"props":248,"children":249},{},[250],{"type":22,"value":251},"To Communicate with Users: We may use personal information to communicate with users, respond to inquiries, provide customer support, and send administrative or transactional messages related to user accounts or services.",{"type":13,"tag":154,"props":253,"children":254},{},[255],{"type":22,"value":256},"To Personalize Content: We may use non-personal information, such as browsing behavior and preferences, to personalize content and recommendations on the QAComet website.",{"type":13,"tag":154,"props":258,"children":259},{},[260],{"type":22,"value":261},"To Analyze Website Traffic: We may use cookies and similar technologies, including Google Analytics, to analyze website traffic and usage patterns, track user interactions with the website, and compile statistical reports on website activity.",{"type":13,"tag":154,"props":263,"children":264},{},[265],{"type":22,"value":266},"For Marketing and Advertising: With user consent, we may use personal information to send promotional materials, newsletters, or other marketing communications. We may also use cookies and similar technologies to deliver targeted advertisements based on user interests and preferences.",{"type":13,"tag":14,"props":268,"children":269},{},[270],{"type":22,"value":271},"For Legal Compliance: We may use and disclose information as necessary to comply with legal obligations, enforce our policies, protect our rights or property, or respond to lawful requests from government authorities or law enforcement agencies.",{"type":13,"tag":37,"props":273,"children":275},{"id":274},"_3-sharing-of-information",[276],{"type":22,"value":277},"3. SHARING OF INFORMATION:",{"type":13,"tag":14,"props":279,"children":280},{},[281],{"type":22,"value":282},"We may share both personal and non-personal information collected from users in the following circumstances:",{"type":13,"tag":239,"props":284,"children":285},{},[286,291,296,301,306],{"type":13,"tag":154,"props":287,"children":288},{},[289],{"type":22,"value":290},"Third-Party Service Providers: We may engage trusted third-party service providers to assist us in operating the QAComet website or providing services on our behalf. These service providers may have access to user information as necessary to perform their functions, but they are prohibited from using it for any other purpose.",{"type":13,"tag":154,"props":292,"children":293},{},[294],{"type":22,"value":295},"Legal Compliance: We may disclose user information if required to do so by law or in response to valid legal requests, such as subpoenas, court orders, or other legal processes. We may also share information to protect our rights, property, or safety, or the rights, property, or safety of others.",{"type":13,"tag":154,"props":297,"children":298},{},[299],{"type":22,"value":300},"Business Transfers: In the event of a merger, acquisition, reorganization, or sale of assets, user information may be transferred or disclosed as part of the transaction. Any such transfer will be subject to appropriate confidentiality and security measures to protect user privacy.",{"type":13,"tag":154,"props":302,"children":303},{},[304],{"type":22,"value":305},"Consent: We may share user information with third parties if we have obtained user consent to do so. For example, we may share information with third-party partners for marketing purposes if users have opted in to such communications.",{"type":13,"tag":154,"props":307,"children":308},{},[309],{"type":22,"value":310},"Aggregated or Anonymized Data: We may share aggregated or anonymized data derived from user information for analytical purposes or to improve our services. This data does not identify individual users and cannot be used to personally identify anyone.",{"type":13,"tag":37,"props":312,"children":314},{"id":313},"_4-google-analytics",[315],{"type":22,"value":316},"4. GOOGLE ANALYTICS:",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":22,"value":321},"We utilize Google Analytics, a web analytics service provided by Google LLC (\"Google\"), to collect and analyze data about user interactions with the QAComet website. Google Analytics uses cookies to gather information such as users' IP addresses, browser types, operating systems, referral sources, and pages visited. This information is transmitted to and stored by Google on servers in the United States.",{"type":13,"tag":14,"props":323,"children":324},{},[325],{"type":22,"value":326},"Google Analytics helps us understand how users engage with the website, allowing us to improve our services, optimize website performance, and enhance user experience.",{"type":13,"tag":14,"props":328,"children":329},{},[330,332,341],{"type":22,"value":331},"By using the QAComet website, you consent to the processing of data about you by Google in the manner and for the purposes outlined above. You can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at the following URL: ",{"type":13,"tag":333,"props":334,"children":338},"a",{"href":335,"rel":336},"https://tools.google.com/dlpage/gaoptout",[337],"nofollow",[339],{"type":22,"value":340},"Google Analytics Opt-out Browser Add-on",{"type":22,"value":342},".",{"type":13,"tag":14,"props":344,"children":345},{},[346,348,355],{"type":22,"value":347},"For more information about Google's privacy practices and how Google uses data collected through Google Analytics, please refer to Google's Privacy Policy: ",{"type":13,"tag":333,"props":349,"children":352},{"href":350,"rel":351},"https://policies.google.com/privacy?hl=en-US",[337],[353],{"type":22,"value":354},"Google Privacy Policy",{"type":22,"value":342},{"type":13,"tag":14,"props":357,"children":358},{},[359],{"type":22,"value":360},"Please note that opting out of Google Analytics tracking will not prevent your data from being collected by other analytics services or cookies used on the QAComet website.",{"type":13,"tag":37,"props":362,"children":364},{"id":363},"_5-data-security",[365],{"type":22,"value":366},"5. DATA SECURITY:",{"type":13,"tag":14,"props":368,"children":369},{},[370],{"type":22,"value":371},"We are committed to protecting the security of user information and have implemented reasonable measures to safeguard personal and non-personal data collected through the QAComet website. We employ physical, technical, and administrative safeguards to prevent unauthorized access, disclosure, alteration, or destruction of user information.",{"type":13,"tag":14,"props":373,"children":374},{},[375],{"type":22,"value":376},"Access to user information is restricted to authorized personnel who have a legitimate need to access such information for the purposes outlined in this Privacy Policy. All employees, contractors, and third-party service providers with access to user information are required to adhere to strict confidentiality obligations and undergo training on data security and privacy practices.",{"type":13,"tag":14,"props":378,"children":379},{},[380],{"type":22,"value":381},"Despite our best efforts, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee the absolute security of user information. Therefore, while we strive to protect user information, we cannot guarantee its security.",{"type":13,"tag":14,"props":383,"children":384},{},[385],{"type":22,"value":386},"In the event of a data breach or unauthorized access to user information, we will take appropriate steps to mitigate the impact of the incident, notify affected users as required by law, and cooperate with regulatory authorities as necessary.",{"type":13,"tag":14,"props":388,"children":389},{},[390],{"type":22,"value":391},"We recommend that users take precautions to protect their personal information, such as choosing strong passwords, keeping login credentials confidential, and avoiding sharing sensitive information through insecure channels.",{"type":13,"tag":37,"props":393,"children":395},{"id":394},"_6-user-controls",[396],{"type":22,"value":397},"6. USER CONTROLS:",{"type":13,"tag":14,"props":399,"children":400},{},[401],{"type":22,"value":402},"Users have certain controls and choices regarding the collection and use of their information on the QAComet website:",{"type":13,"tag":239,"props":404,"children":405},{},[406,411,416,428,433],{"type":13,"tag":154,"props":407,"children":408},{},[409],{"type":22,"value":410},"Cookie Preferences: Users can manage their cookie preferences and settings through their web browser. Most web browsers allow users to control cookies through settings or preferences, including accepting or rejecting cookies, deleting cookies, and disabling tracking technologies. However, please note that disabling cookies may affect the functionality of certain features on the QAComet website.",{"type":13,"tag":154,"props":412,"children":413},{},[414],{"type":22,"value":415},"Opt-Out of Personalized Advertising: Users can opt out of personalized advertising served by third-party ad networks and ad platforms by adjusting their ad preferences or settings. Many ad networks and platforms offer opt-out mechanisms or tools for users to opt out of targeted advertising based on their interests and browsing behavior.",{"type":13,"tag":154,"props":417,"children":418},{},[419,421,426],{"type":22,"value":420},"Google Analytics Opt-Out: Users can opt out of Google Analytics tracking by installing the Google Analytics Opt-out Browser Add-on, available at ",{"type":13,"tag":333,"props":422,"children":424},{"href":335,"rel":423},[337],[425],{"type":22,"value":340},{"type":22,"value":427},". This browser add-on allows users to prevent their data from being collected and used by Google Analytics.",{"type":13,"tag":154,"props":429,"children":430},{},[431],{"type":22,"value":432},"Communication Preferences: Users can manage their communication preferences and opt out of receiving promotional emails, newsletters, or other marketing communications from QAComet by following the unsubscribe instructions provided in such communications. Please note that even if you opt out of receiving marketing communications, we may still send you transactional or administrative messages related to your account or services.",{"type":13,"tag":154,"props":434,"children":435},{},[436],{"type":22,"value":437},"Account Settings: Registered users may have access to account settings or preferences where they can update, edit, or delete their account information, including personal information provided during registration.",{"type":13,"tag":14,"props":439,"children":440},{},[441],{"type":22,"value":442},"By exercising these user controls and preferences, users can better manage their privacy and make informed choices about how their information is collected, used, and shared on the QAComet website. We respect and honor user preferences regarding the handling of their information and strive to provide transparent and accessible mechanisms for users to exercise their rights.",{"type":13,"tag":37,"props":444,"children":446},{"id":445},"_7-changes-to-the-privacy-policy",[447],{"type":22,"value":448},"7. CHANGES TO THE PRIVACY POLICY:",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":22,"value":453},"QAComet reserves the right to update or modify this Privacy Policy at any time without prior notice. Any changes to the Privacy Policy will be posted on this page with an updated \"Last Updated\" date at the top of the page. We encourage users to review this Privacy Policy periodically to stay informed about how we collect, use, and protect their information.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":22,"value":458},"By continuing to access or use the QAComet website after any changes to this Privacy Policy become effective, you acknowledge and agree to the updated terms. If you do not agree with the changes to the Privacy Policy, you must discontinue your use of the QAComet website.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":22,"value":463},"If we make material changes to this Privacy Policy that affect how we collect, use, or share user information, we may provide notice through the QAComet website, by email, or through other means prior to the changes taking effect. We may also obtain user consent for any material changes where required by applicable law.",{"type":13,"tag":37,"props":465,"children":467},{"id":466},"_8-contact-information",[468],{"type":22,"value":469},"8. CONTACT INFORMATION:",{"type":13,"tag":14,"props":471,"children":472},{},[473,475],{"type":22,"value":474},"If you have any questions, concerns, or inquiries about this Privacy Policy or the practices of QAComet regarding the collection, use, or disclosure of your information, please ",{"type":13,"tag":333,"props":476,"children":478},{"href":477},"mailto:contact@QAComet.com",[479],{"type":22,"value":480},"Contact Us",{"title":5,"searchDepth":482,"depth":482,"links":483},2,[484,485,491,492,493,494,495,496,497],{"id":39,"depth":482,"text":42},{"id":133,"depth":482,"text":136,"children":486},[487,489,490],{"id":145,"depth":488,"text":148},3,{"id":166,"depth":488,"text":169},{"id":190,"depth":488,"text":193},{"id":229,"depth":482,"text":232},{"id":274,"depth":482,"text":277},{"id":313,"depth":482,"text":316},{"id":363,"depth":482,"text":366},{"id":394,"depth":482,"text":397},{"id":445,"depth":482,"text":448},{"id":466,"depth":482,"text":469},"markdown","content:privacy-policy.md","content","privacy-policy.md","md",1717143082736] \ No newline at end of file diff --git a/privacy-policy/index.html b/privacy-policy/index.html index 1bcd742..57a9e8b 100644 --- a/privacy-policy/index.html +++ b/privacy-policy/index.html @@ -9,9 +9,9 @@ - - - + + + @@ -21,38 +21,38 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index ce06a35..8bc98a2 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://qacomet.com/case-studies/automatisch/monthlyhttps://qacomet.com/playwright/architecture/monthlyhttps://qacomet.com/playwright/how-playwright-initializes/monthlyhttps://qacomet.com/privacy-policy/monthlyhttps://qacomet.com/terms-and-conditions/monthlyhttps://qacomet.com/terms-of-service/monthly \ No newline at end of file +https://qacomet.com/case-studies/automatisch/monthlyhttps://qacomet.com/medusa_gpt_edit/monthlyhttps://qacomet.com/medusa/monthlyhttps://qacomet.com/playwright/architecture/monthlyhttps://qacomet.com/playwright/how-playwright-initializes/monthlyhttps://qacomet.com/privacy-policy/monthlyhttps://qacomet.com/terms-and-conditions/monthlyhttps://qacomet.com/terms-of-service/monthlyhttps://qacomet.com/white-papers/how-qa-factors-into-vc-due-diligence/monthly \ No newline at end of file diff --git a/terms-and-conditions/_payload.json b/terms-and-conditions/_payload.json index 1eac89d..5ec9aee 100644 --- a/terms-and-conditions/_payload.json +++ b/terms-and-conditions/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":421},["Reactive",2],{"content-query-tsMkigp1TY":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":416,"_id":417,"_source":418,"_file":419,"_extension":420},"/terms-and-conditions","",false,"Terms And Conditions","Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").",{"type":10,"children":11,"toc":403},"root",[12,19,31,38,43,64,76,81,92,103,114,125,136,142,147,152,157,162,168,173,178,183,188,194,199,204,209,214,219,224,230,244,250,255,260,265,270,275,281,286,291,296,302,307,312,317,322,328,333,338,343,348,353,359,364,369,374,379,384,389,394],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22,24],{"type":18,"value":23},"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please ",{"type":13,"tag":25,"props":26,"children":28},"a",{"href":27},"mailto:contact@QAComet.com",[29],{"type":18,"value":30},"Contact Us",{"type":13,"tag":32,"props":33,"children":35},"h2",{"id":34},"definitions",[36],{"type":18,"value":37},"DEFINITIONS",{"type":13,"tag":14,"props":39,"children":40},{},[41],{"type":18,"value":42},"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:",{"type":13,"tag":14,"props":44,"children":45},{},[46,52,54,62],{"type":13,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":18,"value":51},"Website",{"type":18,"value":53},"\" refers to the QAComet website, accessible at ",{"type":13,"tag":25,"props":55,"children":59},{"href":56,"rel":57},"https://qacomet.com/",[58],"nofollow",[60],{"type":18,"value":61},"QAComet.com",{"type":18,"value":63},", including all associated web pages.",{"type":13,"tag":14,"props":65,"children":66},{},[67,69,74],{"type":18,"value":68},"\"",{"type":13,"tag":47,"props":70,"children":71},{},[72],{"type":18,"value":73},"Owner",{"type":18,"value":75},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website.",{"type":13,"tag":14,"props":77,"children":78},{},[79],{"type":18,"value":80},"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website.",{"type":13,"tag":14,"props":82,"children":83},{},[84,85,90],{"type":18,"value":68},{"type":13,"tag":47,"props":86,"children":87},{},[88],{"type":18,"value":89},"Services",{"type":18,"value":91},"\" refers to any products, features, or functionalities offered on the Website.",{"type":13,"tag":14,"props":93,"children":94},{},[95,96,101],{"type":18,"value":68},{"type":13,"tag":47,"props":97,"children":98},{},[99],{"type":18,"value":100},"Content",{"type":18,"value":102},"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website.",{"type":13,"tag":14,"props":104,"children":105},{},[106,107,112],{"type":18,"value":68},{"type":13,"tag":47,"props":108,"children":109},{},[110],{"type":18,"value":111},"Affiliates",{"type":18,"value":113},"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner.",{"type":13,"tag":14,"props":115,"children":116},{},[117,118,123],{"type":18,"value":68},{"type":13,"tag":47,"props":119,"children":120},{},[121],{"type":18,"value":122},"Terms",{"type":18,"value":124},"\" refers to these General Terms and Conditions governing the use of the Website.",{"type":13,"tag":14,"props":126,"children":127},{},[128,129,134],{"type":18,"value":68},{"type":13,"tag":47,"props":130,"children":131},{},[132],{"type":18,"value":133},"Modification",{"type":18,"value":135},"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion.",{"type":13,"tag":32,"props":137,"children":139},{"id":138},"_1-acceptance-of-terms",[140],{"type":18,"value":141},"1. ACCEPTANCE OF TERMS:",{"type":13,"tag":14,"props":143,"children":144},{},[145],{"type":18,"value":146},"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website.",{"type":13,"tag":14,"props":148,"children":149},{},[150],{"type":18,"value":151},"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet.",{"type":13,"tag":14,"props":153,"children":154},{},[155],{"type":18,"value":156},"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes.",{"type":13,"tag":14,"props":158,"children":159},{},[160],{"type":18,"value":161},"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website.",{"type":13,"tag":32,"props":163,"children":165},{"id":164},"_2-use-of-website",[166],{"type":18,"value":167},"2. USE OF WEBSITE",{"type":13,"tag":14,"props":169,"children":170},{},[171],{"type":18,"value":172},"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable.",{"type":13,"tag":14,"props":174,"children":175},{},[176],{"type":18,"value":177},"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection.",{"type":13,"tag":14,"props":179,"children":180},{},[181],{"type":18,"value":182},"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable.",{"type":13,"tag":14,"props":184,"children":185},{},[186],{"type":18,"value":187},"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities",{"type":13,"tag":32,"props":189,"children":191},{"id":190},"_3-intellectual-property",[192],{"type":18,"value":193},"3. INTELLECTUAL PROPERTY:",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties.",{"type":13,"tag":32,"props":225,"children":227},{"id":226},"_4-privacy-policy",[228],{"type":18,"value":229},"4. PRIVACY POLICY",{"type":13,"tag":14,"props":231,"children":232},{},[233,235,242],{"type":18,"value":234},"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our ",{"type":13,"tag":25,"props":236,"children":239},{"href":237,"rel":238},"https://qacomet.com/privacy-policy",[58],[240],{"type":18,"value":241},"Privacy Policy",{"type":18,"value":243},".",{"type":13,"tag":32,"props":245,"children":247},{"id":246},"_5-disclaimer-of-warranties",[248],{"type":18,"value":249},"5. DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":251,"children":252},{},[253],{"type":18,"value":254},"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content.",{"type":13,"tag":14,"props":256,"children":257},{},[258],{"type":18,"value":259},"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.",{"type":13,"tag":14,"props":261,"children":262},{},[263],{"type":18,"value":264},"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use.",{"type":13,"tag":14,"props":266,"children":267},{},[268],{"type":18,"value":269},"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise.",{"type":13,"tag":14,"props":271,"children":272},{},[273],{"type":18,"value":274},"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":276,"children":278},{"id":277},"_6-limitation-of-liability",[279],{"type":18,"value":280},"6. LIMITATION OF LIABILITY:",{"type":13,"tag":14,"props":282,"children":283},{},[284],{"type":18,"value":285},"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages.",{"type":13,"tag":14,"props":287,"children":288},{},[289],{"type":18,"value":290},"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability.",{"type":13,"tag":14,"props":292,"children":293},{},[294],{"type":18,"value":295},"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":297,"children":299},{"id":298},"_7-modification-and-termination",[300],{"type":18,"value":301},"7. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":303,"children":304},{},[305],{"type":18,"value":306},"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms.",{"type":13,"tag":14,"props":308,"children":309},{},[310],{"type":18,"value":311},"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website.",{"type":13,"tag":14,"props":313,"children":314},{},[315],{"type":18,"value":316},"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination.",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":18,"value":321},"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it.",{"type":13,"tag":32,"props":323,"children":325},{"id":324},"_8-governing-law-and-dispute-resolution",[326],{"type":18,"value":327},"8. GOVERNING LAW AND DISPUTE RESOLUTION:",{"type":13,"tag":14,"props":329,"children":330},{},[331],{"type":18,"value":332},"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles.",{"type":13,"tag":14,"props":334,"children":335},{},[336],{"type":18,"value":337},"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction.",{"type":13,"tag":14,"props":339,"children":340},{},[341],{"type":18,"value":342},"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party.",{"type":13,"tag":14,"props":344,"children":345},{},[346],{"type":18,"value":347},"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security.",{"type":13,"tag":14,"props":349,"children":350},{},[351],{"type":18,"value":352},"The language of arbitration and all related proceedings shall be English.",{"type":13,"tag":32,"props":354,"children":356},{"id":355},"_9-miscellaneous",[357],{"type":18,"value":358},"9. MISCELLANEOUS:",{"type":13,"tag":14,"props":360,"children":361},{},[362],{"type":18,"value":363},"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law.",{"type":13,"tag":14,"props":365,"children":366},{},[367],{"type":18,"value":368},"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter.",{"type":13,"tag":14,"props":370,"children":371},{},[372],{"type":18,"value":373},"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction.",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms.",{"type":13,"tag":14,"props":395,"children":396},{},[397,399],{"type":18,"value":398},"Contact Information: If you have any questions about these Terms or the QAComet website, please ",{"type":13,"tag":25,"props":400,"children":401},{"href":27},[402],{"type":18,"value":30},{"title":5,"searchDepth":404,"depth":404,"links":405},2,[406,407,408,409,410,411,412,413,414,415],{"id":34,"depth":404,"text":37},{"id":138,"depth":404,"text":141},{"id":164,"depth":404,"text":167},{"id":190,"depth":404,"text":193},{"id":226,"depth":404,"text":229},{"id":246,"depth":404,"text":249},{"id":277,"depth":404,"text":280},{"id":298,"depth":404,"text":301},{"id":324,"depth":404,"text":327},{"id":355,"depth":404,"text":358},"markdown","content:terms-and-conditions.md","content","terms-and-conditions.md","md",1714258642243] \ No newline at end of file +[{"data":1,"prerenderedAt":421},["Reactive",2],{"content-query-tsMkigp1TY":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":416,"_id":417,"_source":418,"_file":419,"_extension":420},"/terms-and-conditions","",false,"Terms And Conditions","Welcome to the QAComet website (\"Website\"). This Website is owned and operated by QAComet LLC and its affiliates (\"we,\" \"us,\" or \"our\"). By accessing or using this Website, you agree to be bound by these General Terms and Conditions (\"Terms\").",{"type":10,"children":11,"toc":403},"root",[12,19,31,38,43,64,76,81,92,103,114,125,136,142,147,152,157,162,168,173,178,183,188,194,199,204,209,214,219,224,230,244,250,255,260,265,270,275,281,286,291,296,302,307,312,317,322,328,333,338,343,348,353,359,364,369,374,379,384,389,394],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22,24],{"type":18,"value":23},"Please read these Terms carefully before accessing or using the Website. These Terms govern your use of the Website and constitute a legally binding agreement between you and QAComet. If you do not agree to these Terms, please refrain from accessing or using the Website. We reserve the right to modify these Terms at any time, and your continued use of the Website signifies your acceptance of any such changes. Please review these Terms regularly for updates. If you have any questions about these Terms or the Website, please ",{"type":13,"tag":25,"props":26,"children":28},"a",{"href":27},"mailto:contact@QAComet.com",[29],{"type":18,"value":30},"Contact Us",{"type":13,"tag":32,"props":33,"children":35},"h2",{"id":34},"definitions",[36],{"type":18,"value":37},"DEFINITIONS",{"type":13,"tag":14,"props":39,"children":40},{},[41],{"type":18,"value":42},"In these General Terms and Conditions (\"Terms\"), unless the context otherwise requires:",{"type":13,"tag":14,"props":44,"children":45},{},[46,52,54,62],{"type":13,"tag":47,"props":48,"children":49},"strong",{},[50],{"type":18,"value":51},"Website",{"type":18,"value":53},"\" refers to the QAComet website, accessible at ",{"type":13,"tag":25,"props":55,"children":59},{"href":56,"rel":57},"https://qacomet.com/",[58],"nofollow",[60],{"type":18,"value":61},"QAComet.com",{"type":18,"value":63},", including all associated web pages.",{"type":13,"tag":14,"props":65,"children":66},{},[67,69,74],{"type":18,"value":68},"\"",{"type":13,"tag":47,"props":70,"children":71},{},[72],{"type":18,"value":73},"Owner",{"type":18,"value":75},"\" refers to QAComet LLC, the entity or individual responsible for the operation and management of the Website.",{"type":13,"tag":14,"props":77,"children":78},{},[79],{"type":18,"value":80},"\"User,\" \"you,\" or \"your\" refers to any person or entity accessing or using the Website.",{"type":13,"tag":14,"props":82,"children":83},{},[84,85,90],{"type":18,"value":68},{"type":13,"tag":47,"props":86,"children":87},{},[88],{"type":18,"value":89},"Services",{"type":18,"value":91},"\" refers to any products, features, or functionalities offered on the Website.",{"type":13,"tag":14,"props":93,"children":94},{},[95,96,101],{"type":18,"value":68},{"type":13,"tag":47,"props":97,"children":98},{},[99],{"type":18,"value":100},"Content",{"type":18,"value":102},"\" encompasses all text, graphics, images, videos, audio, and any other material available on the Website.",{"type":13,"tag":14,"props":104,"children":105},{},[106,107,112],{"type":18,"value":68},{"type":13,"tag":47,"props":108,"children":109},{},[110],{"type":18,"value":111},"Affiliates",{"type":18,"value":113},"\" includes any subsidiaries, parent companies, or other entities under common control with the Owner.",{"type":13,"tag":14,"props":115,"children":116},{},[117,118,123],{"type":18,"value":68},{"type":13,"tag":47,"props":119,"children":120},{},[121],{"type":18,"value":122},"Terms",{"type":18,"value":124},"\" refers to these General Terms and Conditions governing the use of the Website.",{"type":13,"tag":14,"props":126,"children":127},{},[128,129,134],{"type":18,"value":68},{"type":13,"tag":47,"props":130,"children":131},{},[132],{"type":18,"value":133},"Modification",{"type":18,"value":135},"\" denotes any change, addition, or deletion to the Terms made by the Owner at their discretion.",{"type":13,"tag":32,"props":137,"children":139},{"id":138},"_1-acceptance-of-terms",[140],{"type":18,"value":141},"1. ACCEPTANCE OF TERMS:",{"type":13,"tag":14,"props":143,"children":144},{},[145],{"type":18,"value":146},"By accessing or using the QAComet website (\"Website\"), you acknowledge that you have read, understood, and agree to be bound by these General Terms and Conditions (\"Terms\"). If you do not agree to these Terms in their entirety, you are not authorized to access or use the Website.",{"type":13,"tag":14,"props":148,"children":149},{},[150],{"type":18,"value":151},"Your access to and use of the Website constitutes your acceptance of these Terms and your agreement to comply with all applicable laws and regulations. You agree to use the Website only for lawful purposes and in a manner consistent with these Terms and any other policies or guidelines provided by QAComet.",{"type":13,"tag":14,"props":153,"children":154},{},[155],{"type":18,"value":156},"You further acknowledge and agree that your continued use of the Website after any modifications to these Terms constitutes your acceptance of such modifications. It is your responsibility to review these Terms regularly to stay informed of any updates or changes.",{"type":13,"tag":14,"props":158,"children":159},{},[160],{"type":18,"value":161},"If you do not agree to any provision of these Terms or any subsequent modifications, your sole recourse is to discontinue the use of the Website.",{"type":13,"tag":32,"props":163,"children":165},{"id":164},"_2-use-of-website",[166],{"type":18,"value":167},"2. USE OF WEBSITE",{"type":13,"tag":14,"props":169,"children":170},{},[171],{"type":18,"value":172},"The use of the QAComet website is subject to certain terms and conditions. By accessing or using the website, you agree to comply with these terms. You are granted permission to access and use the website for lawful purposes and in accordance with these terms. You are prohibited from using the website in any way that violates applicable laws and regulations, infringes upon the rights of others, or is harmful, threatening, defamatory, obscene, or otherwise objectionable.",{"type":13,"tag":14,"props":174,"children":175},{},[176],{"type":18,"value":177},"When using the website, you agree to refrain from engaging in any activities that could disrupt or interfere with the proper functioning of the website or its services. This includes but is not limited to attempting to gain unauthorized access to the website, introducing viruses or other harmful code, or engaging in any form of automated data collection.",{"type":13,"tag":14,"props":179,"children":180},{},[181],{"type":18,"value":182},"You are solely responsible for any content you post or submit on the website. By posting or submitting content, you warrant that you have the right to do so and that the content is accurate, not confidential, and does not infringe upon the rights of any third party. QAComet reserves the right to remove or edit any content that violates these terms or is otherwise objectionable.",{"type":13,"tag":14,"props":184,"children":185},{},[186],{"type":18,"value":187},"You agree to use the website only for its intended purposes and in a manner consistent with these terms and any additional guidelines or policies provided by QAComet. QAComet may, at its sole discretion, suspend or terminate your access to the website if you violate these terms or engage in any prohibited activities",{"type":13,"tag":32,"props":189,"children":191},{"id":190},"_3-intellectual-property",[192],{"type":18,"value":193},"3. INTELLECTUAL PROPERTY:",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"The content, features, and functionality of the QAComet website, including but not limited to text, graphics, logos, images, audio clips, video clips, software, and the arrangement thereof, are owned by QAComet, its licensors, or other providers of such material and are protected by copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"You acknowledge and agree that the website and its contents are provided for your personal, non-commercial use only. Except as expressly authorized by QAComet, you may not modify, reproduce, distribute, create derivative works of, publicly display, publicly perform, republish, download, store, or transmit any of the material on the website.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"You may print or download one copy of a reasonable number of pages of the website for your own personal, non-commercial use and not for further reproduction, publication, or distribution.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"If you wish to use any content from the QAComet website for commercial purposes or any other use not expressly permitted by these Terms, you must obtain prior written permission from QAComet or the respective rights holder. If you believe that your intellectual property rights have been infringed upon by any content on the website, please contact QAComet promptly with the relevant information, and we will investigate the matter accordingly.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"The QAComet name, logo, and all related names, logos, product and service names, designs, and slogans are trademarks of QAComet or its affiliates or licensors. You may not use such marks without the prior written permission of QAComet. All other names, logos, product and service names, designs, and slogans on this website are the trademarks of their respective owners.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Any unauthorized use of the website's content or trademarks may violate copyright, trademark, and other laws and may result in civil or criminal penalties.",{"type":13,"tag":32,"props":225,"children":227},{"id":226},"_4-privacy-policy",[228],{"type":18,"value":229},"4. PRIVACY POLICY",{"type":13,"tag":14,"props":231,"children":232},{},[233,235,242],{"type":18,"value":234},"The Privacy Policy of the QAComet website governs the collection, use, and disclosure of personal information provided by users. For more detailed information about our privacy practices, including how we collect, use, and protect your personal information, please refer to our ",{"type":13,"tag":25,"props":236,"children":239},{"href":237,"rel":238},"https://qacomet.com/privacy-policy",[58],[240],{"type":18,"value":241},"Privacy Policy",{"type":18,"value":243},".",{"type":13,"tag":32,"props":245,"children":247},{"id":246},"_5-disclaimer-of-warranties",[248],{"type":18,"value":249},"5. DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":251,"children":252},{},[253],{"type":18,"value":254},"The QAComet website is provided on an \"as-is\" and \"as-available\" basis, without any warranties or representations of any kind, whether express or implied. QAComet makes no representations or warranties regarding the accuracy, completeness, reliability, timeliness, or availability of the website or its content.",{"type":13,"tag":14,"props":256,"children":257},{},[258],{"type":18,"value":259},"To the fullest extent permitted by applicable law, QAComet disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.",{"type":13,"tag":14,"props":261,"children":262},{},[263],{"type":18,"value":264},"QAComet does not warrant that the website will be uninterrupted, secure, error-free, or free of viruses or other harmful components. Any material downloaded or otherwise obtained through the use of the website is accessed at your own discretion and risk, and you will be solely responsible for any damage to your computer system or loss of data that results from such download or use.",{"type":13,"tag":14,"props":266,"children":267},{},[268],{"type":18,"value":269},"QAComet does not warrant or make any representations regarding the use or the results of the use of the website or its content in terms of accuracy, reliability, completeness, or otherwise.",{"type":13,"tag":14,"props":271,"children":272},{},[273],{"type":18,"value":274},"Some jurisdictions do not allow the exclusion of certain warranties, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing disclaimer shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":276,"children":278},{"id":277},"_6-limitation-of-liability",[279],{"type":18,"value":280},"6. LIMITATION OF LIABILITY:",{"type":13,"tag":14,"props":282,"children":283},{},[284],{"type":18,"value":285},"In no event shall QAComet, its affiliates, directors, officers, employees, agents, or licensors be liable to you or any third party for any indirect, consequential, incidental, special, punitive, or exemplary damages, including but not limited to damages for loss of profits, goodwill, use, data, or other intangible losses, arising out of or in connection with your access to or use of the QAComet website or its content, regardless of whether such damages are based on warranty, contract, tort (including negligence), strict liability, or any other legal theory, and even if QAComet has been advised of the possibility of such damages.",{"type":13,"tag":14,"props":287,"children":288},{},[289],{"type":18,"value":290},"In no event shall the total liability of QAComet, its affiliates, directors, officers, employees, agents, or licensors to you for all claims arising out of or in connection with your use of the website exceed the amount paid by you, if any, to QAComet for accessing or using the website during the twelve-month period immediately preceding the event giving rise to such liability.",{"type":13,"tag":14,"props":292,"children":293},{},[294],{"type":18,"value":295},"The limitations of liability set forth in this clause apply even if any exclusive remedy provided herein fails of its essential purpose. Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitations may not apply to you. However, to the extent permitted by applicable law, the foregoing limitation of liability shall apply to the maximum extent permitted by law.",{"type":13,"tag":32,"props":297,"children":299},{"id":298},"_7-modification-and-termination",[300],{"type":18,"value":301},"7. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":303,"children":304},{},[305],{"type":18,"value":306},"QAComet reserves the right, at its sole discretion, to modify or terminate the website or any part thereof, including but not limited to its content, features, or availability, at any time without prior notice. QAComet may also modify these General Terms and Conditions (\"Terms\") at any time by posting the amended terms on the website. Your continued use of the website following any such changes constitutes your acceptance of the modified Terms.",{"type":13,"tag":14,"props":308,"children":309},{},[310],{"type":18,"value":311},"QAComet may terminate or suspend your access to all or any part of the website at any time, with or without cause, and with or without notice, for any reason or no reason, including but not limited to your breach of these Terms. Upon termination of your access to the website, all licenses and rights granted to you under these Terms shall immediately terminate, and you shall cease all use of the website.",{"type":13,"tag":14,"props":313,"children":314},{},[315],{"type":18,"value":316},"Upon any termination of the website or your access to it, all provisions of these Terms which by their nature should survive termination, including but not limited to ownership provisions, warranty disclaimers, indemnity, and limitations of liability, shall survive termination.",{"type":13,"tag":14,"props":318,"children":319},{},[320],{"type":18,"value":321},"QAComet shall not be liable to you or any third party for any modification, suspension, or termination of the website or your access to it.",{"type":13,"tag":32,"props":323,"children":325},{"id":324},"_8-governing-law-and-dispute-resolution",[326],{"type":18,"value":327},"8. GOVERNING LAW AND DISPUTE RESOLUTION:",{"type":13,"tag":14,"props":329,"children":330},{},[331],{"type":18,"value":332},"These General Terms and Conditions (\"Terms\") and any dispute arising out of or related to them or the QAComet website shall be governed by and construed in accordance with the laws of the State of Colorado, United States, without regard to its conflict of law principles.",{"type":13,"tag":14,"props":334,"children":335},{},[336],{"type":18,"value":337},"Any dispute, controversy, or claim arising out of or relating to these Terms, including but not limited to their formation, interpretation, breach, termination, or validity, shall be exclusively resolved by binding arbitration in Denver, Colorado, administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall be conducted before a single arbitrator chosen in accordance with the AAA rules. The decision of the arbitrator shall be final and binding upon the parties and may be enforced in any court of competent jurisdiction.",{"type":13,"tag":14,"props":339,"children":340},{},[341],{"type":18,"value":342},"Each party shall bear its own costs, including but not limited to attorney's fees, associated with the arbitration proceedings. However, the prevailing party in any arbitration or legal proceeding arising out of or related to these Terms shall be entitled to recover its reasonable attorney's fees and costs from the other party.",{"type":13,"tag":14,"props":344,"children":345},{},[346],{"type":18,"value":347},"Notwithstanding the foregoing, QAComet may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or stop any unauthorized use, misuse, or abuse of the website or its content without the need for posting a bond or other security.",{"type":13,"tag":14,"props":349,"children":350},{},[351],{"type":18,"value":352},"The language of arbitration and all related proceedings shall be English.",{"type":13,"tag":32,"props":354,"children":356},{"id":355},"_9-miscellaneous",[357],{"type":18,"value":358},"9. MISCELLANEOUS:",{"type":13,"tag":14,"props":360,"children":361},{},[362],{"type":18,"value":363},"Severability: If any provision of these Terms is found to be invalid, illegal, or unenforceable, the remaining provisions shall remain in full force and effect to the fullest extent permitted by law.",{"type":13,"tag":14,"props":365,"children":366},{},[367],{"type":18,"value":368},"Entire Agreement: These Terms constitute the entire agreement between you and QAComet regarding the subject matter herein and supersede all prior or contemporaneous agreements, communications, and proposals, whether oral or written, between the parties regarding such subject matter.",{"type":13,"tag":14,"props":370,"children":371},{},[372],{"type":18,"value":373},"Waiver: The failure of QAComet to enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by QAComet.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"Assignment: These Terms, and any rights and licenses granted hereunder, may not be transferred or assigned by you, but may be assigned by QAComet without restriction.",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Headings: The headings used in these Terms are for convenience only and shall not affect the construction or interpretation of these Terms.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Language: These Terms may be translated into other languages for convenience, but the English version shall prevail in the event of any conflict or discrepancy.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Survival: Sections regarding intellectual property, disclaimer of warranties, limitation of liability, governing law and dispute resolution, and any other provisions which by their nature should survive termination, shall survive any termination or expiration of these Terms.",{"type":13,"tag":14,"props":395,"children":396},{},[397,399],{"type":18,"value":398},"Contact Information: If you have any questions about these Terms or the QAComet website, please ",{"type":13,"tag":25,"props":400,"children":401},{"href":27},[402],{"type":18,"value":30},{"title":5,"searchDepth":404,"depth":404,"links":405},2,[406,407,408,409,410,411,412,413,414,415],{"id":34,"depth":404,"text":37},{"id":138,"depth":404,"text":141},{"id":164,"depth":404,"text":167},{"id":190,"depth":404,"text":193},{"id":226,"depth":404,"text":229},{"id":246,"depth":404,"text":249},{"id":277,"depth":404,"text":280},{"id":298,"depth":404,"text":301},{"id":324,"depth":404,"text":327},{"id":355,"depth":404,"text":358},"markdown","content:terms-and-conditions.md","content","terms-and-conditions.md","md",1717143074730] \ No newline at end of file diff --git a/terms-and-conditions/index.html b/terms-and-conditions/index.html index ce9f805..20d4413 100644 --- a/terms-and-conditions/index.html +++ b/terms-and-conditions/index.html @@ -9,9 +9,9 @@ - - - + + + @@ -21,34 +21,34 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/terms-of-service/_payload.json b/terms-of-service/_payload.json index 517c874..345713c 100644 --- a/terms-of-service/_payload.json +++ b/terms-of-service/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":792},["Reactive",2],{"content-query-InhJyj2aeT":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":787,"_id":788,"_source":789,"_file":790,"_extension":791},"/terms-of-service","",false,"Terms Of Service","Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.",{"type":10,"children":11,"toc":768},"root",[12,19,24,29,34,39,46,57,67,77,87,97,107,117,127,137,147,157,167,173,184,189,194,199,204,209,214,219,224,230,239,244,249,254,260,269,274,279,284,290,299,304,309,314,320,329,334,339,344,349,354,359,365,374,379,384,389,394,399,404,409,414,420,429,434,439,444,449,454,459,464,469,474,479,485,496,501,506,511,516,521,526,532,537,542,547,552,558,567,572,577,582,587,592,597,603,612,617,622,627,632,637,642,647,653,662,667,672,677,682,688,697,702,707,721,726,732,741,746,751,757],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22],{"type":18,"value":23},"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services.",{"type":13,"tag":14,"props":25,"children":26},{},[27],{"type":18,"value":28},"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more.",{"type":13,"tag":14,"props":30,"children":31},{},[32],{"type":18,"value":33},"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference.",{"type":13,"tag":14,"props":35,"children":36},{},[37],{"type":18,"value":38},"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us.",{"type":13,"tag":40,"props":41,"children":43},"h2",{"id":42},"definitions",[44],{"type":18,"value":45},"Definitions:",{"type":13,"tag":14,"props":47,"children":48},{},[49,55],{"type":13,"tag":50,"props":51,"children":52},"strong",{},[53],{"type":18,"value":54},"Client",{"type":18,"value":56},": Refers to individuals or entities who utilize QAComet's QA/Testing services.",{"type":13,"tag":14,"props":58,"children":59},{},[60,65],{"type":13,"tag":50,"props":61,"children":62},{},[63],{"type":18,"value":64},"Company",{"type":18,"value":66},": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms.",{"type":13,"tag":14,"props":68,"children":69},{},[70,75],{"type":13,"tag":50,"props":71,"children":72},{},[73],{"type":18,"value":74},"Services",{"type":18,"value":76},": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company.",{"type":13,"tag":14,"props":78,"children":79},{},[80,85],{"type":13,"tag":50,"props":81,"children":82},{},[83],{"type":18,"value":84},"Materials",{"type":18,"value":86},": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services.",{"type":13,"tag":14,"props":88,"children":89},{},[90,95],{"type":13,"tag":50,"props":91,"children":92},{},[93],{"type":18,"value":94},"Ownership",{"type":18,"value":96},": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms.",{"type":13,"tag":14,"props":98,"children":99},{},[100,105],{"type":13,"tag":50,"props":101,"children":102},{},[103],{"type":18,"value":104},"Client-Specific Utilities",{"type":18,"value":106},": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services.",{"type":13,"tag":14,"props":108,"children":109},{},[110,115],{"type":13,"tag":50,"props":111,"children":112},{},[113],{"type":18,"value":114},"Design Patterns",{"type":18,"value":116},": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects.",{"type":13,"tag":14,"props":118,"children":119},{},[120,125],{"type":13,"tag":50,"props":121,"children":122},{},[123],{"type":18,"value":124},"Trial Period",{"type":18,"value":126},": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription.",{"type":13,"tag":14,"props":128,"children":129},{},[130,135],{"type":13,"tag":50,"props":131,"children":132},{},[133],{"type":18,"value":134},"Subscription Fee",{"type":18,"value":136},": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis.",{"type":13,"tag":14,"props":138,"children":139},{},[140,145],{"type":13,"tag":50,"props":141,"children":142},{},[143],{"type":18,"value":144},"Intellectual Property Rights",{"type":18,"value":146},": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms.",{"type":13,"tag":14,"props":148,"children":149},{},[150,155],{"type":13,"tag":50,"props":151,"children":152},{},[153],{"type":18,"value":154},"Dispute Resolution",{"type":18,"value":156},": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms.",{"type":13,"tag":14,"props":158,"children":159},{},[160,165],{"type":13,"tag":50,"props":161,"children":162},{},[163],{"type":18,"value":164},"Privacy Policy",{"type":18,"value":166},": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms.",{"type":13,"tag":40,"props":168,"children":170},{"id":169},"_2-scope-of-service",[171],{"type":18,"value":172},"2. SCOPE OF SERVICE",{"type":13,"tag":14,"props":174,"children":175},{},[176,178],{"type":18,"value":177},"Summary: ",{"type":13,"tag":179,"props":180,"children":181},"em",{},[182],{"type":18,"value":183},"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients.",{"type":13,"tag":14,"props":185,"children":186},{},[187],{"type":18,"value":188},"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:",{"type":13,"tag":14,"props":190,"children":191},{},[192],{"type":18,"value":193},"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing.",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions.",{"type":13,"tag":40,"props":225,"children":227},{"id":226},"_3-account-security",[228],{"type":18,"value":229},"3. ACCOUNT SECURITY",{"type":13,"tag":14,"props":231,"children":232},{},[233,234],{"type":18,"value":177},{"type":13,"tag":179,"props":235,"children":236},{},[237],{"type":18,"value":238},"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested.",{"type":13,"tag":14,"props":240,"children":241},{},[242],{"type":18,"value":243},"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals.",{"type":13,"tag":14,"props":245,"children":246},{},[247],{"type":18,"value":248},"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision.",{"type":13,"tag":14,"props":250,"children":251},{},[252],{"type":18,"value":253},"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet.",{"type":13,"tag":40,"props":255,"children":257},{"id":256},"_4-right-to-refuse-or-cancel-services",[258],{"type":18,"value":259},"4. RIGHT TO REFUSE OR CANCEL SERVICES",{"type":13,"tag":14,"props":261,"children":262},{},[263,264],{"type":18,"value":177},{"type":13,"tag":179,"props":265,"children":266},{},[267],{"type":18,"value":268},"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested.",{"type":13,"tag":14,"props":270,"children":271},{},[272],{"type":18,"value":273},"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service.",{"type":13,"tag":14,"props":275,"children":276},{},[277],{"type":18,"value":278},"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation.",{"type":13,"tag":14,"props":280,"children":281},{},[282],{"type":18,"value":283},"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law.",{"type":13,"tag":40,"props":285,"children":287},{"id":286},"_5-promotional-rights",[288],{"type":18,"value":289},"5. PROMOTIONAL RIGHTS:",{"type":13,"tag":14,"props":291,"children":292},{},[293,294],{"type":18,"value":177},{"type":13,"tag":179,"props":295,"children":296},{},[297],{"type":18,"value":298},"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested.",{"type":13,"tag":14,"props":300,"children":301},{},[302],{"type":18,"value":303},"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies.",{"type":13,"tag":14,"props":305,"children":306},{},[307],{"type":18,"value":308},"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information.",{"type":13,"tag":14,"props":310,"children":311},{},[312],{"type":18,"value":313},"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials.",{"type":13,"tag":40,"props":315,"children":317},{"id":316},"_6-ownership-of-materials",[318],{"type":18,"value":319},"6. OWNERSHIP OF MATERIALS:",{"type":13,"tag":14,"props":321,"children":322},{},[323,324],{"type":18,"value":177},{"type":13,"tag":179,"props":325,"children":326},{},[327],{"type":18,"value":328},"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights.",{"type":13,"tag":14,"props":330,"children":331},{},[332],{"type":18,"value":333},"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services.",{"type":13,"tag":14,"props":335,"children":336},{},[337],{"type":18,"value":338},"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities.",{"type":13,"tag":14,"props":340,"children":341},{},[342],{"type":18,"value":343},"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet.",{"type":13,"tag":14,"props":345,"children":346},{},[347],{"type":18,"value":348},"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes.",{"type":13,"tag":14,"props":350,"children":351},{},[352],{"type":18,"value":353},"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":355,"children":356},{},[357],{"type":18,"value":358},"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials.",{"type":13,"tag":40,"props":360,"children":362},{"id":361},"_7-client-responsibilities",[363],{"type":18,"value":364},"7. CLIENT RESPONSIBILITIES:",{"type":13,"tag":14,"props":366,"children":367},{},[368,369],{"type":18,"value":177},{"type":13,"tag":179,"props":370,"children":371},{},[372],{"type":18,"value":373},"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities.",{"type":13,"tag":14,"props":395,"children":396},{},[397],{"type":18,"value":398},"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet.",{"type":13,"tag":14,"props":400,"children":401},{},[402],{"type":18,"value":403},"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested.",{"type":13,"tag":14,"props":405,"children":406},{},[407],{"type":18,"value":408},"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach.",{"type":13,"tag":14,"props":410,"children":411},{},[412],{"type":18,"value":413},"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions.",{"type":13,"tag":40,"props":415,"children":417},{"id":416},"_8-billing-and-payments",[418],{"type":18,"value":419},"8. BILLING AND PAYMENTS:",{"type":13,"tag":14,"props":421,"children":422},{},[423,424],{"type":18,"value":177},{"type":13,"tag":179,"props":425,"children":426},{},[427],{"type":18,"value":428},"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients.",{"type":13,"tag":14,"props":430,"children":431},{},[432],{"type":18,"value":433},"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:",{"type":13,"tag":14,"props":435,"children":436},{},[437],{"type":18,"value":438},"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client.",{"type":13,"tag":14,"props":440,"children":441},{},[442],{"type":18,"value":443},"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate.",{"type":13,"tag":14,"props":445,"children":446},{},[447],{"type":18,"value":448},"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month.",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":18,"value":453},"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":18,"value":458},"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":18,"value":463},"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle.",{"type":13,"tag":14,"props":465,"children":466},{},[467],{"type":18,"value":468},"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription.",{"type":13,"tag":14,"props":470,"children":471},{},[472],{"type":18,"value":473},"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full.",{"type":13,"tag":14,"props":475,"children":476},{},[477],{"type":18,"value":478},"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client.",{"type":13,"tag":40,"props":480,"children":482},{"id":481},"_9-intellectual-property-rights",[483],{"type":18,"value":484},"9. INTELLECTUAL PROPERTY RIGHTS:",{"type":13,"tag":14,"props":486,"children":487},{},[488,489,494],{"type":18,"value":177},{"type":13,"tag":179,"props":490,"children":491},{},[492],{"type":18,"value":493},"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests.",{"type":18,"value":495},"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:",{"type":13,"tag":14,"props":497,"children":498},{},[499],{"type":18,"value":500},"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services.",{"type":13,"tag":14,"props":502,"children":503},{},[504],{"type":18,"value":505},"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets.",{"type":13,"tag":14,"props":507,"children":508},{},[509],{"type":18,"value":510},"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":512,"children":513},{},[514],{"type":18,"value":515},"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties.",{"type":13,"tag":14,"props":517,"children":518},{},[519],{"type":18,"value":520},"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent.",{"type":13,"tag":14,"props":522,"children":523},{},[524],{"type":18,"value":525},"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client.",{"type":13,"tag":40,"props":527,"children":529},{"id":528},"_10-qacomet-pre-existing-ip-materials",[530],{"type":18,"value":531},"10. QACOMET Pre-Existing IP MATERIALS.",{"type":13,"tag":14,"props":533,"children":534},{},[535],{"type":18,"value":536},"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”).",{"type":13,"tag":14,"props":538,"children":539},{},[540],{"type":18,"value":541},"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services.",{"type":13,"tag":14,"props":543,"children":544},{},[545],{"type":18,"value":546},"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission.",{"type":13,"tag":14,"props":548,"children":549},{},[550],{"type":18,"value":551},"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement.",{"type":13,"tag":40,"props":553,"children":555},{"id":554},"_11-limitation-of-liability-and-disclaimer-of-warranties",[556],{"type":18,"value":557},"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":559,"children":560},{},[561,562],{"type":18,"value":177},{"type":13,"tag":179,"props":563,"children":564},{},[565],{"type":18,"value":566},"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing.",{"type":13,"tag":14,"props":568,"children":569},{},[570],{"type":18,"value":571},"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:",{"type":13,"tag":14,"props":573,"children":574},{},[575],{"type":18,"value":576},"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access.",{"type":13,"tag":14,"props":578,"children":579},{},[580],{"type":18,"value":581},"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected.",{"type":13,"tag":14,"props":583,"children":584},{},[585],{"type":18,"value":586},"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet.",{"type":13,"tag":14,"props":588,"children":589},{},[590],{"type":18,"value":591},"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim.",{"type":13,"tag":14,"props":593,"children":594},{},[595],{"type":18,"value":596},"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances.",{"type":13,"tag":40,"props":598,"children":600},{"id":599},"_12-confidentiality",[601],{"type":18,"value":602},"12. CONFIDENTIALITY:",{"type":13,"tag":14,"props":604,"children":605},{},[606,607],{"type":18,"value":177},{"type":13,"tag":179,"props":608,"children":609},{},[610],{"type":18,"value":611},"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data.",{"type":13,"tag":14,"props":613,"children":614},{},[615],{"type":18,"value":616},"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:",{"type":13,"tag":14,"props":618,"children":619},{},[620],{"type":18,"value":621},"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies.",{"type":13,"tag":14,"props":623,"children":624},{},[625],{"type":18,"value":626},"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls.",{"type":13,"tag":14,"props":628,"children":629},{},[630],{"type":18,"value":631},"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms.",{"type":13,"tag":14,"props":633,"children":634},{},[635],{"type":18,"value":636},"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation.",{"type":13,"tag":14,"props":638,"children":639},{},[640],{"type":18,"value":641},"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter.",{"type":13,"tag":14,"props":643,"children":644},{},[645],{"type":18,"value":646},"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity.",{"type":13,"tag":40,"props":648,"children":650},{"id":649},"_13-dispute-resolution-and-governing-law",[651],{"type":18,"value":652},"13. DISPUTE RESOLUTION AND GOVERNING LAW:",{"type":13,"tag":14,"props":654,"children":655},{},[656,657],{"type":18,"value":177},{"type":13,"tag":179,"props":658,"children":659},{},[660],{"type":18,"value":661},"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law.",{"type":13,"tag":14,"props":663,"children":664},{},[665],{"type":18,"value":666},"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution.",{"type":13,"tag":14,"props":668,"children":669},{},[670],{"type":18,"value":671},"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties.",{"type":13,"tag":14,"props":673,"children":674},{},[675],{"type":18,"value":676},"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator.",{"type":13,"tag":14,"props":678,"children":679},{},[680],{"type":18,"value":681},"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts.",{"type":13,"tag":40,"props":683,"children":685},{"id":684},"_14-modification-and-termination",[686],{"type":18,"value":687},"14. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":689,"children":690},{},[691,692],{"type":18,"value":177},{"type":13,"tag":179,"props":693,"children":694},{},[695],{"type":18,"value":696},"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations.",{"type":13,"tag":14,"props":698,"children":699},{},[700],{"type":18,"value":701},"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect.",{"type":13,"tag":14,"props":703,"children":704},{},[705],{"type":18,"value":706},"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination.",{"type":13,"tag":14,"props":708,"children":709},{},[710,712,719],{"type":18,"value":711},"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing ",{"type":13,"tag":713,"props":714,"children":716},"a",{"href":715},"mailto:contact@qacomet.com",[717],{"type":18,"value":718},"contact@qacomet.com",{"type":18,"value":720},".",{"type":13,"tag":14,"props":722,"children":723},{},[724],{"type":18,"value":725},"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service.",{"type":13,"tag":40,"props":727,"children":729},{"id":728},"_15-severability",[730],{"type":18,"value":731},"15. SEVERABILITY",{"type":13,"tag":14,"props":733,"children":734},{},[735,736],{"type":18,"value":177},{"type":13,"tag":179,"props":737,"children":738},{},[739],{"type":18,"value":740},"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible",{"type":13,"tag":14,"props":742,"children":743},{},[744],{"type":18,"value":745},"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions.",{"type":13,"tag":14,"props":747,"children":748},{},[749],{"type":18,"value":750},"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision.",{"type":13,"tag":40,"props":752,"children":754},{"id":753},"_16-contact-us",[755],{"type":18,"value":756},"16. Contact Us:",{"type":13,"tag":14,"props":758,"children":759},{},[760,762,766],{"type":18,"value":761},"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at ",{"type":13,"tag":713,"props":763,"children":764},{"href":715},[765],{"type":18,"value":718},{"type":18,"value":767},". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients.",{"title":5,"searchDepth":769,"depth":769,"links":770},2,[771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],{"id":42,"depth":769,"text":45},{"id":169,"depth":769,"text":172},{"id":226,"depth":769,"text":229},{"id":256,"depth":769,"text":259},{"id":286,"depth":769,"text":289},{"id":316,"depth":769,"text":319},{"id":361,"depth":769,"text":364},{"id":416,"depth":769,"text":419},{"id":481,"depth":769,"text":484},{"id":528,"depth":769,"text":531},{"id":554,"depth":769,"text":557},{"id":599,"depth":769,"text":602},{"id":649,"depth":769,"text":652},{"id":684,"depth":769,"text":687},{"id":728,"depth":769,"text":731},{"id":753,"depth":769,"text":756},"markdown","content:terms-of-service.md","content","terms-of-service.md","md",1714258642248] \ No newline at end of file +[{"data":1,"prerenderedAt":792},["Reactive",2],{"content-query-InhJyj2aeT":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":5,"title":7,"description":8,"body":9,"_type":787,"_id":788,"_source":789,"_file":790,"_extension":791},"/terms-of-service","",false,"Terms Of Service","Welcome to the Terms of Service (\"Terms\") for QAComet's QA/Testing services. These Terms govern your use of our productized service company specializing in Quality Assurance and Testing (\"Services\"). By accessing or using our Services, you agree to be bound by these Terms.",{"type":10,"children":11,"toc":768},"root",[12,19,24,29,34,39,46,57,67,77,87,97,107,117,127,137,147,157,167,173,184,189,194,199,204,209,214,219,224,230,239,244,249,254,260,269,274,279,284,290,299,304,309,314,320,329,334,339,344,349,354,359,365,374,379,384,389,394,399,404,409,414,420,429,434,439,444,449,454,459,464,469,474,479,485,496,501,506,511,516,521,526,532,537,542,547,552,558,567,572,577,582,587,592,597,603,612,617,622,627,632,637,642,647,653,662,667,672,677,682,688,697,702,707,721,726,732,741,746,751,757],{"type":13,"tag":14,"props":15,"children":16},"element","p",{},[17],{"type":18,"value":8},"text",{"type":13,"tag":14,"props":20,"children":21},{},[22],{"type":18,"value":23},"These Terms outline the rights and responsibilities of both our company and our clients in relation to the provision and use of our Services. It is important to review and understand these Terms before utilizing our Services.",{"type":13,"tag":14,"props":25,"children":26},{},[27],{"type":18,"value":28},"Our commitment to transparency and clarity is reflected in these Terms, which cover various aspects of our business relationship, including ownership of materials, services offered, client responsibilities, billing and payments, intellectual property rights, limitation of liability, dispute resolution, and more.",{"type":13,"tag":14,"props":30,"children":31},{},[32],{"type":18,"value":33},"By agreeing to these Terms, you acknowledge that QAComet may collect, store, and use certain information as outlined in our Privacy Policy, which is incorporated into these Terms by reference.",{"type":13,"tag":14,"props":35,"children":36},{},[37],{"type":18,"value":38},"We value open communication and strive to maintain a collaborative and mutually beneficial relationship with our clients. If you have any questions or concerns about these Terms or our Services, please do not hesitate to contact us.",{"type":13,"tag":40,"props":41,"children":43},"h2",{"id":42},"definitions",[44],{"type":18,"value":45},"Definitions:",{"type":13,"tag":14,"props":47,"children":48},{},[49,55],{"type":13,"tag":50,"props":51,"children":52},"strong",{},[53],{"type":18,"value":54},"Client",{"type":18,"value":56},": Refers to individuals or entities who utilize QAComet's QA/Testing services.",{"type":13,"tag":14,"props":58,"children":59},{},[60,65],{"type":13,"tag":50,"props":61,"children":62},{},[63],{"type":18,"value":64},"Company",{"type":18,"value":66},": Refers to QAComet, the provider of QA/Testing services as outlined in these Terms.",{"type":13,"tag":14,"props":68,"children":69},{},[70,75],{"type":13,"tag":50,"props":71,"children":72},{},[73],{"type":18,"value":74},"Services",{"type":18,"value":76},": Refers to the productized service company specializing in Quality Assurance and Testing offered by QAComet, including but not limited to testing processes, consultation, and other related services provided by the Company.",{"type":13,"tag":14,"props":78,"children":79},{},[80,85],{"type":13,"tag":50,"props":81,"children":82},{},[83],{"type":18,"value":84},"Materials",{"type":18,"value":86},": Includes code, scripts, libraries, and utility methods utilized in the provision of QA/Testing services. This also encompasses any deliverables or intellectual property created or provided by the Company during the course of providing the Services.",{"type":13,"tag":14,"props":88,"children":89},{},[90,95],{"type":13,"tag":50,"props":91,"children":92},{},[93],{"type":18,"value":94},"Ownership",{"type":18,"value":96},": Refers to the legal rights and responsibilities associated with the Materials and other deliverables provided by the Company, as outlined in these Terms.",{"type":13,"tag":14,"props":98,"children":99},{},[100,105],{"type":13,"tag":50,"props":101,"children":102},{},[103],{"type":18,"value":104},"Client-Specific Utilities",{"type":18,"value":106},": Refers to any tools, scripts, or methodologies specifically developed or customized for a particular client's use during the provision of the Services.",{"type":13,"tag":14,"props":108,"children":109},{},[110,115],{"type":13,"tag":50,"props":111,"children":112},{},[113],{"type":18,"value":114},"Design Patterns",{"type":18,"value":116},": Refers to recurring solutions to common design problems encountered in software development, which may be utilized by the Company across multiple projects.",{"type":13,"tag":14,"props":118,"children":119},{},[120,125],{"type":13,"tag":50,"props":121,"children":122},{},[123],{"type":18,"value":124},"Trial Period",{"type":18,"value":126},": Refers to the specified duration during which clients may access a limited version of the Services for evaluation purposes before committing to a full subscription.",{"type":13,"tag":14,"props":128,"children":129},{},[130,135],{"type":13,"tag":50,"props":131,"children":132},{},[133],{"type":18,"value":134},"Subscription Fee",{"type":18,"value":136},": Refers to the recurring payment charged by the Company for continued access to the Services, typically on a monthly basis.",{"type":13,"tag":14,"props":138,"children":139},{},[140,145],{"type":13,"tag":50,"props":141,"children":142},{},[143],{"type":18,"value":144},"Intellectual Property Rights",{"type":18,"value":146},": Refers to rights associated with intellectual creations, including copyrights, trademarks, and patents, as outlined in these Terms.",{"type":13,"tag":14,"props":148,"children":149},{},[150,155],{"type":13,"tag":50,"props":151,"children":152},{},[153],{"type":18,"value":154},"Dispute Resolution",{"type":18,"value":156},": Refers to the process for resolving disagreements or conflicts between the Company and its clients, as outlined in these Terms.",{"type":13,"tag":14,"props":158,"children":159},{},[160,165],{"type":13,"tag":50,"props":161,"children":162},{},[163],{"type":18,"value":164},"Privacy Policy",{"type":18,"value":166},": Refers to the Company's policy governing the collection, use, and disclosure of personal information provided by clients, as outlined in a separate document incorporated into these Terms.",{"type":13,"tag":40,"props":168,"children":170},{"id":169},"_2-scope-of-service",[171],{"type":18,"value":172},"2. SCOPE OF SERVICE",{"type":13,"tag":14,"props":174,"children":175},{},[176,178],{"type":18,"value":177},"Summary: ",{"type":13,"tag":179,"props":180,"children":181},"em",{},[182],{"type":18,"value":183},"This detailed clause provides a comprehensive overview of the scope of services offered by QAComet, highlighting the various testing solutions and support services available to clients.",{"type":13,"tag":14,"props":185,"children":186},{},[187],{"type":18,"value":188},"QAComet is committed to providing high-quality QA/Testing services to our clients. The scope of our services encompasses a comprehensive range of testing solutions tailored to meet the unique needs of each client. Below is an outline of the services offered by QAComet:",{"type":13,"tag":14,"props":190,"children":191},{},[192],{"type":18,"value":193},"Quality Assurance Testing: QAComet specializes in conducting thorough quality assurance testing to identify and address potential issues or defects in software applications. Our testing processes encompass various methodologies, including functional testing, regression testing, performance testing, usability testing, and compatibility testing.",{"type":13,"tag":14,"props":195,"children":196},{},[197],{"type":18,"value":198},"Consultation and Advisory Services: In addition to conducting testing activities, QAComet offers consultation and advisory services to assist clients in optimizing their software development processes. Our experienced team of QA professionals provides expert guidance and recommendations on testing strategies, tools, and best practices to enhance the quality and reliability of software products.",{"type":13,"tag":14,"props":200,"children":201},{},[202],{"type":18,"value":203},"Test Automation: QAComet leverages automation tools and frameworks to streamline the testing process and improve efficiency. We develop automated test scripts tailored to the specific requirements of each project, allowing for repetitive tests to be executed quickly and accurately.",{"type":13,"tag":14,"props":205,"children":206},{},[207],{"type":18,"value":208},"Continuous Integration/Continuous Deployment (CI/CD) Integration: QAComet provides guidance and support for integrating QA testing processes into clients' CI/CD pipelines. We offer recommendations and assistance in configuring automated testing workflows, enabling seamless integration of testing activities into the software development lifecycle.",{"type":13,"tag":14,"props":210,"children":211},{},[212],{"type":18,"value":213},"Customized Testing Solutions: At QAComet, we understand that every project is unique, and one-size-fits-all approaches may not suffice. Therefore, we offer customized testing solutions tailored to the specific requirements and objectives of each client. Whether it's testing a web application, mobile app, or enterprise software solution, our team collaborates closely with clients to develop customized testing strategies that align with their goals and objectives.",{"type":13,"tag":14,"props":215,"children":216},{},[217],{"type":18,"value":218},"Client Collaboration and Support: QAComet prioritizes open communication and collaboration with clients throughout the testing process. Our team works closely with clients to understand their requirements, address any concerns or questions, and ensure that testing activities are aligned with their business objectives. We provide ongoing support and assistance to clients, offering guidance and recommendations as needed to achieve optimal testing outcomes.",{"type":13,"tag":14,"props":220,"children":221},{},[222],{"type":18,"value":223},"Discretionary Services: In addition to the core services outlined above, QAComet may offer discretionary services or additional features upon mutual agreement with the client. These services may include specialized testing activities, customized reporting, or other value-added services aimed at enhancing the overall quality and effectiveness of our testing solutions.",{"type":13,"tag":40,"props":225,"children":227},{"id":226},"_3-account-security",[228],{"type":18,"value":229},"3. ACCOUNT SECURITY",{"type":13,"tag":14,"props":231,"children":232},{},[233,234],{"type":18,"value":177},{"type":13,"tag":179,"props":235,"children":236},{},[237],{"type":18,"value":238},"This clause emphasizes the importance of maintaining the security of user accounts and prohibits the sharing of login credentials or sublicensing access, effectively preventing unauthorized usage of QAComet services or materials as requested.",{"type":13,"tag":14,"props":240,"children":241},{},[242],{"type":18,"value":243},"To maintain the security and integrity of QAComet services, users are prohibited from sharing their account login credentials or sublicensing access to their account to any third party. Each user is responsible for safeguarding their account login information and ensuring that it is not shared, disclosed, or accessed by unauthorized individuals.",{"type":13,"tag":14,"props":245,"children":246},{},[247],{"type":18,"value":248},"Any unauthorized usage of QAComet services or materials resulting from the sharing of account login credentials or sublicensing of access shall be the sole responsibility of the account holder. QAComet shall not be liable for any damages, losses, or liabilities arising out of or related to the unauthorized usage of services or materials due to the violation of this provision.",{"type":13,"tag":14,"props":250,"children":251},{},[252],{"type":18,"value":253},"Users are encouraged to take proactive measures to protect the security of their accounts, including choosing strong and unique passwords, enabling two-factor authentication where available, and promptly reporting any suspected unauthorized access or usage of their account to QAComet.",{"type":13,"tag":40,"props":255,"children":257},{"id":256},"_4-right-to-refuse-or-cancel-services",[258],{"type":18,"value":259},"4. RIGHT TO REFUSE OR CANCEL SERVICES",{"type":13,"tag":14,"props":261,"children":262},{},[263,264],{"type":18,"value":177},{"type":13,"tag":179,"props":265,"children":266},{},[267],{"type":18,"value":268},"This clause empowers QAComet to make decisions regarding the provision of services and the continuation of client subscriptions, effectively capturing the necessary provisions as requested.",{"type":13,"tag":14,"props":270,"children":271},{},[272],{"type":18,"value":273},"QAComet reserves the right to refuse to provide services to prospective clients at its sole discretion. This includes but is not limited to cases where QAComet determines, in its judgment, that providing services to a prospective client may pose a risk to QAComet reputation, integrity, or ability to fulfill its obligations under these Terms of Service.",{"type":13,"tag":14,"props":275,"children":276},{},[277],{"type":18,"value":278},"In the event where QAComet cancels the service, the client will receive a prorated refund for the unused portion of the subscription term, minus a 20% cancellation fee. The refund will be processed within 30 days of cancellation. for example; If a client purchases a yearly subscription for $60000 and QAComet cancels the service after 4 months, the client will be refunded for the remaining 8 months of the subscription, minus a 20% cancellation fee. Therefore, the client will receive a refund of $36000 ($60000 - $20000 - 20% cancellation fee) within 30 days of cancellation.",{"type":13,"tag":14,"props":280,"children":281},{},[282],{"type":18,"value":283},"QAComet shall not be liable to the prospective client or existing client or any third party for any damages, losses, or liabilities arising out of or related to the refusal to provide services or the cancellation or termination of existing client subscriptions, except as otherwise provided in these Terms of Service or required by applicable law.",{"type":13,"tag":40,"props":285,"children":287},{"id":286},"_5-promotional-rights",[288],{"type":18,"value":289},"5. PROMOTIONAL RIGHTS:",{"type":13,"tag":14,"props":291,"children":292},{},[293,294],{"type":18,"value":177},{"type":13,"tag":179,"props":295,"children":296},{},[297],{"type":18,"value":298},"This Promotional Rights clause grants QAComet the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes, while respecting client confidentiality and privacy as requested.",{"type":13,"tag":14,"props":300,"children":301},{},[302],{"type":18,"value":303},"QAComet reserves the right to showcase non-identifiable case studies or project examples in its marketing materials for promotional purposes. By engaging QAComet services, clients grant QAComet the limited right to use non-identifiable information about their projects or engagements in marketing materials, including but not limited to website content, social media posts, presentations, and case studies.",{"type":13,"tag":14,"props":305,"children":306},{},[307],{"type":18,"value":308},"Non-identifiable information may include general descriptions of the services provided, the types of projects undertaken, and the outcomes achieved, without disclosing any confidential client information or personally identifiable information. QAComet shall take reasonable measures to ensure that any information shared in promotional materials is sufficiently anonymized and does not reveal the identity of the client or any confidential information.",{"type":13,"tag":14,"props":310,"children":311},{},[312],{"type":18,"value":313},"Clients who do not wish to have their projects or engagements included in QAComet marketing materials may opt out by notifying QAComet in writing. QAComet shall respect the client's decision and refrain from using any information about their projects or engagements in its promotional materials.",{"type":13,"tag":40,"props":315,"children":317},{"id":316},"_6-ownership-of-materials",[318],{"type":18,"value":319},"6. OWNERSHIP OF MATERIALS:",{"type":13,"tag":14,"props":321,"children":322},{},[323,324],{"type":18,"value":177},{"type":13,"tag":179,"props":325,"children":326},{},[327],{"type":18,"value":328},"This detailed clause provides clear and comprehensive guidance on the ownership of materials, while emphasizing transparency and respect for clients' intellectual property rights.",{"type":13,"tag":14,"props":330,"children":331},{},[332],{"type":18,"value":333},"The Company acknowledges and respects the importance of intellectual property rights in the provision of QA/Testing services. As such, QAComet recognizes the need for clarity regarding the ownership of materials utilized in the course of delivering our services.",{"type":13,"tag":14,"props":335,"children":336},{},[337],{"type":18,"value":338},"Client-Specific Utilities: QAComet understands that clients may have unique tools, scripts, or methodologies integral to their operations. Any utilities designed specifically for a client's use, and developed exclusively during the provision of our services, shall remain the sole property of the respective client. QAComet will neither claim nor assert any ownership rights over such client-specific utilities.",{"type":13,"tag":14,"props":340,"children":341},{},[342],{"type":18,"value":343},"Design Patterns and General Utilities: While QAComet may utilize common design patterns and general utilities across multiple projects, it is acknowledged that such patterns and utilities may not be proprietary to any individual client. Therefore, QAComet does not claim exclusive ownership over these design patterns or general utilities. However, clients shall have the right to use such patterns and utilities within the scope of the Services provided by QAComet.",{"type":13,"tag":14,"props":345,"children":346},{},[347],{"type":18,"value":348},"Deliverables and Intellectual Property: All deliverables, including code, scripts, libraries, and any other intellectual property created or provided by QAComet during the course of providing our Services, shall be owned by the respective client upon delivery. QAComet hereby grants clients a non-exclusive, perpetual, and worldwide license to use, modify, and distribute such deliverables for their internal business purposes.",{"type":13,"tag":14,"props":350,"children":351},{},[352],{"type":18,"value":353},"Non-Exclusivity: It is understood that the ownership rights outlined herein shall not preclude QAComet from using similar design patterns or utilities in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that any materials developed for one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":355,"children":356},{},[357],{"type":18,"value":358},"Client's Obligations: Clients are responsible for ensuring that they have the necessary rights, licenses, and permissions to use any materials provided to QAComet for the purpose of delivering our Services. Clients shall indemnify and hold QAComet harmless against any claims, losses, or liabilities arising from the unauthorized use of third-party materials.",{"type":13,"tag":40,"props":360,"children":362},{"id":361},"_7-client-responsibilities",[363],{"type":18,"value":364},"7. CLIENT RESPONSIBILITIES:",{"type":13,"tag":14,"props":366,"children":367},{},[368,369],{"type":18,"value":177},{"type":13,"tag":179,"props":370,"children":371},{},[372],{"type":18,"value":373},"This clause outlines the expectations and responsibilities of clients when engaging QAComet for testing services, emphasizing the importance of communication, collaboration, and cooperation throughout the testing engagement.",{"type":13,"tag":14,"props":375,"children":376},{},[377],{"type":18,"value":378},"At QAComet, we believe that successful collaboration between our team and our clients is essential to achieving optimal testing outcomes. To facilitate effective cooperation and ensure the smooth delivery of our services, clients are expected to adhere to the following responsibilities:",{"type":13,"tag":14,"props":380,"children":381},{},[382],{"type":18,"value":383},"Clear Communication: Clients are responsible for maintaining clear and open communication with QAComet throughout the duration of the testing engagement. This includes promptly responding to inquiries, providing necessary information, and addressing any questions or concerns raised by QAComet team members.",{"type":13,"tag":14,"props":385,"children":386},{},[387],{"type":18,"value":388},"Setting Up Development Environment: Clients are responsible for providing instructions and access to set up the development environment required for testing purposes. This may include granting access to development servers, providing necessary credentials, and configuring the environment according to project specifications.",{"type":13,"tag":14,"props":390,"children":391},{},[392],{"type":18,"value":393},"Task Management: Clients are responsible for managing and prioritizing testing tasks using the designated task management system, such as a GitHub issues board. This includes accurately documenting testing requirements, assigning tasks to QAComet team members, and tracking the progress of testing activities.",{"type":13,"tag":14,"props":395,"children":396},{},[397],{"type":18,"value":398},"Code Changes and Enhancements: Clients are responsible for making necessary code changes or enhancements to their software applications to facilitate more robust testing. This may involve modifying code to improve testability, providing access to additional resources or data, or implementing specific testing scenarios as requested by QAComet.",{"type":13,"tag":14,"props":400,"children":401},{},[402],{"type":18,"value":403},"Providing Support and Assistance: Clients are responsible for providing support and assistance to QAComet team members as needed to facilitate testing activities. This may include addressing technical issues, providing access to relevant systems or data, or offering guidance on the functionality and behavior of the software application being tested.",{"type":13,"tag":14,"props":405,"children":406},{},[407],{"type":18,"value":408},"Adherence to Guidelines and Best Practices: Clients are responsible for adhering to any guidelines, best practices, or recommendations provided by QAComet regarding testing processes, methodologies, or tool usage. This includes implementing any necessary changes or adjustments to their development practices to ensure compatibility with QAComet testing approach.",{"type":13,"tag":14,"props":410,"children":411},{},[412],{"type":18,"value":413},"Feedback and Collaboration: Clients are encouraged to provide feedback and collaborate with QAComet throughout the testing engagement to ensure that testing activities are aligned with their expectations and objectives. This includes sharing insights, suggestions, and concerns to help improve the effectiveness and efficiency of our testing solutions.",{"type":13,"tag":40,"props":415,"children":417},{"id":416},"_8-billing-and-payments",[418],{"type":18,"value":419},"8. BILLING AND PAYMENTS:",{"type":13,"tag":14,"props":421,"children":422},{},[423,424],{"type":18,"value":177},{"type":13,"tag":179,"props":425,"children":426},{},[427],{"type":18,"value":428},"This clause provides a clear and comprehensive overview of QAComet billing structure and payment policies, while ensuring transparency and fairness for clients.",{"type":13,"tag":14,"props":430,"children":431},{},[432],{"type":18,"value":433},"QAComet operates on a transparent and straightforward billing structure to ensure clarity and predictability for our clients. The following provisions outline the terms and conditions related to billing and payments:",{"type":13,"tag":14,"props":435,"children":436},{},[437],{"type":18,"value":438},"Subscription Fees: Clients are required to pay a subscription fee for access to QAComet QA/Testing services. The subscription fee will be determined based on the selected plan and the number of seats/licenses required by the client.",{"type":13,"tag":14,"props":440,"children":441},{},[442],{"type":18,"value":443},"Trial Period: QAComet offers a 14-day trial period for clients to evaluate our services before committing to a full subscription. During the trial period, clients will have access to a limited version of our services for a nominal fee of $50 per seat. At the end of the trial period, clients will have the option to continue their subscription at the standard monthly rate.",{"type":13,"tag":14,"props":445,"children":446},{},[447],{"type":18,"value":448},"Monthly Subscription: Upon the expiration of the trial period, clients will be charged a monthly subscription fee of $5000 per seat for continued access to QAComet services. The monthly subscription fee will be billed in advance on a recurring basis, typically on the same day each month.",{"type":13,"tag":14,"props":450,"children":451},{},[452],{"type":18,"value":453},"Subscription Pauses: Clients may request to temporarily pause their QAComet subscription, halting services and billing for a specified period of time. Clients must provide 30 days' advance written notice to initiate a subscription pause. During the pause, clients retain their account but cannot submit service requests or access QAComet resources. Ongoing subscription fees will not be charged for the duration of the pause. Clients may restart their subscription at any time and resume regular billing.",{"type":13,"tag":14,"props":455,"children":456},{},[457],{"type":18,"value":458},"Cancellation: Clients have the option to cancel their subscription to QAComet services at any time. Upon cancellation, clients will not be billed for any future subscription periods, and their access to QAComet services will be terminated at the end of the current billing cycle.",{"type":13,"tag":14,"props":460,"children":461},{},[462],{"type":18,"value":463},"Refunds: QAComet does not offer refunds for subscription fees paid in advance. However, in the event of cancellation, clients may be entitled to a pro-rated refund for any unused portion of their subscription period, calculated based on the number of remaining days in the current billing cycle.",{"type":13,"tag":14,"props":465,"children":466},{},[467],{"type":18,"value":468},"Payment Methods: QAComet accepts payment via credit card, debit card, or other electronic payment methods. Clients are responsible for ensuring that their payment information is accurate and up-to-date to avoid any disruptions to their subscription.",{"type":13,"tag":14,"props":470,"children":471},{},[472],{"type":18,"value":473},"Late Payments: Clients are responsible for making timely payments for their subscription fees. In the event of a late payment, QAComet reserves the right to suspend or terminate the client's access to our services until payment is received in full.",{"type":13,"tag":14,"props":475,"children":476},{},[477],{"type":18,"value":478},"Taxes: All subscription fees are exclusive of any applicable taxes, duties, or similar charges, which will be added to the total amount due and payable by the client.",{"type":13,"tag":40,"props":480,"children":482},{"id":481},"_9-intellectual-property-rights",[483],{"type":18,"value":484},"9. INTELLECTUAL PROPERTY RIGHTS:",{"type":13,"tag":14,"props":486,"children":487},{},[488,489,494],{"type":18,"value":177},{"type":13,"tag":179,"props":490,"children":491},{},[492],{"type":18,"value":493},"This clause provides clarity and assurance regarding the ownership and use of intellectual property in relation to QAComet services, while emphasizing respect for clients' proprietary interests.",{"type":18,"value":495},"\nQAComet recognizes the importance of intellectual property rights and respects the proprietary interests of our clients. The following provisions outline the ownership and use of intellectual property in relation to our QA/Testing services:",{"type":13,"tag":14,"props":497,"children":498},{},[499],{"type":18,"value":500},"Client-Owned Materials: All materials provided by the client to QAComet for the purpose of conducting testing activities, including but not limited to code, scripts, data, and documentation (\"Client-Owned Materials\"), shall remain the exclusive property of the client. QAComet acknowledges and agrees that it has no ownership rights or claims to the Client-Owned Materials and shall use such materials solely for the purpose of providing the agreed-upon services.",{"type":13,"tag":14,"props":502,"children":503},{},[504],{"type":18,"value":505},"Deliverables and Work Product: Any deliverables, work product, or intellectual property created or developed by QAComet during the course of providing our services (\"Deliverables\") shall be owned by the client upon delivery. QAComet hereby assigns and transfers to the client all rights, title, and interest in and to the Deliverables, including but not limited to copyrights, patents, trademarks, and trade secrets.",{"type":13,"tag":14,"props":507,"children":508},{},[509],{"type":18,"value":510},"Non-Exclusivity: It is understood that the ownership rights granted to the client herein shall not preclude QAComet from using similar methodologies, techniques, or processes in the provision of services to other clients. However, QAComet shall take reasonable measures to ensure that the Deliverables provided to one client do not infringe upon the proprietary rights of another.",{"type":13,"tag":14,"props":512,"children":513},{},[514],{"type":18,"value":515},"Third-Party Materials: In the course of providing our services, QAComet may utilize third-party materials, including software libraries, tools, and frameworks, subject to applicable licenses and agreements. QAComet shall ensure that any third-party materials used in connection with our services are properly licensed and do not infringe upon the intellectual property rights of third parties.",{"type":13,"tag":14,"props":517,"children":518},{},[519],{"type":18,"value":520},"Confidentiality and Non-Disclosure: QAComet understands that certain information provided by the client may be confidential or proprietary in nature. QAComet agrees to maintain the confidentiality of such information and shall not disclose or use it for any purpose other than the provision of services, except as required by law or with the client's express consent.",{"type":13,"tag":14,"props":522,"children":523},{},[524],{"type":18,"value":525},"Indemnification: Clients shall indemnify, defend, and hold QAComet harmless against any claims, losses, damages, liabilities, or expenses arising from or related to the use of Client-Owned Materials or any third-party materials provided by the client. This indemnification obligation shall survive the termination of the agreement between QAComet and the client.",{"type":13,"tag":40,"props":527,"children":529},{"id":528},"_10-qacomet-pre-existing-ip-materials",[530],{"type":18,"value":531},"10. QACOMET Pre-Existing IP MATERIALS.",{"type":13,"tag":14,"props":533,"children":534},{},[535],{"type":18,"value":536},"QAComet retains all intellectual property rights to any pre-existing materials, methodologies, tools, technologies, software, and technical information developed by or licensed to QAComet prior to or outside the scope of Services provided to Client (“QAComet Materials”).",{"type":13,"tag":14,"props":538,"children":539},{},[540],{"type":18,"value":541},"QAComet grants Client a non-exclusive, non-transferable, revocable license to access and use QAComet Materials solely for Client’s internal use and benefit during an active subscription term to QAComet Services.",{"type":13,"tag":14,"props":543,"children":544},{},[545],{"type":18,"value":546},"Client may not modify, enhance, decompose, reverse engineer, alter licensing of, sublicense, distribute, or create derivative works from QAComet Materials without QAComet express written permission.",{"type":13,"tag":14,"props":548,"children":549},{},[550],{"type":18,"value":551},"Upon termination of Client’s subscription to Services: (a) all rights and licenses granted to Client for QAComet Materials will immediately cease, and (b) Client shall discontinue all use of QAComet Materials. QAComet shall retain ownership of all right, title and interest and all intellectual property rights in its Services, QAComet Materials, and anything developed or delivered by or on behalf of QAComet under this Agreement.",{"type":13,"tag":40,"props":553,"children":555},{"id":554},"_11-limitation-of-liability-and-disclaimer-of-warranties",[556],{"type":18,"value":557},"11. LIMITATION OF LIABILITY AND DISCLAIMER OF WARRANTIES:",{"type":13,"tag":14,"props":559,"children":560},{},[561,562],{"type":18,"value":177},{"type":13,"tag":179,"props":563,"children":564},{},[565],{"type":18,"value":566},"This clause provides clarity regarding QAComet liability limitations and disclaimer of warranties, while emphasizing the inherent risks associated with software testing.",{"type":13,"tag":14,"props":568,"children":569},{},[570],{"type":18,"value":571},"QAComet strives to provide high-quality QA/Testing services to our clients. However, it is important to recognize that software testing is inherently complex, and certain risks may be inherent in the testing process. The following provisions outline the limitations of liability and disclaimer of warranties associated with our services:",{"type":13,"tag":14,"props":573,"children":574},{},[575],{"type":18,"value":576},"Limitation of Liability: In no event shall QAComet, its officers, directors, employees, agents, or affiliates be liable to the client or any third party for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, loss of data, or loss of business opportunities, arising out of or in connection with the use of our services, regardless of the cause of action, whether in contract, tort, or otherwise, even if QAComet has been advised of the possibility of such damages. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects. However, QAComet will make reasonable efforts to correct any defects identified by the client while the client maintains an active paid subscription to QAComet services. If QAComet discontinues services for any reason, any responsibility for ongoing defect resolution will cease along with the cancellation of active subscriptions and service access.",{"type":13,"tag":14,"props":578,"children":579},{},[580],{"type":18,"value":581},"Disclaimer of Warranties: QAComet makes no warranties, express or implied, regarding the accuracy, completeness, reliability, or suitability of our services for any particular purpose. QAComet expressly disclaims all warranties, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement. QAComet does not warrant that our services will be uninterrupted, error-free, or free from defects, or that any defects will be corrected.",{"type":13,"tag":14,"props":583,"children":584},{},[585],{"type":18,"value":586},"Assumption of Risk: The client acknowledges and agrees that the use of QAComet services involves certain risks, including but not limited to the risk of software errors, defects, or failures. The client assumes all responsibility and liability for any consequences arising from the use of our services, including but not limited to the use of any deliverables or recommendations provided by QAComet.",{"type":13,"tag":14,"props":588,"children":589},{},[590],{"type":18,"value":591},"Limitation of Remedies: The client's sole and exclusive remedy for any dissatisfaction with QAComet services shall be to discontinue the use of our services. In no event shall QAComet total liability to the client exceed the total amount paid by the client to QAComet for the specific services giving rise to the claim during the six (6) months preceding the date of the claim.",{"type":13,"tag":14,"props":593,"children":594},{},[595],{"type":18,"value":596},"No Professional Advice: While QAComet provides quality assurance testing services and may offer related recommendations to clients as part of our standard services, this does not constitute formal professional advice. If seeking guidance for decision-making purposes or recommendations upon which clients will solely rely, clients should obtain independent professional consultation suited to their unique needs and circumstances.",{"type":13,"tag":40,"props":598,"children":600},{"id":599},"_12-confidentiality",[601],{"type":18,"value":602},"12. CONFIDENTIALITY:",{"type":13,"tag":14,"props":604,"children":605},{},[606,607],{"type":18,"value":177},{"type":13,"tag":179,"props":608,"children":609},{},[610],{"type":18,"value":611},"This clause outlines the obligations, responsibilities, and protections regarding the confidentiality of client information, while emphasizing QAComet commitment to safeguarding client data.",{"type":13,"tag":14,"props":613,"children":614},{},[615],{"type":18,"value":616},"QAComet recognizes the importance of maintaining the confidentiality and security of our clients' sensitive information. The following provisions outline the obligations and responsibilities of both QAComet and our clients with respect to confidentiality:",{"type":13,"tag":14,"props":618,"children":619},{},[620],{"type":18,"value":621},"Definition of Confidential Information: For the purposes of these Terms, \"Confidential Information\" shall include any non-public information disclosed by either party to the other party, either directly or indirectly, in writing, orally, or by inspection of tangible objects, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information and the circumstances of disclosure. Confidential Information may include, but is not limited to, trade secrets, business plans, financial information, technical data, and proprietary methodologies.",{"type":13,"tag":14,"props":623,"children":624},{},[625],{"type":18,"value":626},"Non-Disclosure: QAComet agrees to maintain the confidentiality of all Confidential Information disclosed by the client and shall not disclose such information to any third party without the client's prior written consent, except as required by law or as necessary to perform the services contemplated under these Terms. QAComet shall take reasonable measures to protect the confidentiality of the client's Confidential Information, including implementing appropriate security safeguards and access controls.",{"type":13,"tag":14,"props":628,"children":629},{},[630],{"type":18,"value":631},"Use of Confidential Information: QAComet agrees to use the client's Confidential Information solely for the purpose of providing the agreed-upon services and shall not use such information for any other purpose without the client's prior written consent. QAComet shall ensure that its employees, contractors, or agents who have access to the client's Confidential Information are bound by obligations of confidentiality at least as protective as those set forth in these Terms.",{"type":13,"tag":14,"props":633,"children":634},{},[635],{"type":18,"value":636},"Exceptions: The obligations of confidentiality set forth herein shall not apply to any information that: (a) is or becomes publicly available through no fault of QAComet; (b) was rightfully known to QAComet prior to its disclosure by the client; (c) is independently developed by QAComet without reference to the client's Confidential Information; or (d) is rightfully obtained by QAComet from a third party without breach of any confidentiality obligation.",{"type":13,"tag":14,"props":638,"children":639},{},[640],{"type":18,"value":641},"Survival: The obligations of confidentiality set forth herein shall survive the termination of the agreement between QAComet and the client and shall continue in full force and effect thereafter.",{"type":13,"tag":14,"props":643,"children":644},{},[645],{"type":18,"value":646},"Remedies: In the event of any actual or threatened breach of confidentiality by QAComet, the client shall be entitled to seek equitable relief, including injunctive relief and specific performance, in addition to any other remedies available at law or in equity.",{"type":13,"tag":40,"props":648,"children":650},{"id":649},"_13-dispute-resolution-and-governing-law",[651],{"type":18,"value":652},"13. DISPUTE RESOLUTION AND GOVERNING LAW:",{"type":13,"tag":14,"props":654,"children":655},{},[656,657],{"type":18,"value":177},{"type":13,"tag":179,"props":658,"children":659},{},[660],{"type":18,"value":661},"This clause provides a clear framework for resolving disputes between QAComet and its clients while ensuring compliance with Colorado law.",{"type":13,"tag":14,"props":663,"children":664},{},[665],{"type":18,"value":666},"Dispute Resolution: In the event of any dispute, controversy, or claim arising out of or relating to these Terms or the provision of QA/Testing services by QAComet (\"Dispute\"), the parties agree to first attempt to resolve the Dispute amicably through good-faith negotiations. Either party may initiate the dispute resolution process by providing written notice to the other party, setting forth the nature of the Dispute and proposing a resolution.",{"type":13,"tag":14,"props":668,"children":669},{},[670],{"type":18,"value":671},"If good faith negotiations are unsuccessful within thirty (30) days from the date on which either party notifies the other party of the dispute, the parties agree to submit the dispute to mediation conducted by a mutually agreed-upon mediator in Denver, Colorado. The costs of mediation shall be shared equally by both parties.",{"type":13,"tag":14,"props":673,"children":674},{},[675],{"type":18,"value":676},"If mediation is unsuccessful in resolving the dispute within sixty (60) days from the initiation of the mediation process or if either party refuses to participate in mediation, the dispute shall be resolved by binding arbitration administered by the American Arbitration Association (AAA) in accordance with its Commercial Arbitration Rules. The arbitration shall take place in Denver, Colorado, and the arbitrator's decision shall be final and binding upon the parties. Each party shall bear its own costs and expenses associated with the arbitration, including attorneys' fees, unless otherwise awarded by the arbitrator.",{"type":13,"tag":14,"props":678,"children":679},{},[680],{"type":18,"value":681},"Governing Law: These Terms shall be governed by and construed in accordance with the laws of the State of Colorado, without regard to its conflicts of laws principles. Any legal action or proceeding arising out of or relating to these Terms or the provision of QA/Testing services by QAComet shall be brought exclusively in the state or federal courts located in Denver County, Colorado, and the parties hereby consent to the jurisdiction and venue of such courts.",{"type":13,"tag":40,"props":683,"children":685},{"id":684},"_14-modification-and-termination",[686],{"type":18,"value":687},"14. MODIFICATION AND TERMINATION:",{"type":13,"tag":14,"props":689,"children":690},{},[691,692],{"type":18,"value":177},{"type":13,"tag":179,"props":693,"children":694},{},[695],{"type":18,"value":696},"This clause provides clarity regarding QAComet ability to modify and terminate its services and outlines the obligations of clients in response to such modifications or terminations.",{"type":13,"tag":14,"props":698,"children":699},{},[700],{"type":18,"value":701},"Modification of Terms: QAComet reserves the right to modify these Terms of Service at any time. Clients will receive at least 30 days’ advance written notice of any modifications by email or through the QAComet platform. Changes will be effective 30 days after the notice date. Continued use of QAComet services after the 30-day notice period indicates Client acceptance of the updated Terms. If the modifications are not acceptable, Client may terminate their subscription prior to the updates taking effect.",{"type":13,"tag":14,"props":703,"children":704},{},[705],{"type":18,"value":706},"Termination: QAComet may terminate service and cancel Client subscriptions at any time, with or without cause, with 30 days’ advance written notice. Client data or access may continue for the notice period or cease immediately depending on the reason for termination. In the event of termination, QAComet shall not be liable to Client for any damages, losses, or liabilities arising out of or related to such termination.",{"type":13,"tag":14,"props":708,"children":709},{},[710,712,719],{"type":18,"value":711},"Client Termination: Clients may terminate their QAComet subscription with 30 days’ advance written notice at any time by emailing ",{"type":13,"tag":713,"props":714,"children":716},"a",{"href":715},"mailto:contact@qacomet.com",[717],{"type":18,"value":718},"contact@qacomet.com",{"type":18,"value":720},".",{"type":13,"tag":14,"props":722,"children":723},{},[724],{"type":18,"value":725},"Survival: Sections of these Terms including Confidentiality, Indemnification, Limitation of Liability, and those related to QAComet ownership rights shall survive any termination expiration of these Terms of Service.",{"type":13,"tag":40,"props":727,"children":729},{"id":728},"_15-severability",[730],{"type":18,"value":731},"15. SEVERABILITY",{"type":13,"tag":14,"props":733,"children":734},{},[735,736],{"type":18,"value":177},{"type":13,"tag":179,"props":737,"children":738},{},[739],{"type":18,"value":740},"This clause provides assurance to QAComet and its clients that the validity and enforceability of the Terms will be preserved to the fullest extent possible",{"type":13,"tag":14,"props":742,"children":743},{},[744],{"type":18,"value":745},"In the event that any provision of these Terms of Service is determined to be unlawful, void, or unenforceable by a court of competent jurisdiction, such provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions.",{"type":13,"tag":14,"props":747,"children":748},{},[749],{"type":18,"value":750},"The parties agree that the court shall have the authority to modify or replace any provision of these Terms that is determined to be unlawful, void, or unenforceable with a valid and enforceable provision that most closely reflects the intent of the original provision.",{"type":13,"tag":40,"props":752,"children":754},{"id":753},"_16-contact-us",[755],{"type":18,"value":756},"16. Contact Us:",{"type":13,"tag":14,"props":758,"children":759},{},[760,762,766],{"type":18,"value":761},"For any inquiries, questions, or assistance regarding QAComet services or these Terms of Service, please feel free to contact us at ",{"type":13,"tag":713,"props":763,"children":764},{"href":715},[765],{"type":18,"value":718},{"type":18,"value":767},". We welcome your feedback and are committed to providing prompt and helpful assistance to our clients.",{"title":5,"searchDepth":769,"depth":769,"links":770},2,[771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],{"id":42,"depth":769,"text":45},{"id":169,"depth":769,"text":172},{"id":226,"depth":769,"text":229},{"id":256,"depth":769,"text":259},{"id":286,"depth":769,"text":289},{"id":316,"depth":769,"text":319},{"id":361,"depth":769,"text":364},{"id":416,"depth":769,"text":419},{"id":481,"depth":769,"text":484},{"id":528,"depth":769,"text":531},{"id":554,"depth":769,"text":557},{"id":599,"depth":769,"text":602},{"id":649,"depth":769,"text":652},{"id":684,"depth":769,"text":687},{"id":728,"depth":769,"text":731},{"id":753,"depth":769,"text":756},"markdown","content:terms-of-service.md","content","terms-of-service.md","md",1717143074732] \ No newline at end of file diff --git a/terms-of-service/index.html b/terms-of-service/index.html index be02d84..db81884 100644 --- a/terms-of-service/index.html +++ b/terms-of-service/index.html @@ -9,9 +9,9 @@ - - - + + + @@ -21,36 +21,36 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/white-papers/_payload.json b/white-papers/_payload.json new file mode 100644 index 0000000..28f925f --- /dev/null +++ b/white-papers/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":14},["Reactive",2],{"white-papers":3},[4],{"title":5,"link":6,"created":7,"shortDescription":13},"How Software QA Factors Into VC Investment Decisions","/white-papers/how-qa-factors-into-vc-due-diligence/",{"string":8,"number":9,"month":10,"day":11,"year":12},"May 30, 2024",1717048800000,"May",30,2024,"With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.",1717143074735] \ No newline at end of file diff --git a/white-papers/how-qa-factors-into-vc-due-diligence/_payload.json b/white-papers/how-qa-factors-into-vc-due-diligence/_payload.json new file mode 100644 index 0000000..7b73287 --- /dev/null +++ b/white-papers/how-qa-factors-into-vc-due-diligence/_payload.json @@ -0,0 +1 @@ +[{"data":1,"prerenderedAt":795},["Reactive",2],{"blog-post-white-papers/how-qa-factors-into-vc-due-diligence":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"breadcrumbs":10,"link":16,"created":17,"shortDescription":23,"body":24,"_type":790,"_id":791,"_source":792,"_file":793,"_extension":794},"/white-papers/how-qa-factors-into-vc-due-diligence","white-papers",false,"","How Software QA Factors Into VC Investment Decisions","Let your products shine bright with effective QA. With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.",[11,14],{"name":12,"path":13},"White papers","/white-papers/",{"name":15,"path":16},"How QA factors into VC due diligence","/white-papers/how-qa-factors-into-vc-due-diligence/",{"string":18,"number":19,"month":20,"day":21,"year":22},"May 30, 2024",1717048800000,"May",30,2024,"With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC.",{"type":25,"children":26,"toc":769},"root",[27,36,42,60,66,86,99,104,110,115,165,170,178,183,190,195,202,207,212,217,223,228,246,251,256,262,267,272,278,290,296,301,314,319,325,330,358,363,375,381,386,419,424,430,435,458,463,469,474,507,521,527,532,555,560,566,571,604,615,621,632,637,643,730,736],{"type":28,"tag":29,"props":30,"children":32},"element","h2",{"id":31},"introduction",[33],{"type":34,"value":35},"text","Introduction",{"type":28,"tag":37,"props":38,"children":39},"p",{},[40],{"type":34,"value":41},"In a recent market research survey we explored how venture capitalists (VCs) consider software quality in their investment decisions. We delved into their expectations for software quality at various investment stages and the standards for different products or verticals. The survey revealed that due to rising interest rates and increased consumer expectations for quality products, the investment landscape has become more stringent.",{"type":28,"tag":43,"props":44,"children":45},"blockquote",{},[46],{"type":28,"tag":37,"props":47,"children":48},{},[49,51],{"type":34,"value":50},"I think there's less room for error overall in all aspects of raising capital. Today, there's a clear flight to quality at all levels, starting with capital being deployed to VC funds. With today's higher interest rates, there's significantly less capital going forward. — Frederico Santos, ",{"type":28,"tag":52,"props":53,"children":57},"a",{"href":54,"rel":55},"https://sg.linkedin.com/in/frederico-castro-santos-33874444",[56],"nofollow",[58],{"type":34,"value":59},"VC Investor",{"type":28,"tag":29,"props":61,"children":63},{"id":62},"evolution-of-the-startup-investment-landscape",[64],{"type":34,"value":65},"Evolution of the startup investment landscape",{"type":28,"tag":37,"props":67,"children":68},{},[69,71,77,79,84],{"type":34,"value":70},"When you think of building a SaaS product, one of the most commonly quoted methodologies for managing product development is to \"Build fast and break things\" ",{"type":28,"tag":52,"props":72,"children":74},{"href":73},"#references",[75],{"type":34,"value":76},"HBR",{"type":34,"value":78},". But, this old wisdom applied to the early days of Facebook, from 2007 up to 2014 ",{"type":28,"tag":52,"props":80,"children":81},{"href":73},[82],{"type":34,"value":83},"CNET",{"type":34,"value":85},", may not be the best managerial choice while building up your product.",{"type":28,"tag":37,"props":87,"children":88},{},[89,91,97],{"type":34,"value":90},"Today, we live in a high-interest environment where capital is much more cautious than in the years before us. In addition, we've collectively seen nearly $1.5T in investments in the past ten years ",{"type":28,"tag":92,"props":93,"children":94},"span",{},[95],{"type":34,"value":96},"Statista",{"type":34,"value":98},". This translates into a vast trove of well-made SaaS products and established brands.",{"type":28,"tag":37,"props":100,"children":101},{},[102],{"type":34,"value":103},"With this diversity of products, we live in a world where users are fluent in multiple software products. And with that, they now have higher expectations for what a functional software product looks like today. This can be true even in the early stages of startup products, at pre-seed or seed stages, depending on your product and team. As your startup matures, passing through Series A onwards, the expectations for quality only increase.",{"type":28,"tag":29,"props":105,"children":107},{"id":106},"how-does-software-quality-affect-investment-decisions",[108],{"type":34,"value":109},"How does Software Quality Affect Investment Decisions?",{"type":28,"tag":37,"props":111,"children":112},{},[113],{"type":34,"value":114},"Our survey identified many types of startups that would significantly benefit from additional software QA. Investors use various questions to assess software quality requirements, such as:",{"type":28,"tag":116,"props":117,"children":118},"ul",{},[119,125,130,135,140,145,150,155,160],{"type":28,"tag":120,"props":121,"children":122},"li",{},[123],{"type":34,"value":124},"How technical of a product is it/is the product deep tech?",{"type":28,"tag":120,"props":126,"children":127},{},[128],{"type":34,"value":129},"Is this an infrastructure product?",{"type":28,"tag":120,"props":131,"children":132},{},[133],{"type":34,"value":134},"Is the product expected to integrate with multiple other tools?",{"type":28,"tag":120,"props":136,"children":137},{},[138],{"type":34,"value":139},"Does the product function as middleware between other sets of tools?",{"type":28,"tag":120,"props":141,"children":142},{},[143],{"type":34,"value":144},"How tolerant are customers of product failure?",{"type":28,"tag":120,"props":146,"children":147},{},[148],{"type":34,"value":149},"Are the customers technically savvy?",{"type":28,"tag":120,"props":151,"children":152},{},[153],{"type":34,"value":154},"Is the product responsible for Personally Identifiable Information (PII)?",{"type":28,"tag":120,"props":156,"children":157},{},[158],{"type":34,"value":159},"What kind of regulatory environment does the product live in?",{"type":28,"tag":120,"props":161,"children":162},{},[163],{"type":34,"value":164},"Are there any legal or financial risks if the product fails or behaves erratically?",{"type":28,"tag":37,"props":166,"children":167},{},[168],{"type":34,"value":169},"Ultimately, they are probing one fundamental question during due diligence:",{"type":28,"tag":43,"props":171,"children":172},{},[173],{"type":28,"tag":37,"props":174,"children":175},{},[176],{"type":34,"value":177},"What are the risks when the product fails?",{"type":28,"tag":37,"props":179,"children":180},{},[181],{"type":34,"value":182},"This is crucial because VCs are performing risk analysis on future software products while also assessing their market potential. If a product could be responsible for breaking a supply chain, crashing other software products due to downtime, enable fraud with stolen PII, pose security risks, or deterring non-technical users away from their product, this product will face extra scrutiny during due diligence.",{"type":28,"tag":184,"props":185,"children":187},"h3",{"id":186},"common-red-flags-during-vcs-due-diligence",[188],{"type":34,"value":189},"Common red flags during VC’s due diligence",{"type":28,"tag":37,"props":191,"children":192},{},[193],{"type":34,"value":194},"Our survey found several common red flags VCs look for during their due diligence process. These included not having a technical member on the founding team, usability and reliability issues, having a product that cannot scale with its current tech, and having a product with security vulnerabilities or other critical bugs. These red flags are particularly concerning for VCs if the product is deep tech or carries significant liabilities. Addressing these risks is vital for securing your next round of funding.",{"type":28,"tag":196,"props":197,"children":199},"h4",{"id":198},"usability-issues",[200],{"type":34,"value":201},"Usability issues­",{"type":28,"tag":37,"props":203,"children":204},{},[205],{"type":34,"value":206},"Usability problems were frequently mentioned red flags in our survey. Investors mentioned how clunky interfaces or poorly designed workflows often deterred them from investing in companies. Ensuring your software is user-friendly and intuitive is crucial to improving your investment prospects in this highly competitive environment.",{"type":28,"tag":37,"props":208,"children":209},{},[210],{"type":34,"value":211},"Have you considered how often users may be multitasking while using your software? This is essential for many products because there's a good chance a non-technical person will be using your product. I can't tell you the number of times I've been in a doctor's office, bank, financial aid office, etc. where someone I speak with is using some kind of software while talking to me. If a simple mistake could create catastrophe for some customer, you need to invest time and effort into polishing your product's workflow.",{"type":28,"tag":37,"props":213,"children":214},{},[215],{"type":34,"value":216},"Furthermore, you may be developing a product for non-technical users. These are people who would not be using your software unless it saved them a considerable amount of time. How patient do you think Joe the plumber will be when his dispatching software has awkward controls? This is true in several industries where users are much less tolerant of software problems.",{"type":28,"tag":196,"props":218,"children":220},{"id":219},"architectural-missteps-and-scaling-challenges",[221],{"type":34,"value":222},"Architectural missteps and scaling challenges",{"type":28,"tag":37,"props":224,"children":225},{},[226],{"type":34,"value":227},"Another red flag commonly mentioned by VCs were scaling issues. When raising capital your company will be expected to scale your number of customers. If your product requires a complete rewrite because you can't support enough customers or because of reliability issues, then you’ll likely be passed for investment. These problems create risks like",{"type":28,"tag":116,"props":229,"children":230},{},[231,236,241],{"type":28,"tag":120,"props":232,"children":233},{},[234],{"type":34,"value":235},"Having a competitor come and scoop up your customers because of a superior product.",{"type":28,"tag":120,"props":237,"children":238},{},[239],{"type":34,"value":240},"Customers litigating because you have legal or fiduciary responsibilities.",{"type":28,"tag":120,"props":242,"children":243},{},[244],{"type":34,"value":245},"Dealing with reputational issues which will likely hamper future growth.",{"type":28,"tag":37,"props":247,"children":248},{},[249],{"type":34,"value":250},"These risks are substantial deterrents for investors and will likely lead them to pass up investing in your startup. I've spoken with investors who have declined investing in companies because technical due diligence failing. This was even the case when the company passed every other metric used during diligence with flying colors. This was undoubtedly disappointing for the founders, but could have been avoided with more focus on their underlying technology.",{"type":28,"tag":37,"props":252,"children":253},{},[254],{"type":34,"value":255},"The one counterexample to this is when you're building a product prototype while identifying product-market fit. This exception is short-lived, and any startup should transition out as quickly as possible. You may have heard stories of founders successfully exiting with a product built using some no-code tool (like Bubble), but you should ensure such a tech decision is viable within your market. Also, you should have a plan for migrating off of such a platform so you can take control of your own tech.",{"type":28,"tag":196,"props":257,"children":259},{"id":258},"security-vulnerabilities-and-critical-bugs",[260],{"type":34,"value":261},"Security vulnerabilities and critical bugs",{"type":28,"tag":37,"props":263,"children":264},{},[265],{"type":34,"value":266},"Security issues were another prevalent red flag highlighted by survey participants. Many shared experiences of startups being rejected because of security concerns. This is a significant red flag for any company offering cybersecurity software, managing PII or financial data, or handling financial transactions. We've heard of companies trying to raise money that had bugs in their custom trading system that accidentally reversed positions for trades. Imagine shorting a stock and then having your position reversed by the trading platform to a put!",{"type":28,"tag":37,"props":268,"children":269},{},[270],{"type":34,"value":271},"Another story involved a cybersecurity company seeking funding. During due diligence, an analyst found numerous security vulnerabilities in their platform and managed to bypass their authentication into the admin dashboard. There the analyst left messages behind for the founders, leading to an embarrassing rejection from the VC.",{"type":28,"tag":184,"props":273,"children":275},{"id":274},"vc-expectations-at-pre-seed-and-seed-rounds",[276],{"type":34,"value":277},"VC expectations at pre-seed and seed rounds",{"type":28,"tag":279,"props":280,"children":284},"quote",{":titles":281,"image":282,"name":283},"{\"titles\":[{\"title\": \"VC Investor\", \"link\": \"https://www.linkedin.com/in/frederic-gray-iv-637bba11\"}]}","/img/white-papers/frederic-headshot.png","Frederic Gray",[285],{"type":28,"tag":37,"props":286,"children":287},{},[288],{"type":34,"value":289},"Expectations for software quality are stage-specific. Earlier products should be simplistic, to learn customer needs, to drive future product iterations. Later products, Series A onwards, are held to a higher standard. That said, all these expectations are vertical-specific.",{"type":28,"tag":196,"props":291,"children":293},{"id":292},"feedback-from-non-technical-investors",[294],{"type":34,"value":295},"Feedback from non-technical investors",{"type":28,"tag":37,"props":297,"children":298},{},[299],{"type":34,"value":300},"In our discussions with investors, we found a range of responses regarding software quality in early-stage products at the pre-seed and seed stages of investment. The more non-technical investors we surveyed primarily focus their due diligence on",{"type":28,"tag":116,"props":302,"children":303},{},[304,309],{"type":28,"tag":120,"props":305,"children":306},{},[307],{"type":34,"value":308},"Market potential.",{"type":28,"tag":120,"props":310,"children":311},{},[312],{"type":34,"value":313},"KPIs such as churn rate, CAC, MRR, etc.",{"type":28,"tag":37,"props":315,"children":316},{},[317],{"type":34,"value":318},"at these rounds. The main exceptions were deep tech products, products responsible for PII, or products with legal responsibilities. In these cases they would rely on tech consultants as part of their due diligence. Also, products in verticals requiring higher product quality faced additional scrutiny. In all these scenarios the bar is significantly higher, and founders should plan accordingly before seeking investments. In these cases investing in software quality is a major green flag for investors.",{"type":28,"tag":196,"props":320,"children":322},{"id":321},"feedback-from-technical-investors",[323],{"type":34,"value":324},"Feedback from technical investors",{"type":28,"tag":37,"props":326,"children":327},{},[328],{"type":34,"value":329},"For technical investors, we received a range of answers. Many expected higher quality products and were more likely to dive deeper into the underlying tech used. Some green flags mentioned were",{"type":28,"tag":116,"props":331,"children":332},{},[333,338,343,348,353],{"type":28,"tag":120,"props":334,"children":335},{},[336],{"type":34,"value":337},"Excellent architectural decisions for the software.",{"type":28,"tag":120,"props":339,"children":340},{},[341],{"type":34,"value":342},"A solid implementation roadmap, even if all features weren't yet available.",{"type":28,"tag":120,"props":344,"children":345},{},[346],{"type":34,"value":347},"Adherence to best practices for software development, such as using agile management or Scrum.",{"type":28,"tag":120,"props":349,"children":350},{},[351],{"type":34,"value":352},"A solid foundation for scaling the product.",{"type":28,"tag":120,"props":354,"children":355},{},[356],{"type":34,"value":357},"High-quality API design and solid developer documentation.",{"type":28,"tag":37,"props":359,"children":360},{},[361],{"type":34,"value":362},"The only reservations mentioned were founders who overengineered their product before fundraising. This could mean prematurely scaling a product without validating product-market fit, writing excessive tests for features that don't need them, and creating an inflexible infrastructure that doesn’t accomidate product changes. If you're in the early stages product development, there are many pitfalls for over-engineering. However, if product-market fit has been validated, then excellent software quality is highly rewarded.",{"type":28,"tag":37,"props":364,"children":365},{},[366,368,373],{"type":34,"value":367},"One notable example of this is Stripe ",{"type":28,"tag":52,"props":369,"children":370},{"href":73},[371],{"type":34,"value":372},"Stripe",{"type":34,"value":374},". When the company launched its first product, they were late to market with several competing payment platforms boasting large user bases. The key to Stripe's success was its excellent API design and high-quality infrastructure. Their product quality enabled them to secure funding successfully and continue to be an extremely successful company today.",{"type":28,"tag":184,"props":376,"children":378},{"id":377},"vc-expectations-at-series-a-and-beyond",[379],{"type":34,"value":380},"VC expectations at Series A and beyond",{"type":28,"tag":37,"props":382,"children":383},{},[384],{"type":34,"value":385},"Our surveys generally indicated that post-Series A, the bar for software quality significantly rises. At this stage you should be following best practices for software quality in your development process. This includes:",{"type":28,"tag":116,"props":387,"children":388},{},[389,394,399,404,409,414],{"type":28,"tag":120,"props":390,"children":391},{},[392],{"type":34,"value":393},"Automated testing for core features and workflows.",{"type":28,"tag":120,"props":395,"children":396},{},[397],{"type":34,"value":398},"Best practices for testing new features and using regression testing to prevent recurring bugs.",{"type":28,"tag":120,"props":400,"children":401},{},[402],{"type":34,"value":403},"Following standard development methodologies such as agile, Scrum, etc.",{"type":28,"tag":120,"props":405,"children":406},{},[407],{"type":34,"value":408},"Having testing infrastructure in place along with Continuous Integration (CI) and Continuous Deployment (CD).",{"type":28,"tag":120,"props":410,"children":411},{},[412],{"type":34,"value":413},"Documenting software architecture, main technical decisions, and any other relevant material.",{"type":28,"tag":120,"props":415,"children":416},{},[417],{"type":34,"value":418},"Regular customer interaction to find pain points and other issues.",{"type":28,"tag":37,"props":420,"children":421},{},[422],{"type":34,"value":423},"At this stage, investors will substantially increase their scrutiny for any future series of investments. There is significantly less tolerance for failure, and investors will be looking for robust infrastructure in place.",{"type":28,"tag":29,"props":425,"children":427},{"id":426},"where-non-technical-founders-fall-short",[428],{"type":34,"value":429},"Where non-technical founders fall short",{"type":28,"tag":37,"props":431,"children":432},{},[433],{"type":34,"value":434},"The primary challenge non-technical founders face is exactly what's in their name: their lack of technical skills. If you, a non-technical founder, spend time learning about the core technical problems your startup faces in the future, investors will likely see this as a green flag. We've had investors tell us many non-technical founders value their ideas but don't understand the complexities of software, and hence cannot value the underlying technology. Some of these technical complexities include:",{"type":28,"tag":116,"props":436,"children":437},{},[438,443,448,453],{"type":28,"tag":120,"props":439,"children":440},{},[441],{"type":34,"value":442},"Understanding how scalability impacts future growth.",{"type":28,"tag":120,"props":444,"children":445},{},[446],{"type":34,"value":447},"Learning about the limitations of no-code platforms and how they are primarly for prototypes.",{"type":28,"tag":120,"props":449,"children":450},{},[451],{"type":34,"value":452},"Educating yourself about the software development life cycle (SDLC).",{"type":28,"tag":120,"props":454,"children":455},{},[456],{"type":34,"value":457},"Understanding what software QA encompasses and how it looks in successful startups.",{"type":28,"tag":37,"props":459,"children":460},{},[461],{"type":34,"value":462},"You should ideally be prepared with a host of questions so you can build a bridge with your future technical co-founder. Without this bridge, you will be flying blind, creating unwanted risks for investors. It is paramount to have someone technical on your team as soon as possible; most VCs we've spoken with will refuse to invest in teams lacking this expertise.",{"type":28,"tag":184,"props":464,"children":466},{"id":465},"enhance-your-product-with-qacomet",[467],{"type":34,"value":468},"Enhance your product with QAComet",{"type":28,"tag":37,"props":470,"children":471},{},[472],{"type":34,"value":473},"QAComet offers a wide variety of services to help you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:",{"type":28,"tag":116,"props":475,"children":476},{},[477,482,487,492,497,502],{"type":28,"tag":120,"props":478,"children":479},{},[480],{"type":34,"value":481},"Identifying and resolving usability issues.",{"type":28,"tag":120,"props":483,"children":484},{},[485],{"type":34,"value":486},"Resolve usability problems in your no-code proptype.",{"type":28,"tag":120,"props":488,"children":489},{},[490],{"type":34,"value":491},"Understanding technical content, providing support, and answering questions.",{"type":28,"tag":120,"props":493,"children":494},{},[495],{"type":34,"value":496},"Conducting customer interviews for identifying customer pain points.",{"type":28,"tag":120,"props":498,"children":499},{},[500],{"type":34,"value":501},"Establishing development workflows following Agile methodology.",{"type":28,"tag":120,"props":503,"children":504},{},[505],{"type":34,"value":506},"Build a core testing suite when your business is ready for this acceleration.",{"type":28,"tag":37,"props":508,"children":509},{},[510,512,519],{"type":34,"value":511},"You can ",{"type":28,"tag":52,"props":513,"children":516},{"href":514,"rel":515},"https://calendly.com/d/4nz-jp2-r35/initial-consultation-call",[56],[517],{"type":34,"value":518},"schedule a free call today",{"type":34,"value":520}," for a free 15-minute consultation to discuss your product's QA. We also offer a $50 two-week trial for early customers; ask us about it during our free consultation.",{"type":28,"tag":29,"props":522,"children":524},{"id":523},"challenges-for-technical-founders",[525],{"type":34,"value":526},"Challenges for technical founders",{"type":28,"tag":37,"props":528,"children":529},{},[530],{"type":34,"value":531},"Our VC survey participants noted some common issues technical founders face when developing their products. These include:",{"type":28,"tag":116,"props":533,"children":534},{},[535,540,545,550],{"type":28,"tag":120,"props":536,"children":537},{},[538],{"type":34,"value":539},"Overbuilding and creating overengineered solutions.",{"type":28,"tag":120,"props":541,"children":542},{},[543],{"type":34,"value":544},"Failing to identify the most crucial features and leaving the rest as part of the product roadmap.",{"type":28,"tag":120,"props":546,"children":547},{},[548],{"type":34,"value":549},"Not engaging with customers and identifying their problems.",{"type":28,"tag":120,"props":551,"children":552},{},[553],{"type":34,"value":554},"Not finding product-market fit quickly enough.",{"type":28,"tag":37,"props":556,"children":557},{},[558],{"type":34,"value":559},"Each of these points requires a distinct mindset typically found among technical founders and can largely be fixed by communicating with customers within your market. Our survey revealed that it's more important to have solid implementations with partial feature support than to rattle off poorly implemented features.",{"type":28,"tag":184,"props":561,"children":563},{"id":562},"how-qacomet-helps-your-journey",[564],{"type":34,"value":565},"How QAComet helps your journey",{"type":28,"tag":37,"props":567,"children":568},{},[569],{"type":34,"value":570},"QAComet offers a wide variety of services, helping you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:",{"type":28,"tag":116,"props":572,"children":573},{},[574,579,584,589,594,599],{"type":28,"tag":120,"props":575,"children":576},{},[577],{"type":34,"value":578},"Identifying usability issues and potential pain points.",{"type":28,"tag":120,"props":580,"children":581},{},[582],{"type":34,"value":583},"Conducting customer interviews and pinpointing their problems and feature requirements.",{"type":28,"tag":120,"props":585,"children":586},{},[587],{"type":34,"value":588},"Documenting core technical aspects, architectural decisions, and workflows.",{"type":28,"tag":120,"props":590,"children":591},{},[592],{"type":34,"value":593},"Writing E2E, integration and unit tests.",{"type":28,"tag":120,"props":595,"children":596},{},[597],{"type":34,"value":598},"Integrating automated tests with CI and building out CI pipelines.",{"type":28,"tag":120,"props":600,"children":601},{},[602],{"type":34,"value":603},"Establishing your QA strategy as part of your Agile SDLC.",{"type":28,"tag":37,"props":605,"children":606},{},[607,608,613],{"type":34,"value":511},{"type":28,"tag":52,"props":609,"children":611},{"href":514,"rel":610},[56],[612],{"type":34,"value":518},{"type":34,"value":614}," for a free 15-minute consultation to talk about your product's QA. In addition, we offer a $50 two-week trial for early customers; ask us about it during our free consultation.",{"type":28,"tag":29,"props":616,"children":618},{"id":617},"take-your-startup-to-the-next-level",[619],{"type":34,"value":620},"Take your startup to the next level",{"type":28,"tag":279,"props":622,"children":626},{":titles":623,"image":624,"name":625},"{\"titles\":[{\"title\": \"VC Partner\", \"link\": \"https://www.thinkklabs.com/\"}, {\"title\":\"4x Founder\", \"link\": \"https://www.linkedin.com/in/yianni-kellis/\"}]}","/img/white-papers/yianni-headshot.png","Yianni Kellis",[627],{"type":28,"tag":37,"props":628,"children":629},{},[630],{"type":34,"value":631},"Startups that have a clear emphasis on quality software development and thorough QA processes often secure funding more smoothly. These companies don't necessarily need large in-house QA teams but must demonstrate a strategic approach to maintaining software quality, possibly through fractional QA services.",{"type":28,"tag":37,"props":633,"children":634},{},[635],{"type":34,"value":636},"The key takeaway from our survey is that expectations for product quality are here to stay. In our current startup environment, VCs expects more from founders due to the increase in quality tooling and heightened market expectations for usable products. It's paramount for both technical and non-technical founders to learn from their customers, build a solid user experience, and make sure their product meets customer expectations. Today, we live with higher expectations from customers and VCs alike, and startups must adapt to this evolving market.",{"type":28,"tag":29,"props":638,"children":640},{"id":639},"references",[641],{"type":34,"value":642},"References",{"type":28,"tag":116,"props":644,"children":645},{},[646,660,674,688,702,716],{"type":28,"tag":120,"props":647,"children":648},{},[649,651,658],{"type":34,"value":650},"[CNET] ",{"type":28,"tag":52,"props":652,"children":655},{"href":653,"rel":654},"https://www.cnet.com/tech/mobile/zuckerberg-move-fast-and-break-things-isnt-how-we-operate-anymore/",[56],[656],{"type":34,"value":657},"Zuckerberg: 'Move fast and break things' isn't how Facebook operates anymore",{"type":34,"value":659},". CNET.com.",{"type":28,"tag":120,"props":661,"children":662},{},[663,665,672],{"type":34,"value":664},"[HBR] ",{"type":28,"tag":52,"props":666,"children":669},{"href":667,"rel":668},"https://hbr.org/2019/01/the-era-of-move-fast-and-break-things-is-over",[56],[670],{"type":34,"value":671},"The Era of “Move Fast and Break Things” Is Over",{"type":34,"value":673},". Harvard Business Review.",{"type":28,"tag":120,"props":675,"children":676},{},[677,679,686],{"type":34,"value":678},"[Notion] ",{"type":28,"tag":52,"props":680,"children":683},{"href":681,"rel":682},"https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/",[56],[684],{"type":34,"value":685},"Design on a deadline: How Notion pulled itself back from the brink of failure",{"type":34,"value":687},". Figma Blog.",{"type":28,"tag":120,"props":689,"children":690},{},[691,693,700],{"type":34,"value":692},"[Statista] ",{"type":28,"tag":52,"props":694,"children":697},{"href":695,"rel":696},"https://www.statista.com/statistics/277501/venture-capital-amount-invested-in-the-united-states-since-1995/",[56],[698],{"type":34,"value":699},"Value of venture capital investment in the United States from 2006 to 2022",{"type":34,"value":701},". Statista.com.",{"type":28,"tag":120,"props":703,"children":704},{},[705,707,714],{"type":34,"value":706},"[Stripe] ",{"type":28,"tag":52,"props":708,"children":711},{"href":709,"rel":710},"https://www.inc.com/jason-aten/the-5-simple-reasons-stripe-became-most-valuable-startup-ever.html",[56],[712],{"type":34,"value":713},"The 5 Simple Reasons Stripe Became the Most Valuable Startup Ever",{"type":34,"value":715},". Inc.",{"type":28,"tag":120,"props":717,"children":718},{},[719,721,728],{"type":34,"value":720},"[Techcrunch] ",{"type":28,"tag":52,"props":722,"children":725},{"href":723,"rel":724},"https://techcrunch.com/2024/01/10/venture-capital-2023-analysis/",[56],[726],{"type":34,"value":727},"Explained in 5 charts: Venture capital in 2023",{"type":34,"value":729},". Techcrunch.",{"type":28,"tag":184,"props":731,"children":733},{"id":732},"additional-resources",[734],{"type":34,"value":735},"Additional Resources",{"type":28,"tag":116,"props":737,"children":738},{},[739,749,759],{"type":28,"tag":120,"props":740,"children":741},{},[742],{"type":28,"tag":52,"props":743,"children":746},{"href":744,"rel":745},"https://books.google.com/books?id=XLxUBQAAQBAJ",[56],[747],{"type":34,"value":748},"Learning Agile: Understanding Scrum, XP, Lean, and Kanban",{"type":28,"tag":120,"props":750,"children":751},{},[752],{"type":28,"tag":52,"props":753,"children":756},{"href":754,"rel":755},"https://www.amazon.com/Agile-Testing-Practical-Guide-Testers/dp/0321534468/",[56],[757],{"type":34,"value":758},"Agile Testing: A Practical Guide for Testers and Agile Teams",{"type":28,"tag":120,"props":760,"children":761},{},[762],{"type":28,"tag":52,"props":763,"children":766},{"href":764,"rel":765},"https://www.scrum.org/resources/blog/yds-where-does-quality-assurance-qa-fit-scrum-team",[56],[767],{"type":34,"value":768},"YDS: Where Does Quality Assurance (QA) Fit on a Scrum Team?",{"title":7,"searchDepth":770,"depth":770,"links":771},2,[772,773,774,780,783,786,787],{"id":31,"depth":770,"text":35},{"id":62,"depth":770,"text":65},{"id":106,"depth":770,"text":109,"children":775},[776,778,779],{"id":186,"depth":777,"text":189},3,{"id":274,"depth":777,"text":277},{"id":377,"depth":777,"text":380},{"id":426,"depth":770,"text":429,"children":781},[782],{"id":465,"depth":777,"text":468},{"id":523,"depth":770,"text":526,"children":784},[785],{"id":562,"depth":777,"text":565},{"id":617,"depth":770,"text":620},{"id":639,"depth":770,"text":642,"children":788},[789],{"id":732,"depth":777,"text":735},"markdown","content:white-papers:how-qa-factors-into-vc-due-diligence.md","content","white-papers/how-qa-factors-into-vc-due-diligence.md","md",1717143083303] \ No newline at end of file diff --git a/white-papers/how-qa-factors-into-vc-due-diligence/index.html b/white-papers/how-qa-factors-into-vc-due-diligence/index.html new file mode 100644 index 0000000..2f99096 --- /dev/null +++ b/white-papers/how-qa-factors-into-vc-due-diligence/index.html @@ -0,0 +1,59 @@ + + +QAComet | How importing from Playwright works + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Introduction

In a recent market research survey we explored how venture capitalists (VCs) consider software quality in their investment decisions. We delved into their expectations for software quality at various investment stages and the standards for different products or verticals. The survey revealed that due to rising interest rates and increased consumer expectations for quality products, the investment landscape has become more stringent.

I think there's less room for error overall in all aspects of raising capital. Today, there's a clear flight to quality at all levels, starting with capital being deployed to VC funds. With today's higher interest rates, there's significantly less capital going forward. — Frederico Santos, VC Investor

Evolution of the startup investment landscape

When you think of building a SaaS product, one of the most commonly quoted methodologies for managing product development is to "Build fast and break things" HBR. But, this old wisdom applied to the early days of Facebook, from 2007 up to 2014 CNET, may not be the best managerial choice while building up your product.

Today, we live in a high-interest environment where capital is much more cautious than in the years before us. In addition, we've collectively seen nearly $1.5T in investments in the past ten years Statista. This translates into a vast trove of well-made SaaS products and established brands.

With this diversity of products, we live in a world where users are fluent in multiple software products. And with that, they now have higher expectations for what a functional software product looks like today. This can be true even in the early stages of startup products, at pre-seed or seed stages, depending on your product and team. As your startup matures, passing through Series A onwards, the expectations for quality only increase.

How does Software Quality Affect Investment Decisions?

Our survey identified many types of startups that would significantly benefit from additional software QA. Investors use various questions to assess software quality requirements, such as:

  • How technical of a product is it/is the product deep tech?
  • Is this an infrastructure product?
  • Is the product expected to integrate with multiple other tools?
  • Does the product function as middleware between other sets of tools?
  • How tolerant are customers of product failure?
  • Are the customers technically savvy?
  • Is the product responsible for Personally Identifiable Information (PII)?
  • What kind of regulatory environment does the product live in?
  • Are there any legal or financial risks if the product fails or behaves erratically?

Ultimately, they are probing one fundamental question during due diligence:

What are the risks when the product fails?

This is crucial because VCs are performing risk analysis on future software products while also assessing their market potential. If a product could be responsible for breaking a supply chain, crashing other software products due to downtime, enable fraud with stolen PII, pose security risks, or deterring non-technical users away from their product, this product will face extra scrutiny during due diligence.

Common red flags during VC’s due diligence

Our survey found several common red flags VCs look for during their due diligence process. These included not having a technical member on the founding team, usability and reliability issues, having a product that cannot scale with its current tech, and having a product with security vulnerabilities or other critical bugs. These red flags are particularly concerning for VCs if the product is deep tech or carries significant liabilities. Addressing these risks is vital for securing your next round of funding.

Usability issues­

Usability problems were frequently mentioned red flags in our survey. Investors mentioned how clunky interfaces or poorly designed workflows often deterred them from investing in companies. Ensuring your software is user-friendly and intuitive is crucial to improving your investment prospects in this highly competitive environment.

Have you considered how often users may be multitasking while using your software? This is essential for many products because there's a good chance a non-technical person will be using your product. I can't tell you the number of times I've been in a doctor's office, bank, financial aid office, etc. where someone I speak with is using some kind of software while talking to me. If a simple mistake could create catastrophe for some customer, you need to invest time and effort into polishing your product's workflow.

Furthermore, you may be developing a product for non-technical users. These are people who would not be using your software unless it saved them a considerable amount of time. How patient do you think Joe the plumber will be when his dispatching software has awkward controls? This is true in several industries where users are much less tolerant of software problems.

Architectural missteps and scaling challenges

Another red flag commonly mentioned by VCs were scaling issues. When raising capital your company will be expected to scale your number of customers. If your product requires a complete rewrite because you can't support enough customers or because of reliability issues, then you’ll likely be passed for investment. These problems create risks like

  • Having a competitor come and scoop up your customers because of a superior product.
  • Customers litigating because you have legal or fiduciary responsibilities.
  • Dealing with reputational issues which will likely hamper future growth.

These risks are substantial deterrents for investors and will likely lead them to pass up investing in your startup. I've spoken with investors who have declined investing in companies because technical due diligence failing. This was even the case when the company passed every other metric used during diligence with flying colors. This was undoubtedly disappointing for the founders, but could have been avoided with more focus on their underlying technology.

The one counterexample to this is when you're building a product prototype while identifying product-market fit. This exception is short-lived, and any startup should transition out as quickly as possible. You may have heard stories of founders successfully exiting with a product built using some no-code tool (like Bubble), but you should ensure such a tech decision is viable within your market. Also, you should have a plan for migrating off of such a platform so you can take control of your own tech.

Security vulnerabilities and critical bugs

Security issues were another prevalent red flag highlighted by survey participants. Many shared experiences of startups being rejected because of security concerns. This is a significant red flag for any company offering cybersecurity software, managing PII or financial data, or handling financial transactions. We've heard of companies trying to raise money that had bugs in their custom trading system that accidentally reversed positions for trades. Imagine shorting a stock and then having your position reversed by the trading platform to a put!

Another story involved a cybersecurity company seeking funding. During due diligence, an analyst found numerous security vulnerabilities in their platform and managed to bypass their authentication into the admin dashboard. There the analyst left messages behind for the founders, leading to an embarrassing rejection from the VC.

VC expectations at pre-seed and seed rounds

Frederic GrayVC Investor

Expectations for software quality are stage-specific. Earlier products should be simplistic, to learn customer needs, to drive future product iterations. Later products, Series A onwards, are held to a higher standard. That said, all these expectations are vertical-specific.

Feedback from non-technical investors

In our discussions with investors, we found a range of responses regarding software quality in early-stage products at the pre-seed and seed stages of investment. The more non-technical investors we surveyed primarily focus their due diligence on

  • Market potential.
  • KPIs such as churn rate, CAC, MRR, etc.

at these rounds. The main exceptions were deep tech products, products responsible for PII, or products with legal responsibilities. In these cases they would rely on tech consultants as part of their due diligence. Also, products in verticals requiring higher product quality faced additional scrutiny. In all these scenarios the bar is significantly higher, and founders should plan accordingly before seeking investments. In these cases investing in software quality is a major green flag for investors.

Feedback from technical investors

For technical investors, we received a range of answers. Many expected higher quality products and were more likely to dive deeper into the underlying tech used. Some green flags mentioned were

  • Excellent architectural decisions for the software.
  • A solid implementation roadmap, even if all features weren't yet available.
  • Adherence to best practices for software development, such as using agile management or Scrum.
  • A solid foundation for scaling the product.
  • High-quality API design and solid developer documentation.

The only reservations mentioned were founders who overengineered their product before fundraising. This could mean prematurely scaling a product without validating product-market fit, writing excessive tests for features that don't need them, and creating an inflexible infrastructure that doesn’t accomidate product changes. If you're in the early stages product development, there are many pitfalls for over-engineering. However, if product-market fit has been validated, then excellent software quality is highly rewarded.

One notable example of this is Stripe Stripe. When the company launched its first product, they were late to market with several competing payment platforms boasting large user bases. The key to Stripe's success was its excellent API design and high-quality infrastructure. Their product quality enabled them to secure funding successfully and continue to be an extremely successful company today.

VC expectations at Series A and beyond

Our surveys generally indicated that post-Series A, the bar for software quality significantly rises. At this stage you should be following best practices for software quality in your development process. This includes:

  • Automated testing for core features and workflows.
  • Best practices for testing new features and using regression testing to prevent recurring bugs.
  • Following standard development methodologies such as agile, Scrum, etc.
  • Having testing infrastructure in place along with Continuous Integration (CI) and Continuous Deployment (CD).
  • Documenting software architecture, main technical decisions, and any other relevant material.
  • Regular customer interaction to find pain points and other issues.

At this stage, investors will substantially increase their scrutiny for any future series of investments. There is significantly less tolerance for failure, and investors will be looking for robust infrastructure in place.

Where non-technical founders fall short

The primary challenge non-technical founders face is exactly what's in their name: their lack of technical skills. If you, a non-technical founder, spend time learning about the core technical problems your startup faces in the future, investors will likely see this as a green flag. We've had investors tell us many non-technical founders value their ideas but don't understand the complexities of software, and hence cannot value the underlying technology. Some of these technical complexities include:

  • Understanding how scalability impacts future growth.
  • Learning about the limitations of no-code platforms and how they are primarly for prototypes.
  • Educating yourself about the software development life cycle (SDLC).
  • Understanding what software QA encompasses and how it looks in successful startups.

You should ideally be prepared with a host of questions so you can build a bridge with your future technical co-founder. Without this bridge, you will be flying blind, creating unwanted risks for investors. It is paramount to have someone technical on your team as soon as possible; most VCs we've spoken with will refuse to invest in teams lacking this expertise.

Enhance your product with QAComet

QAComet offers a wide variety of services to help you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:

  • Identifying and resolving usability issues.
  • Resolve usability problems in your no-code proptype.
  • Understanding technical content, providing support, and answering questions.
  • Conducting customer interviews for identifying customer pain points.
  • Establishing development workflows following Agile methodology.
  • Build a core testing suite when your business is ready for this acceleration.

You can schedule a free call today for a free 15-minute consultation to discuss your product's QA. We also offer a $50 two-week trial for early customers; ask us about it during our free consultation.

Challenges for technical founders

Our VC survey participants noted some common issues technical founders face when developing their products. These include:

  • Overbuilding and creating overengineered solutions.
  • Failing to identify the most crucial features and leaving the rest as part of the product roadmap.
  • Not engaging with customers and identifying their problems.
  • Not finding product-market fit quickly enough.

Each of these points requires a distinct mindset typically found among technical founders and can largely be fixed by communicating with customers within your market. Our survey revealed that it's more important to have solid implementations with partial feature support than to rattle off poorly implemented features.

How QAComet helps your journey

QAComet offers a wide variety of services, helping you develop your product in line with your current investment round. With our fractional QA service, we can assist you in:

  • Identifying usability issues and potential pain points.
  • Conducting customer interviews and pinpointing their problems and feature requirements.
  • Documenting core technical aspects, architectural decisions, and workflows.
  • Writing E2E, integration and unit tests.
  • Integrating automated tests with CI and building out CI pipelines.
  • Establishing your QA strategy as part of your Agile SDLC.

You can schedule a free call today for a free 15-minute consultation to talk about your product's QA. In addition, we offer a $50 two-week trial for early customers; ask us about it during our free consultation.

Take your startup to the next level

Startups that have a clear emphasis on quality software development and thorough QA processes often secure funding more smoothly. These companies don't necessarily need large in-house QA teams but must demonstrate a strategic approach to maintaining software quality, possibly through fractional QA services.

The key takeaway from our survey is that expectations for product quality are here to stay. In our current startup environment, VCs expects more from founders due to the increase in quality tooling and heightened market expectations for usable products. It's paramount for both technical and non-technical founders to learn from their customers, build a solid user experience, and make sure their product meets customer expectations. Today, we live with higher expectations from customers and VCs alike, and startups must adapt to this evolving market.

References

Additional Resources

+ \ No newline at end of file diff --git a/white-papers/index.html b/white-papers/index.html new file mode 100644 index 0000000..bc618bb --- /dev/null +++ b/white-papers/index.html @@ -0,0 +1,43 @@ + + +QAComet | White Papers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

QAComet White Papers

Stay up to date with QA's impact on the startup world with our latest research.

May
30
2024

How Software QA Factors Into VC Investment Decisions

With high interest rates and maturing SaaS markets, learn what is expected from founders at pre-seed to Series A stages of fundraising. With effective QA your product will impress customers and attract VC. Continue Reading

+ \ No newline at end of file

lR)v>1$!Zpx#u=yCL}7)Gi9>azImzSvtZUeRPC-By$5 z5puV0_INuc#DTkLDK@LG5*UA}ING0IKVQ|QvM%J)rd~Oa@;;eup5tv(9gd|w%}!N; zbRFa87HR~DU6$bW#>WJBfqZ)ECLXxJn3?=BD7d(h;ECN~!ODugMi>czfSei>%ghXD zNG$?U(q~L+#ac9DK~foe3H=0D<>ITWmDDsib~r2Ja7Nq(t3)R~A@E6u<+aEOJOzi4 z`li@NLsptvkBOZK4yuT<9XE9NEN;l0Nbk50+)Dn)BZ2u2A1Sw<0vPQ_L>QxlYG|gc zw>^q9@>&FVL_&b}BsFu!>h>a38&84(NCabFDSB+?d!W-a`5BiGKTe?8+#^Z`!h9xzp5XPz>R?QHS<{7yU(dVJv$ zR-|Guk+A!FrB}G46d`g#_S&llVs&X`0ViF(wbMXbXjd~EG3tv=!FG3t>CX#;Bq>eZ zPybLq1RCJbI$lvx;}O(d%Mv~%4|#m2t6oR1TIhb} zHnfdUhD-5Q4Q0{l;#eJ61&S49?UR=jQ(N3Lv0n^~hfjw7A;L~cqgVUI^U0 z4XlAs?8DlY@k~tdH2n>7Y86fa%}L(U{2R{`yJ3{C=wMB!SXVXpSlNJcW-mxx11)c1 zg_YLSllp9|UfDZ;1lHU>cSFG<<)L7Xfe5$E+8-3cDb{!03-^q{FxWeVG_FpjXQ+O^ z+;9iYU}T*gT%!W1ix5o&|6-oJrRp#oDiXlMOj(>x>r4>AnL2Uf$hzwQ*fv-bFh3C8 zUcj-Qcif?*^qQ_O)d%ETT%u}EV)xmiuR4TGz&0eCs1NRNBH;6gS?A1@Jngg%}_ z+O6=;Da-ad6bG7kdj7ilVr~7Zo%wKbLFqKtAo}`c;z>9@ zZhN&Q^u~hsKjP`XK=NOBnt_#_?caEsk&gYp;b}&Cy8i{9PEcEm+#5vjTvEPf@3w1w z9kk-b$Cp)L;e$5l0NN)Q?ptnSVW}az(E%dz&T4h2OOunI?d=|iT}djHZ;}@(!)@Ji zmJVvF()MzDxiNQsw_5#JERlK;3z`&KQb%vq$$8Rpw$5_)eiL|VO|w;8soVO+{dM&# zE9>+1_AY5DsY?6vqt*TOc?+*|w(coQ`x}<8Md&+oNw&e^WN<^bDkD5QAnAj(MvcvQ zuzx;1-d#So+jqh>Z{EBfNpH-pIApgTWj(H@uQ zGYSTvD^>-mh*$LTuO1>n;^CeZc1$d?m8Nu=z=)c6+2`awze)Gz`f8Co+FMFmlBTuJ zs+GeRYXBBj=L?83@|lp$xONC*4MKP%-v+FL8r>oC2*5H*w(Y^tnSahq%uG-=MxF@Q zIf1~j6;6n($8==LQ*xL4F))Azrhzz5Osf+$gqKj5g!;6t|1OZmoi5UM^(^BDmIIzG z3hb&k+3sTG4=o-+4$1S!StV-I77M!rA~LFRNqKvI2_KdmI~p7pI%IlLOOg&E8hG8m zvC-`i#;V?gw+fVP$M%LE-^bYiS;X%-;}}thhff+JEajdIVJ2?a#Q_vE+zN2uZ9>yx zoQ1`2NM)-#u)RO-OzfjOFkL1eP6U1L<5GBxu&ax%e)F^5IZZ`D*l) zv5Cz9c=J%?Y7Fs-LgE;i$ozL{=9TbAhD@iru^so&Hg}s9%Vv#ZODq~EX9Zy|IlJL* zTdr)Q)D6!m_FjH;oPc$ciOqDh0IC6C^-n;>IzB;7|Io`q_@RvEA#U7Bw3>0}+t3}r z=5-bgrH4zS{hcWwPL`nr5R#Ap{!`xEC@BK2ch)dAyHv;o&I2}8Y}Ab?V(Abt+HQ0) zSkfNu8*8A{TgLv?p2RyTY#$N!xGcih@Prp5k9QUxwI?smSJb@fr^4!~LSo|nR9tQM z$<9A~tlQSNw0!(Y@q?m$D#Y>8uCXg;^a_{Uby-( zXrNp{B-TL(gLu3s>9QMRN~S0$6U088s8tcK$HB+_HTiW4qss{)JmKueWRL%_VF9I# zdPva-@)VQ*4o-rnB;BTTZP-I8I4my-%fE4FDjA6bMgpV6rAS8RJK=AoNs9;4lCy&J zB7HkLiJ(xp&}C$$Y%W&FYAVi;ilqd*y%=!YeN)seBtb%hpL6o9Fc^7B zp-zNCCLtIMtb;AGc*O5fva4J7Fqk!+fQSVB{R6#Y!<_q@gW*n6B`rZ!2SoYzW?wan zcv81o){~7^3Ht^0b+-?h-8l1L5f>vpcM1!?fmE=YMwIiAr%(!Mt$nU6vSEB7dD<3K zypf^agC(|F`*rGoW>C)p^@LjY!<3uJH4xTNGKWi>dz-EkWCdn zPk7ZCnLOSfa*QOna8#{*mI0 z!#1KvV_L%(WxN`%Vzf+IBozJLV*U{xSBW27LGP_?qY(fbPEE2_a-cnuFfa@xk}yL* zwlY2=kwtz!^sPUu);{y~h5?P3Im80WyH|dwQF$)hU!M)9M65A)7Dj&GKd529$s%Sb zby%SlSH~brOX@%EmWaHHnuh2|`%w?ndX0DHW5k1Zie7*EbuNu*uF1pfm2QgZ(?#W*XtjK8%^5>-QZl`gZ9}n0g<@9hdi6vxQuroS2ck_ z3%`MK=e&xnfO7j~WClo_xadObo)k3HhwKWJyzElNv$mGD7H z>y7WI=g~lz8|Ez*HzP(X-cjgn`x$2|ilB(Ebi4&*?%tT4*Q!U3-TSCVu5lx>LCiId z*HA~2j(ZT*Dr%X`TQNylpZ<|d%@^Mm-#`9b%Z$NjagL#tbCG;nsjfg8(bwT5$T|{m zZ0SLO26whW)sgG$skJkK6ypy2TggoHox0!@)`D3!9V@}wl+XUFh0TQuN1bR$={VVl z57_}9nec|3!>H{`Bjf40eit;MEExLZEJIviU&T#jJdwe8Y)Eo^o#-yHmgEipD>MJ< z_a=Jj>GI(y>&=E$;Ecl-4>ZHt#Pw-Aq9cFlX@5peHg;+%AO#Y>6TI=*uvp?8MjQ$s zmHhZw_2kgm*T>YvK!klF28I9z6NeEd<#LEJd+fFGJR2*Gp3n8GL zRiwWz8{drDVnA@P-i;P6$u@0F+i0u4)Fx>gij)ETn*8hlzvu`|_8jW}crR~1=+Hj| z5d)CVVKt%lP(y!=BUxeIWJX`#24`u$vVqQ~r=Y+;*b3Edap-{Lw6VPnX*-ubZCph` zK7ZE;EOiI#IP8+5jCzLEwoNI(U<@^fp>G`dEO(GS#o& zrN2%I1YEh1J4tb2uxH1wWPkEW!SgOdk0q<*de|&#zA%Eq%2*686`enLV~|~XUBimv zI%3){;fR{QL&9Ig)F*Tn<%oJQb&93TOPq}HCAd0M@wq)%OZ8UtD*JW9T|)y}Wt-fdi=W$X*O{HmTPQ1~Ap+<)P+ ze?T}UI{LpM+&^N3{uz4o&sU<1EDZk(2zQ|-ZoNN<&^cALz4E7|(yP`75O5Nj42uYK zxBL&bFSfx&WyfS?EI4HN``dh8+Qxn~<7^KYkPrUFeRO%{>*)iEyCT#?Ra@K6%fVey z&`{Fh^@r`#l`wOuVyn4^Lq))}1FG7U9+uPUY+1^GLp4aR9 z{q^ljmULU&)7Q&QK&SiD%}(FYk>(a_(46g)fIzLlbVX?QtYkRMF^g2LtNpv{r>S%E z7Wrno9(NnV`%?h25WTgsiZ!uNN zgbfcGt!#PAqoSc@%`1S9`;VKbBH;&5+d)SWZMQs#Lh}a6wG&||86EsmDawj@fb0y+ zc?`fiZU^w(&}a60t0?U#ctHH(7%SSQZiFuG?T6w?5beeHkFmbFpr9i-Rd4u@C5Jv4 zUr5M_R$cV$Ie4*S$7S<~G~5%c>JF!Uy^6hDayxKnHFB=I*`?E@a+q!ytOCG8v*@#k`Y1w|~9EFJqVe z2a_~E62zlD?kX7kj*!Q)Gt0hcDZT4{TUMd07LyyKkjsTAt(Qd%(|yp8MUh>OBvc{2&ZKQ7Ll01zJJO2G}9KoC74RZccT;mVzmKut)kQSiC%O}<*bP#+7lihuVsB0{LuJaMu; z4%)W|QUw5`#~M0{Jb+OiA+zc~1e1<WEk}J2GsyfM)B|*jD5kjtDZ}st_h4 zAG9zQ4*n*4x+o-rAsS&HQx%`ui7V05P|-v`YcO(`)!aOR2vF?BCvTn}WQzdWEUYXlDg$d#=l)u>S*|~3n^QWjgFGNNLsUH%FMKgFI9VlJfO3&P3ZX#~ zu|_a~cEs2@%|`7}qI_Mr?9Vuv$u*yjQAS_}D&VB^Ldf$LF|bc(!Vc9W+)&Y$=z~90 z>Az2@P>_#FUql&pMcX4d6fznp(x&}@op%>8YXotCdud z{S2!isZ^0I?Hj{h+IH#O()!ThNHVm>bnjV$Qbs5(y~C1q$M{?ncV7^f^ap8(Lp2}z z*ziJ6Zd(+%D*w#p{Uq$U+hysQE5jD8W49E7b_C?=N+jb!#sU*#zwA^1j^SM}AHtFgOT*TOlA5acy-ON;_uY#I$X~1g= zT1;sdbp--vaI=tWa+y)iaQ0KN8wozCkn~#USs-yg>ISxOYj+_6`ReAUaKHWIUD{qO z{~=&jAYBj91?Jblqv6-OdW^1Mks1)$jybu;GtNW0PQ#);iig=tWLR5v%-iff*#-lHBZ8PMGsA?_%Hm|_2TH;U z%^IWY0y$?*_^@Lf!&UvhMu@7xEj}O_mB6#vg<{euZ_cgK=2{ArPv&L}IAxGuP9OMH zb=-RT^28%oVUD`{FQhk`xJb>Ru;%ex%*-u>DK|yZkW*q)td_YKnsb_po3_>E6 zprD`*8l3n;P>aofhA?%#27mdOoKHbv9WecPotL2I>es+5Hy=NAZ6o2zzpfEg;sB?? zz<`itZ#fcf=B5`;1*=0^Yg%$Z!23dwdK>)e5QdS0KpM(8QJ-clP(DvND&NdKnRZbE z#?jFmZ@SjPDmRCT-qGsel=~Y6X$i+$7RxB8+JPg;Er1kQ2T!lq{3Qy&cd!dJ z7D2k*GsCrl6U=M-qx>P+^@2zly!sgOavH>iAZog2=7ANzrEhY7#~ZFrEV|8e@JuR_ zV)1z1jRN%fN^A`LEJsxt%z1(J_I~l6{utzYy1Vpzt%4Qb_YRsN8w}TY`ULyX@zVRB zu-QKV*FUh?H}?8BHe;gy@6**x^#7ab>H?Lu$hG0WUa!Fqrvc7sdRp`1XG0}y2(bk3 z0p7yz>k>v~teh{e^q_~mdrB#4{}!D$iR(rW+c+1`kS{6?t8hE@((G8{>f-Wh{nhEP zhUZ+S&9P9Tb+X*D?=8G`xsR{g2l$K~bLmz&E|(c4s%_N6v%m);oM*5_xh z=N9+6w}*=sj6l=ImC_YwBMWeO>hE)A3dj7n`EV4rXE6CjXA8-G7qY!89;YkVLZXEY zPc`$R37e-mvv&24UupX|-*t54l++EYB%m6lFHem+za!JP5M;iZ-@LX;bd$3?E`v!d zNFP@dFPM@CoxC;8F@06be(z;Js9A1@eemj5FkL8oC*&*0$QJBW2pebP=mtaj^?|#( zh}RbqBZ*pqika_HC{bDkFt7L!qAr>}uWi6FY8=VQ#EoqWE# z3on8#eL&j$;uZN-k$&chR)50X?4f2VSDw9kWB)`jw>5QSlHisE=EFX2N4lW8PCwDQ z9*R zY!E|hNfAquER6uU4uh)40{m`*H;McdG(`JVj&;(AkX+OYj%g$&SK2glhF?jZ7){7B zfaKCfCj_%v9s;T+4v)c9zWP%{7^5M>;su0>o-My8?jTb7I^LMnJ5BUD>2wou*!#4- zCyHwdJadovi%84CX>yf9R?Ui^MQszX^geyTs0ada!9jSANV1&jd!S^Yk{EyEo99lcXS0fKAnk?Olu zG|7%T^uUiis@)i#ipb$K2mukQ0~_-6(%W^Hr_dXzr=4Dx^L>g!%+UBh2Ax9y{?uAUi(LcrIB@GXeUen4C{%+|H(a_1 z#QdCVCWcwmczh^GHDSxAvN$^VAeg@d#s_WD){YC3aM*vc0=IX!7&HPDQu?a{^il#u z&&-nip~mNh;J-)~m9yB@wK22wcWR$W5p6(v2)EEVS@N*31I4H#V=h8|mYD`*oLu1M zBu~r2aR3r*hwUwJkn=-^9{}oC0|dxtNk$fAz}i$Z1BnA6g=MSnRLLu3qZb)XXaXXW z$X*?-W`cmBevG3AveuWV(g`OPnNl6Lt{xh;mGKJ8tQ46u#fHOmTNSr)aUxDH4#i?m zo&0eU_>iwfzjZYCH15%-UhTOSo6pt=r>7004xykhZxEn&9MMZHfC{Hmf)^8wW-`7* zEK+rImTtuWfv*0#eDs??VA>}=d>Fic1xqx6@Af#-+q~DTECPxh!l$G0 z8U6uNb#Uy~H1j}ZETJ=u$ussh#@_tT+<3MQq2f-d;wY%dikx0HUac{8w|I|Zdt%`g zPUAr%6)Boz=`)Y?n{1CM<0D*2^&PNRF{)p37d9t7f;<2ZZg%6Xizoo^Bw5}CsB z<4r9YP*)5h(vg(}`!E-dc(t8*IRytTj&UkUbJ5jwu_h7(MM$`E7HrL>LCplov9F4G z4vqZC^4yrcH&p7d0mZ@qi>t)QJEwI+abg3)^lCIjU+m2^w{esYi&R!|NS-*s_}M?q zrG_{;6nCvDw?-3z@|!7tv}OWP?n+^uNrb2Xl9f-$G?M>_d4_~PoO9@>tPhw;4>OO@ zDr_|63YLbdHNc1h*P6Q4q<49g$4dYo8iTYZE^mszA0Bty_dQ4+5sr}<=Ec&~M-QP@ zOv#%_(O+P{!vu8e^`x*v+vYr5BP>QnyeN;GHViH?X&5CmXMiNZGo#{*ElJ~iRtw;m z6{)q6a&E$3e^oUpl}e|kC((9Yx&h_OICwf_ zG?hHrmCbTI-vXZr!P987d;o_e$(apXpfLRO7H6zl_m4;IB}M8}A8p(l=Pqp(LL zo`!6x5+$($^swR^KyU3YkfI8Ypc-Gj;2Nct?|P_STBecqH3=?cv$3+Qvd4Q!tJy9p z749_uv_vy}V?a9gP-S9M-B)?iPnG-R38EGq(JWt1u><{+fdRyW3@iYOj%=982-x6S z4&3lGu9=bQnt?i5z9bnYUMjSrKe2f_?OV{=2EZNHccX##%lS*i(~XEQo|PqCT*R%r zgkrUZf)TeN88MC;ccz_V%`CPVYKHU`qK16fFrQx0*qsGW`%+Ai;+S9lCx1Q%ROa4O8X&K6bp^SHh)6F8$RVD7LmE2vuC^a@9^73-3s31wZ8 z&bF;0ixHwg>bM?j+K81BAhv@=w;-`5AN4JL&5Ybyb^-j7u!7#$`{;YU*MlT|c5CIT za>m-Z^(C5%BsR!vi$^3HcX@*ynDi*`jvWZ8G&{$4Dh1~G#*=ihaNEZc4cXMwhBrX^ zgEiv+08jo4bNmCI(9``LO~=H*_V?`H|7+G76C)%3ztYzJvCnVnU@v26Ctz)9V{K(< z<$%wI|KGFH%)5=Tg+MDAuG5j?ZDTn`e(B9Yb*ERsW zn6RiYz+XJdBHtf?uQdPx0HAO3@bC3|0sdY=z(GKOfk7a_z(B#FA)%q6AfcdOU=iVA zU=d)Upx{yA5s;8kP*9-Z(9ltl(GihRkpB__2=sjpFbD()2m~?=6b$nJ=jE#x00A7Z z2CxPQkPzSp0w53q;5Rca_BYk@U$oEvV153t4ag55U{EkX@b6Zv?}l%}-2ZF_{B8vS z1^XAZJvZ#xPt~h;xCzgH0(ogz-ovw3m z-G1+Xd*f~5T5{Yu%KJleGowbaD1O{>GRk2z#=ZB(Q6O)-aNK)G zm^|BiYHoEP8fE1&n}TMk*+`|)YANXrW&W6W@cvz7)KjYF*4uf8?zNd`O83wW`_G@h zCE9=bjJLEpQ{ZSx4?ni|wMaVOtp}VLm4_u3L|MO?)EtT=R)m$siEAlanJTJ05@?_* zIJwz#W96Q3ds)x6Y58@zVe2ygEf0+1RKq!}O)n)h>y~@mqU_T&!#-c?4=qaSylN{QxoZxqxBLg!4d;T}&4S|_kmJ84qPP21*?p66 z&#YCRt?LJM)$-pYSI}R|eF4xPtnw5_zpUjLcZolO1}|z+rrvF^fBH7u9!#`&#nkj4 zkgPS~B|jc#_Q5fRjjWZPye-yMk&Y}kOFKPyOwZB%-AVs6YX;}!eZ4srY}MiGlb$_u zi>lvHjYr`ttj~p86_tsaAg^itrNkW`gQiBn5lX0Nm}|5N|8gQ zJ-hN|^N{X?N86Y)%ka1D|8t3mou)evTV|pO+jU>{3YoQGSPEIWgva6XP}kq67)8n# zxpK9x>!0X!DhRYEqx+Hz;GeN>paYHyFybN@7^fF*vBU>DKP;EH|>`GMI?e-o{2; zjmv5`-0fKWTV;UYSq_n3w;yF3`<-=%ZZV1a$8%Yx-2*Y|a*MADjzy{aR!>Yr+Q~5^ zsdLr5`fC`;Va$R@=c`IvnX`|1wbY49Eu4%l9nFSD&NpD%|JD@%fNGO0uKQBWd-8)c z&5Ym9G~0C{_o`iTqt9YC-D=6aqlgu_ZGpKk{Z93`ML2|Z8lS$9vny3E<&P6hvmIDq{OYcOgrr=|?712=U@+;(?LpJgJw zoA@{36r<7YLqY*U(#iJwfrX$ZrUF!1cDd*^DYx^M=lPvA`e`1`*R11CtL4eRFC+i} zW)SkLdD5+;{aLfu%V*#eZPhu`X^YXJQVUMS&kLHa7HyT;VL;Ur(=h=?uoM}3=7I;SiLA-QAiyu>l=DnqlU%5sXT7X zfJuZq3;me>w={092dkN=kykR>*=tT?vQuxe2V_A>k#X}yQhMgTALUb)5*lGmP^y{x zq#Md5Vd}@N&aRhtRSSDXfn6q#b&3i(MyUE)=Y#y4l8TLlr3U{L3^G1CNmff|k7}QL z$iX=G`~{$~{WK?auJNnNqicF%&p>u+2_qs#U*czl-OG!j^PJT~zt%>Va|Qj{V<_bV z*Du^zHy6bVa`oOW;rsCPKPiiyyP~pF`RbHdzpo|!>ICpoLyE>oQdOnNE6!Rwed)Ef z^nuH~Db0FkOYqj|UAdr7?ER^x&Oq?U^|OG5b}h`+Y2nRK@y$6#5k;2rV@+y{`xj>f0X{s2C#ypz2 z?H3}QZtgKw2V|hIUQkVVu0c|fXGeA&TQQc24-{1n<|l*P%k^7{uMlq6cP?-3ZOZkt z7prD|W)0dk`;Jx2Fl|K>w^dw|4~o*&HH&xUU8Pzmu_Gzd)3g7XO92!{b4 z01)`QFu;#*aP?oM0e%2{LoE;lL{KCGczR?)UKtd8A_hh7E?~XiqiZ4Ljd5$kA(m2s z<3Xy(C48EV%d%+x597GzzF%l~>A0#yPR+9fDSVzgDppmgK6-a3w=Ik>(S0@LhL{har?Fig(!W^&8BSz``zbP4F{vLE0!zZ^$i(gf5-586Ajmop=$NOh<&_caZlG;LF-(#E^7T|tQ#gg$SD+Bj7pP0{u z&gx2x%vIzO8#X4Xja+ORy|gktg}>gWWWIx(4A8xxs;%m(NxxtuAxi|yTK+Z@kk4Gm z_L>M@COS?!P(I85WD9yQAKKTw=}GY@Po6^}W!WOW92x5oEts-kAWN_}cy$odxmEv> zF@Ju#Y-bffz4&@2J=o!mG>=o3V)me=l>;g=KkbWKHCw zkFunaWMiV-2kM%J;8Y=nwiz{;A>EK9iNM8&W2^OnKENep`|kM;;d=y}9B zM02^~m36`@%mZ{C7#)s2YrWr&7bzJq3R zh+*~ylB^j^a9FmE!X8$8SMk>|;!|-#S?a5trJG~7^+-zUh;xhMOLCV~mTy|v*IjQMSsgH5 z6FJ{KSwVCdXv)VXsx`s0Iw)ZB=wLnQ=y?oCv)GI*aF%=9;1S9y+iXyh3vsx+^E*Al zl{wtLi;T-K`vRyg5d0n0Gg41m8+t~`5+Gt2qh-VwgMq8b>HHpE$}S_8s${q^YcGeG za35u_3UHsAv}BX>bF-pS??NIE_4fUP8@qWr;vhm`NceLTb9GPLI!xT~Qqi zT{rA2;z-rXXDVa~lLe!1y1zduW{NCS7O%rW64yb+pua=D_c|WnWX_z{C~PK*+~`vI z)*^U$T(DczPSu4FW$mKstWOr!D6O&+;lDDUJ6Y%)vDcW}uuIYCD-FUElQkymt8NGy z2;OUiI_GJ4vy64xA639r>iXWtnpk^2w|1xJ%o=Nq7I+y>ZO2w{gT1Z=6*W*{rys8n zb(p?BFO+XbbB4(xLIJYOU`;*~u*}n_vMSRMk=hr%9-NdqnA0FZX_r39{fDzA% zC?0-N5@V#2{1aAN`kqZp3c6Ms5++nNxQ*uN1yzN;~^dI-Dn|J*KNooO3k|Xi+3iv zLHxVxjToP#XbRod#q?IVbb`Mx_jW1WcS zcH#a|QieJqP^J_V_a8yHhx)*J^=o9)DbMvyg`c?hUNxNK2{kcuIPa5%abbjagfFHu1#THI6S&sSv&3oE! zQ8kW2q-AE_DQ9RFsYY|d{YBJFixA9Be3lymy1@OSQQ{pv>KP%>QR`?cB9yI{92IqL ze%TGiJLWsD!B$<%R&$Xb=FIseIu6GvgLGv3JL{%p9EsuW`o$76LOor2h$3WT>@L)mCW>JI z0%qQ+`V{HmYMd-sLH74&a*Qr%jd{0uvTsr#W@0G(8OD|+BGQjod6SI-xH4&D6Uuen zdbNU)x6f127q@Z}myz0;>O6W76*y+PKTy!KXQM_B`rXuu`d6(*fug&jsz)u+RjtGc zA}(1^1x0lIjcD*$oUzu>g*Bp>CX93gqko{z8u9-@wg`B~;ED>#U4Hed3(Pvl7~^gv zyM*w~q;3fJFu0Xt6+&p^rgIKQmlr8QkRS&X=D~?>!l zeLvs4-!f;OD-o((=9>G1nmYfH?~pq6UhU;cZlc_m+5&SgNsKESts7G6 zQPsinZ+Lk!SCnwEoBBYupAvw8m#e>$eN;_Mj#|FmbEOoRz5tj-30y;z#stHF#}A zS)B{~F{w&R>mj+WU#!01h$^EWQB3CGvgxuA7f}Dba{S|w>2j+DJ##K66VP1Xsrsiw z{F8_bnc+hZc@lKapZpBdS7lh;Pl8bd_w}0H4rwWA)oD68RUX->>d&bcdNK(~Br=2A zjJmFzjwvH!hU`=x4KxRLs<&1FG}K=o$(QEcHvR%^VOLyo4{?83(^qKz0)|5#jH4SL znpc+et}dI-8e*<+zZG26JX{Bk4F;x0JUdJV#{UK29{dFiE+5_po;%+ZUk9409zV@U zG(9%_1x#!{R~8(2fPd-=6cF&au=saj_{^Q+;X`OZ1Uzs_7%exi6bd1oCZCyk(7%d` z=kh}W_!scHK8D+dt4XuD*wHkNQeyvetQ&`;gZ|gZ9H(!B(iSg_Bpd=3H%r_iRB_Na zdt_$w`Z3NF)F~5*AF**&!au2cz98B*Z<%cI=M-aimx-8j>9F{N}}Tq@t2J#&+?{bbv$oU9yD;KC8bPRn|lNj3xBf z)x%2pH&;As`|oolraM~BUG_XtbAu@{$$C+-snxDY!-4#yXWN;2?wOlXgj6zXE%w9= z1bFy=EG4kkvr<*ty=Qda%1K38#mtT2=MKCGrpByS?t0BB~97=7@v*>4CijX20W{FgK9mA^joxw-`8NXDac0a2wqu6fe zY^0c;gv3X}@|*C)dZijqCM?s`n5#6~tCJaMw}xuh{8Jc0noBoh!;LKymJ?*sPd_sS z45wW8#(uW+B%j868tkoPH(Q_~=N#soR;f}O-_@EM%qBFV!?gXt8WkHqR~fuc$2!h?5r$Y%t3$MF5tOc^W(O(p8B9nGc`5*lVBQgD$~dZd6SjGBk7H= z$*ekC3r~sOmn<{!;Zl0iWV4ZZ?;0+|!v-G&E>u$Za+J=j2$*M_Sfb@k1lxIE6iw6c z^Ly+jPdT1&sZ31#1z;>;SmPGr;omj1bo;+9dhPiBF7O$S?Ek>=xypTRLHrkq{SO== z_%u8q7&ly!mRFO2Ps$aA&g|c4{KxF^8I2O}c=?KX4;NG91x{Psc6G&7?}bKKIgMK~ zTHe2%U_01TJMh4*@Rt_hib;spI-Q&Gv6yc@9D48IpnZGb9kI(b+0p`ZoO4zG5mslM z290bG@uV>AB@Rop4(qiw!DbW#^X50ztv}$Hg3D=sxRTo%kyyl7hD4T#DG=tD*P0r< z{mRl(qfVO}drejSH7xdOay+6U@<`2*0|&23-L#3|YMxksBs4%B%KwhVJZjH`FZ@-6 zVadC`LQGWSm>-x?>CiCz;LpOBG#A@b8O^-`q1j{t1pPcGk<}lU0vMCWGR<0u$NjZGO1N%wBydTe)rkr{bE|_Tv1FD=?Q_DWHY9%e<>$AU=XZL}9>aW&W zAU_v+Z!s)_SDBPkv$Rlfbj-#!!@)Lr7YYE>$?c~f~QXCq>I+*wGpTPn>0a{cqUE$xY_Ai(rHz{ z)-KRg%eFkGWf92s1-Z<&JyzAM({QJd3?- zd@rBQE%qDsuhafRVhvwTm}>(oqY_?O6_dhdiC_bP!7_Yu6H&d0wrz*=w)aQxdzzoD z6zopcWc~?Rj<*pR1+J3Y^(5JUth{P|3PPC$zx19p&}O#Mbk^;C*?eU~dCQXh?E6w- z5aH_(e4x{=Rj=uB(-e8b_pyVfN5?8h!X{gT)AK#ja=h_VB=JU1H3$FtCs$vqra-!+ zv_w{eKG}HPR!1S`)WHJ5P?i}d20+FdORfEgxmR4{!nSi4W*nkbluWe7KqU+tnY|hG zGD9tDl58?Shi;$sKs;U3@AXKXk_f-ltmGhsfOZ7S!p)r5Ai0(CXUTzzM;A5n3$j3b z*UWbvuyD3J_PVFRqx67ik&dGV8f*8L*2pB1HE3+r9FF7GiZ~ah(xEP~KZAM;zV7=p zP2ok3+gd;l4oHq7tUh{Cr_-I#s!8fh=3yxF39-=KX&i&t*kZU?&z7t&^}t6VY%B&S zTNu(#_2wN6NlS?zzxorOHgSias{RGcbt1PT8;nnrP|!uM;9EvFA`SX!vt{*>$N&>I zy0A4Y<8r?_Bc_Vb(@8_;NJgvta7_FE^kU7fe@}pY^bj{c!QjZrDzC+oNzs_Svc4 zgbY)m#lW*#va%!c;O!Ps%YcFXeOUphhGCOn#O9z-y`#@ zBQ8>ehw1Yv%XiC_eJUkg`I8hq|KCfY?~}sBN9ON)5~e6jGHbL$8$T|&VKduCi~f48 z+a|Nir&H(2$CWgBFm>$5XPKIYKgtDmCeaps_4W$@nyffRcshnYnflJ3D83!bDM|(n ze+;SgM$=^DNItc~E7rTPsNgqt=iPg7L;4KzxoqxE_9$UQrZ$)sj~UAhH|116q+i@F zjh*8~uZ5E=y!*_Z`EyjY%7w|2=kwyiAoH~9)ULatNVun)baS%{_^1EGo_4mDkbJvZ z5W%a1v*0Y$$lZED6N476#tVb$>d@-1gj++%r~+zu7kWTBA~VFoOp(d9P^xCcoe!PR z{hCP*If-+{W~tk&q{cgkA*=FEYpas#!{XrYLJti7pTgAURW`#IPmP}5s>7sB+QiOs zxiUN1vB|5KC}I5rZal$ym}u&73%ret@kgEe!|uFQ|g zPcBrJK)=THldSeU`=i(-QyXz8&(dwazoXUm*!g@8`!Bn_oh-T}kzd0^v0=POW7aMa z`>Q(*TSOmwL^&``D@(`lN54M+i^kq$1$pomGwjBL{?L>oQk+y=naBFW^n)lM1Z^bQ z@kGRO9%J~eu&{Fz%{6-yff}Axc0`ocaR3MNOsvWb)5}BJSF|;=W+OkHb@luT6{?+@ zK7QLP&5E-}4kle9*)S z9H1LQ zYT-P&<5CY2YYmmjb}?+O76Q~XFiJk8%VIuV`7irn3Hw$g3Nb+>_dj}}GcQvpr*lw(!sU3Sk5V&O1WQ~$9GlgnxE&40+Ewh}Y$|c;c9ytS(8YJ<8 z`qRhZ(pQg(EH!-rfk^&jMTW;iI>kEDnU)k%xtbDBMPI_k08>IrT;g?~AAc#AfCgRA zvRZK3-EymKaw)iOixju(M$uDK4r*_R$Y|0>`}2{HZQ~!(0tanl)EwddRz$;s%&<(O zu?gKL6CX6G0)YW#7%mkUB7M@B_ zpEzXi&K?MEj>ccMFQ8G`whl9%v_IK#`c^z&lWGjS!h3O>r?Mpw-cWYSL#d#r;X^dP(EDl?QIQVLhSbXA9MgO-|Z*k;iDftqR_Z7u>#WLuTXo0}5 z0*x(~*yz(}iujK&;=qP-JCEN>{qG6e?pQ+4Wv+FxZ$&;vk9N({b2i21DddTgX~$I8 zO`}dnp5ge^nDnNmM}5xpYU{+v*(|Axggy7Wk!KOXh9?3lH6QC!=+z|%-GiL0>TZiNW`U9-L00)!77y7tVl)4Ri z*8@WM-{jZC*~`1q5iiggClL~(;+7}2KZ!J33)hDNok>pB@uzG&W>;UHiYH^WW-P1G zF=)7*zIJ+bqFq8BgBSYS!HGBs@A&#O>05uS_Yz8L=+VCG)Rx;j6pRlNVFVB4b(a`y zTK;_35shMH1uKE+30E{N@AOR?{D+_V3paB$d)%_Ht6Bv`T~r;#r+?3={<86{CR&IJ z6HXZ%E1$dm5}34dOKqjYA(bR{RKFS1+%_EQTM%62@urT*Po^QW8F_R|E#HbZ#K7g( zVl|N*S&w)?XFe`}U~SuXz9QzsgO#86-WV5iKlL6~KYFPA1qjyaKz@4?3g3|LWqsEx z^3txm`NvY54FW(ydafu?{_%|emp}-J2cY5kx21Mr{Rsr#HMOR33giC2I%X2jmGwn4 z9pX=bhOGw*aNB$Z?518KxWw&b%IJ9?8Z9Mn#>MQPgc1_Ujq zr^97BB|BsB*5tV@#q5BRojG8HVf126!gJyZt6w5zut$m)6vpS4%`Z80(=dELk06@RXQ=4+F7g$tOQ-~LWLzeU4KQvPHQDf z!GttHmnXp{jMG>Qd}JTUBl@~V?_kRk&`|gHx3(aB+qbv?4i|@jRf5De%g>$ke18G4 z)Opx3k*EsZ62iTi?4zS_LYUzix(hz=1mRE9r{_OA-V!PYwk#s8%0%96r%3sm3E=L#&*P zGhOJbXw=9`Cc~*m&2Xj~my8AYVpua!fV`FguB_}5JdsdKDUwm7w{smn^X#!Q4oVWqa7lM z_mC=GWDx>mQ6Z|9fV$=_ZE;JFlH$7PSaD(LO&3G5H^luT)ts0^f-WGj0(o>- zPK3c?lLAndDC2W56oU4;z(`!f3SwS>v|q7Ws8lUY+G&R_EdLf{2>c~fAt8UmYPHKP zqeM=T0ff;MM+bw>d;RcM6lBnYpp|ddaJY*@qDoe0U?47Ne64<67ra1I7$+eJ1VG>w zK87y?1#`mj{r&6m;5}3spj)iG3Db-9E>H$w60O>%0fyFZ zr;2Bxqs3|?Jq>b~X4Fp2_)z!hD3EL72CJ#EeOO{dINBDcj@?z9(6%|)miGDrt7>e- zySt7QK5VA7xRBw5KqAEUhoV~x1G3leS?sbioxFQeJ{ZQcO>7B z(n`0bs65fYeRik^N(jn&MV2VwSGb~fApvOX$=9IFMKm}n7SyoFnS$(7M5TslIIX5I z8@2_3Np_3fpwzRwMP7~TrbBZVG3c1mGWO$S7}el_3t-ZMTdfGvo{9Y_fjd_XXSI#e z3<;;K2ZUA5Z5k|w5RO875Jzx?O0YQxr>c%-RL;#xIIFiwsdvuMGoS#%b!=P~zOgXd_{PSzZdbJghSM zY9S$U1efFGUHN2Cgq*r;v92az$8cg*aJNages_2*aIvcGARIHLHg9l{hXPf;jirK; z3^p^g?ctV}Kj^x6!SCXn9^5?zH%+s_MrSXwUW&Ga=R7lmk>%>2Jxw~pMT;l}D|*m68~Ii@OEJ16*MXjiMB%V#q@sT2L+N-$ zIjq<$IuzuDU1}W;#EBIW67?C3H{* zGzv`|p&%Mo$>*e9S%LAi*tVn%!|+@uOOJ6Q2HMg_psgIDqJX+my)5k2Jgu1J#dsJl_&K$U|t zLuRw`Ff+^nEMbwrHW@4jqybxk86-Sg@R{u)JoH&d|MA7Vm_p}iK__e_e;vehMo5*A zOoXWaG4~?>O^u%2N;^NU6Z&H>@TOQ*X)Ex^~5XceOc!l;JW~Gp$)FY)=6L9fe zvZLWe6~P0z13u8Iw85^FXDAM|f@6o$FSl(#18T5$VgSh>9r}<@3oh8&ZBoqRt}|nV zKjV5f^1iT(UPoDEeUpvqs^GU4m{jV%>hQJ2+|)6Eqw^`*2#6Ia)8oE1ka0&OnVwy( zeZUarPKdcAP)p+JW#U1C?sqnnia|qj@kTf3m%i85+Fl+_YP;34&6dHxPmaNND`;53yM>G_3?^^sWi(B+CJTe{9c0MUZ}Zop z;ecv%L3R?}_rP!rZ$uM?+$vq~@rqxCgJh^^)a|mXRIao$T8Wx;rb=EGGK8KKZK0KnS8TsB zn9cUF5@jDeuP{yLohj_WqYv}h0PObz_maRNW=LpOqD1xkytJg;6pC|b$4!MT6GiUw z;dN^{Sru}m6aZ@(17>$k<{#0$WtPxN2=bz>0u~y}l$9~SP*79ep`Z=Up3d0DaJuxo z+z)^K6N!RSRNOtxC5waxx5D7#{Hlgt?7Su48nt?&CL4gQh zE+HdPT)J;C+k_5exo_Qxd5ZhMrH)aIb|V+9cAe0h8Sl%eMvRcVz>LVITfwPMQbm3- z-Az1@9Q-Hx*H!M|(9!Awan#N|m4%AhG6tg(FNZ8=26y~xL6+zJw;20}R7#kv8z)jj zf1ZfUH8ff|ANnO80|)8Dkzs*@FKD&|6^Dw)C5!WNSF7D95_bLItFRF@w9QU}DGN3L zlEn-L5KNPxfCPr)4y8&ty8x^^0kPtkCTB$jRGa!Rsy%bYkfx2_9P&P{A-AJM8iYL( zL|agx!46^LJ}dYDGhb-sMhVqahEWg%_@?n7&5b-iQQOu+rF@4_#OYe(rf=p6^DvN< z+bRa_)ILN-`@Ik?C=qt@!g~}q6amzELH9n{2w^}su)c{;N^3hw4seX-Gu%R)&{60@ zZWp^(AtQ7tAF-BtKkP3`J4KbtLVRAYy%U4XSAA)Qr6dYqKP_9!~oT z51EQ#3uKi$j#2ivf8jTXC)K;VcluRAvQlfRmELL-*h7+=f{?51(<=clecwU(7u?4Z?` z)(OyhEV#~x`3ogMHUkD_Dq)P_F&-2Y;U@V7OurGlCPH(_fzp&FRYuy0N2SO5>NuC+ z>GM8!R1fePypW^1WsuaoUEX{~CmZvur;5W_oA}Jj=45ndDeNAscJNNv3o?xg_IzXy zM!HT;&RDs!Ahmn~wr*qb%9LH+4rl=iz*N#@ns`EuFBN`wyBjwOZX!;g*ph8_RrTT5 zv0Fg_h82*e-vFeaTHGG_Wmz>sQosR&q5X>$gR}NrM=TNM!uDO{Uf8lZe++kNoSr+W zwwn*?eDqdaJu=!HrTOy~HGP>L;HPyAV9kt~d7c+k+{Wv*K^Re`|&PT}8g?Y99CQ=L;I_h{TYO(#gh>%YGPiX-U%0;l=Az|c4 zWZG7>SAt(CV$+dxTKidzG2Ub-9xu~svmo1G>5vCGQAcwH`}xXm2|o0<8xMuw!Q%_3 zF5tl=zX=NY1k8dYX^U-j@Wl$S!+;sbwrwIYUnsU_MKFWhPeO5jn|aN2%3{IaREuCm z%6AJoz;4^9d4MDY60G*?5gXb2`!B_H-hTPRLD67NKTk!4C%8Dytb71XMBPo^9JkxgoEg8Yopy0ENtSu1ITLhMpO& z7mN1=bgmz%v`$iZS7k~yQD-1!Qequix0F%%1WeDH1o1>(-J z-VdXH0e+I|`TEC~7mV%98c(Ye1Ed}tyjb2^Qu1>2ZPsxVSkLAbJhkc-J-Y;4PeOeo zS?C%drpWm)&3+7OI9*A^As z%T@rlF5(d|W>jVwaO!~yZMZ0%*m9k@!|giqUjPVgtVTM1ywG`O?D8_W@Qo>6WEvfS z+nJX3j1j_o#_4v*za}=g-%Xmq9oGGl`tAT?FBJNSQ6xuQpgI7?;QY>Q{Sp$}9!z~v zI3yVz9Ut`6S9KEIGL`*C_cFr z%ALA99L1mvkw?Hlu+343V81HOg!_|!;D61m0g#`&myo~DPJsV^Iy;BYwx|E!C+Q}; z)x-Yye@@yr`EbTyn!6(LKc$G<6d$#P@Q`%;=Y+cdbwEh1x_80JUO(9DimB2`_BW>@(#5r}(qsZC1M>yQGum z)c=(7_!kfmU@40V5`Siw{`1L{Kel$Eb!oKx&*8s-imy(tBDLRy)BjV#ed)$MWTLKT z5hLFJ`v0BK(!*ax{VZbExI0D7z2CV1zoQM8@=?{5fbZQVqKkMo!xB%-3ZKd3f2#=oQAt6b@(H@IxkIBC_+~_2_6mkOcyoLnJfao! z6L_sGht6X`F2-)R5qVB=`m(W zjxfZsvW5PGr=b|L(&$U}e0RW!k||Y7(;Ri~HkB`2M$lr)yvTSSs!X1STjKwfJ-wFP zn69=aN<>hmB^$F`x+T+%{fO28iGyXQjtCvxu52>`xq1J1{GHAF&SB>G?5ld5w?mmg zz+b>w4?$3{;bNfUytRF=l?<-sZZ5|P1#v|m+{OLylH`HcK}*FIjH{I3`4=kf3iX*h`vtDsza2N`nvV#~w+R4^mfL|{ zt~1fDk+l*7|DWzOy_~`B0S9mK`zrV9hk7Bo+L_x^ywCTSgGrCDvI53+S zbwTYzrSCfkqBP~DV@v8A&9AtYm)2a05+#4~UvH)s9qbm#$oUJXF^C&au(Lh89XQWm z`}0VS!yK0&TJxgFtU}lN`8@2zash*!W&IN}_k@$G~8+c>g#`hTm z?|O_DxpO2@^RYay9X;Z_PcFHB&N8H`z3KY%?Z$9_2BhmtLt`bd=8NuF*%4aiX^wRw zL+;?kS`x|mgo?v!R1I-}NUp7MmIu9~Mh3vEd12mA23e+wn9Lho>^Vy{gMo14FO*xc zSDmNz#`2~p#j9?h9bA;Lcb*z1>YujtdSK`4tDTOaKH?1o_EcSm)JS^D!E$da2IL`a zi9%GGH1FI{&o5hh4a3IQDDbv%dcsM6^GXe4d37MjAX@!Kf~2AJQ#tU#3E=o|VHN4i z*>kTa!NFdEA2?2t1MF8He=Tt5dXB})&pL^TjRI0aKl>&b4th3=qjqjL@$8>Kprf@_ z^tta`(AY|wz6ri85sKqgj#x9p^%SC=eywH}OEmi>@%-(GYrZ|#_miOSr8#XZbno1V zr@0NNWn=G@slf_Q<%l)J(O^%u1ayFoaoluBd%{>*^#-PU)R*Yz(m{6cz*sXh!eH9^ zd}mEPs=xex^6pT5S-&A+TATHHEhi+c(}Vik;d6gfoqMA+IiUIHt~$&8qNvxZu@Ohe zMf~AY$C*#Vkm1$3`b<#fb{g`6gZ$Pz$Ch=01x}~tq5kv zD;%hu%_iqvwh-(&PbJ0`vWq#b^>t+mKFb`!AM`WV08 zCGy?$_~a4&FfhN-Q)M9jUmdxB!4Vns&piLXT5>=<8o+;b-D7$?qk%o{?dl1j&1qV{inFKAT>RKH%V2nkt>5MuwVbI#Gk$O5ZXygFW>o2eH~ zX5nk6%kCn#3dV?1O4984#0v{$e1pIlpz>XF)pN}oJY8pBCQpe8=IM~`2$|F(s-Xob z(w8nMrSc_q7h>G{(*4+OcyWcmATwl&zh)wAsA7eg6AaCwZl2Ew>EXsZa0)JOdx_*X z0w6Et0ak|)F;n8V?#hgD0Bsed7|!w^K@(N5e^yTgq@lC{+XTWC05f+j~g$=(80gP=vOG5$%4$M zML(z>z2A(tWwuJf*}n?3V&1KVE3FT5i$;pQdF|PqXXlVe^(mAek31XtDFS9vKB&bz zsQeM5NZSp<0rUCN-AgDd{3VTsbw8t5ghq?S>SOYB+a?iKCz{o(olH*GOb!r>kZ|rz zw;a7SgWULz@`yGAv+}If!z#)UtHwOfs1ElwH?s{xsppO+kN-9=~sj8?ExjK#8i@t?A#$cu2fz3Oj&!Yvc*=OdednwdC zGaFZee!PUw<9kh_o^49#Hk=HfU}@Zi;Xuk*2D7I6NRG`GZU?nXzjChxDH=GN%uDP2 zl2_bxX*8Pr_2T=fMU^T9%^Q{2Rw?5_C|Y3WZ}IerG`OX&n}lPN!wUvOafw(cR7VbC0^X^0h1pu6(h!tRA@n5x$<7{F`uK9K)cg#AaE{* z4m=6^q##=&TnG5^_?a))mTBaU^6#+|JBnZHv|&<5Q_5S zIxCT(=1F2ZkF-u^2%@oP9h%jxLC43!S?D}V4Q{|m|3s~QMFPUmC4 zR<%ZT`wXpKe1E(7ix@Kqj^`OD_=IFZtCQsO7)rq>h0n3i?%TZTNvT18&EID8efASF z2Sxww!)6F?rQWyLEtB*tSfqO=)O#f_z*P|M9n;cUTVtB2Wg%E5SD(>EhjyP3(+<4w zCtR}okGY!5FbZ8@EL_Bn(z7e-1aD~rWC4^K@2BAb$3VN4A{r@tg~TI~x@hz6SX%}v zdFG0zWSrx1kYkU2PCVPzWzC{(2AbI&{25I0>$({llu_b@f-kyCz-@%VdMfg#ZRxNr z1_$vUX}Qkm8Wu931p~3ptj5!I7rDOWOPe}C#qkd?GN#?m&0q;_)~mV?`iUi+mWSpq zAR}t``~66vfS{c($Ji_c4eHQvIYBy%fvA24VN_|oAg!_@wtfYCPFywp>rcPOfvOkf zl*h603ULL@Mpq|R0YLV7-E3osQsz4D97Y?9HoUwtc@oB!YMjx?PJ_U-Qs7D2F_C#a zH>eWC(I5J)1F8Xr(9pVMR>q_)BEd1pL%fNYi8yWs6%an*b@mQTVgb!k4Rx1%I+2Rz zpSeL0;e_rcvB7}r<7gA$O!-%+B_OHn+qw(Nkmlt;NoNKdGIdnJp%=;L{wT-Zg!Bc|3o47rz~9@wA3n6#>I23Bc1HBc~XLA}m9>VpwLehVU% zQ;As5_(UYrJgx;cIHSIIeokBwRXQRiR9#R7{+etYLJ)o3rv<{-Gv$3NbEcdx!~};m za7W|GgsvSvvY(?Yxu$1g=KXzu;QRd0b9k{C#(D9_F?VVh1HZw8~qOXvKObpz{ z(usv;w7=8AZkG6vF~xp@E;jo@N?JPGMPzghujtBstQ+$A6hT~7d7VE_NUS6M@a^?D z7c$+8Tw!Xj5KQh>HIpyV2&@{089(*1UCW9 zt2aLn!vj{qDfWM+y@FGudU%6*dS3<}ImnlobtH)87)hZs@79oZqC@eV(VEo zgxAjAH_Hr#8y$#x)r?C&Vnl`F8A@!cmCE3M-+!K6?xwdSKvoi+Aai|{Znn6G6!3<6 z(OM`{!J)nRh%o!5S>6b?T#1D}oFhTmS(PdAk03i1<)rQTM8;LvGL5Umk{~m;Ars5( z@j!Fm9$a~`xp5tz`7S$6-r{iMMa;-EwNql?oz*KF~?7_XtwoTb8ob9Jam z7wE1=phyv#X+1C_NrNM_FG`h>8U%8etE*c_BFM0E2cjjuDvJ<+*SJ`dfm5SsdIt%_ z6q9*&I+z@!3MMo3lFN#52?4QmS_)&iq^F^RlY>aNMi>q|-q1gE7++|UgBfq*Huhpq zSYa6V*yuFM*5Wbn##e)TmoTNT*BRS9%FSitmA8++ z7cmzLcrua(VXEpmG!;lGuy;S30#Tu4NYGdFX9Hg~MHEnc`d|UBUI-VKjOG>e1&jhK z&NLMW_4Ow@feHlNzvCQ3&bKeHO^5$;8fP_)(veqER1Z?ENcr?C4vgkMaN7t z8yD;e^U`K|1GgP=)xZy4jc*mUe)2{65hOALvwnEm>=Q{B)rcfA( z%cK4wqcpeyD`Dx}CFm{hDHh|Lm$B#8h$yj`xTy7ex{56M4?(etCybFV?w&fT>Yaoo zat!*H{LlvXk%Z?!99+XbU6VA?9Phm>$5vx=$Pj;K4te_4wA>A=!OwcEKRBF00I8u! z(c|(LspkSF= zbji2jU?Pka8`DM zt1h$kuL=nJ*E{<(wIbUVM{%s9kxHh5K<_K(qJl`=q!64!gT@5VXQ4Uvpbn zJ%pC2l+%^Lr#aG8bLf=k_h)6nxTIZNwc34F4Tdkj{{r-(aVRXbWT)>f(mF9C*TTS6 z2F$y7zP&0~3EEM&`{P3ESTy*@E9k`X=4|#Ic|2!w26IdWc}r)^HB-1Q?zK7Q9zPw| zJGSB5)!)VM)&LN}7;+ip{f>4F$cv!ku&?y8p9yHl#kn{q`<93Y?Dwlv7i5xWHeR38 zL|Y}%Bxd+NY;Kn^>tPT1I@5ChENc<>fNJ{;=)J04;IKZzJubW*Bxh0xYv)gvf;%|b zF@epPFjPC^-MbYa_3Z9q4JUgCQ+kKN6iLF;VNcaF)uhXT)i5TFuS!H7XtMwvXjwSE zV=2(&I!E&b4yTy+kQ7EJ)v+nB3SMV}y3Ubnl#0SLqhhTCl`)$2b_|w8-7oODH;^>c z$)aPVhgl(K=f~RO;i=bb&h>Jvi$8IrBY~*>UCO9JY%+yy_k*~#IwAPIa?8J094rO_ z<;RSyTI*KYGwCNHgW;_*Z10mP?#%6>L0wE#ITt;)Nv|0GeEK1%NV7}m|0Tqnhn`IR z82bcl;E-r-kxCYi=D<%np5Z!)2+z~p7pfZA8ycVeT$o}QyehdJOTVk5ayL*W?UP#^ z{ue+Hra)N&XrJfJ#UIO&|N3qUZ?fF>$-lupstD>shC#{y@~Vz-4`N8mDdtiKZsw-J zAUwhT3n0a&j1b;azoxLROhj8bXDIr3q^1Casq8!$II*|-VPpQ!|Ol2OwxWE zoT1Zv9Nk?!qr~-@B%v)4$Ya9G6z__huQ5hl6|J~XtbH>mlB>NUP(&l`Vi}H%Fm9&$ zZchpmB4Vi&*1J#5afZsS;W_j@@q7Z+x%GH7?=JvBxSDti8(1(KvvQ};4;In*GF=^k z-@2#(DGfp~gE=!yDLl8=T?I7~T<`Tk{dYdhvm58C#_CN7i z=qFsLw~oXP8?)7Z2snX&pY113+cXmj(RrVj1^HPPMP|}3?Bw7>tQNgU_!uwMP^7l; zO@BTtQwy*pU?H#dGy;H0!L`*}xV-!e(B8?mq44;h&5GIGjhkbOULDa{?Lpte(%+aEs>bV{a@%shXYz%}0A+nk`4x_L~|j)gsY7>T%TzeU#?#b!SNj zzbl?Nq|)dJlaY#tEefn7u)3qM)1%Ae5V@4yT1dH*zeddGs&65ghr;vGNDjbolwi}4 zlihA>#-Zm<*`4Q4j;&yd1$VnYbUW=bMDB>@e1g9K?sAhNHQfM`S?s<#MYEs2<}Hqb z6vyKvGDvprj~0qJG(o4}GLuXGu(fYQ@_qL0xPV=Sbh72|r;bhq`1jviuErTC@_Z9a ziI9-P(#1IipIq>f2C$e`HV7c4o0+@K{mylT2~HvsILP*9+5QBz%PKgX-0HRBbAg&Z zq?6zZx@QWKNbU|G;vu@)+K%aEU_d{d`NZ(!I10%^Kvwi||HGsZc+bA^czLFX_RaXs z##fF|I4mx0d2;^f7dx$%ROdT)qKJ<^GTNU_PnHrjf?pf95k|t!Fw{#0gN_|h!JKBL z6C0G-gutY~faa0&Y0m&2u@Pd&fqh58-*b591`OSr#q)=8QG^KaZ<(vi{SY4B_o2tn z9SS2EIUVrs<@0*HC3F3deDS%Pl%)RQr&_WGq`C|uP5xD1LEU`_3QJ~mSxdjouxh5# zr>G~HwI3xRdEzUdc#B%m<9fsxdKO%ZG7arrXV0DuAnB1BjBT^0qAClu(Cd;tD5Lz9 ztBTl5-H&m{dB)2QBp2{(G({O7{6oMBi_~IQ>`#m773_}qj`5$BmP#DUV>{! z8^r1IwqFP;uos2~Gt_wRdnb_dD&qU&;QA`ii*97if*aU{t-y!Q`;ujFT-m1+2^fl* z%*TCP2T2T2*j|UnVYHVpgNDv`eo`kyQUY@R>Sbp}VWma}^$Sby-@5C+DV8G*%&R{@ zr23fNDRFpz%y=aYPb{P>8DNzQ-g9+*1yFw3<=T~zS3QYRKhNwQV$yIgplQws^-f)s zRpo7<=d@Q0MsB13HTPbpjvJtAo8g^GUvEfY+6^|+$x0b%X#0w8Xm)sY{@WnOAW|kZ zSar0Ig~{Rwp+gbIZfpKFtTFz5o>V`gvB*L2&LWjg4edir`K(`5A38hz=R)+ee1gP+ ziXqux0nhOA%n=KBjqrMIk@byn&QUeHY3pz#H#w7Ozo*tbN#h7K4R!_sQyyGxfBf0b zk;pD9Ocwl!cI>Up@ALtIA(_Y;XY4c5Bg-A7lNByAfrdQw3QGK1VIS_)P7=Uydfu2k z_@|5#7&@F*_sKHWLnNt!bWK3`Pe^ZHC)V(o>!HaBUojl)A#-A1B6q@&83|%x6&_m9 zjh$nO)6}*p&c5pB4P`9~#$ymizl!o5EFEij4LIxPR%@PSmXc?l7ygXu#8`+@f=9=JxLx7L5@Q87zxw@KlccNV?eL zm-kq&OEDI^XQL3j=G|5+P-MoOYWihq>?R;FJR2IxQ7eeiS(AovRs%eHMBv)pA{UAAr8w%OHP zw%ujhW|wVOm%i$Et+UqJ`@H)*=kJ+gd9+3M%n4XX-3?GCBuk*%8@zN2>@Rm6-o|rX_nC0t2viFj%MXiQ{vM>nhZ$5 zfG8@XW9tx2-}=QZ51focm8A4hQ386p^S$hR}t`Gl9V6T)_}3 zRB^P3O68&v#k`YtCE?2C!ZI8Ya}2SZ$C-fZ9Hon0{Gjy~!_R;h>g}eUm2$ryI0L!R zLUtv)8&V|(8L@=z&};U#$|V+31nYRY^P(7^&Nt{6z`S0A(D+>SUBvogX!Z*&6cW%d zIY_?*ectrIx_~4yP|Wx;YA+ks>`ntrEp19)6(d|BI$cC(!-d=E9{pTRO)Trc5=RV) zdtf&j&V_*pV15?R|p+8*{0g3M@%8lriSwr8DqX>BEO&`lY}W$(biM+sJHG zFsdX_!BiQs;3{~OtU|&Uh}tQz5wgyB&JRO`#Z>yFC@kJ`9V{?OJ3q>=Ja>^|2y4+N zM}VHyNEcfR0C{&Hh~#R>fD5s&5rLl~MzV|n*6IFWci<*r#Vl0Q5bAdkv@t9=h6a+m z0CYo%UM>R8Z?-HdAcK))<*wCzz2|d{@u>mubOkHrsWo+pIRY|yh7#Cb0cb!-qofYf z&5DCEu{CulWZlBa&CFmXAfhar)Z6nLYW6_P5#nKb&oDXCRS_PGQOfE zi(3vQMiWd%LQh}fT_+7(D}gq!o`XL(q$E~I&`8|^+aczlmBI?dg{BfS;jATV*~i*x z0_~YUv&5FC9vOgXkWK2HI{+79U+=GKRi9H~)pb-209lo-SReUf7z9F-phyi(1@Wz$ zIF0`-KnzOJpwPy8UqF&gC!xT&Cd?y23(1@et?IxeSiN*uEU--DD}0CCVFv`&)fik> z-pCC;QwK0`=Fucoxg)5!pEnH}*^$>NkST>lM(<3p{}t`Bj}iE^Obt$SD*j7L)qrpR zX!EC+6dcq7`VWwRJ@bO`ty(B z9z~k|1<1UJ#z=+q_xx5t|wi6gkxCq=Ne~^QRIx31^fpaTW}?2upLY<9J?n>NG^P3toVdX z#fafaeJ;b=fc?=dvY+q-vBID_C67HM73X5ID%X+aamyMtux;l9h^-=OFR3p2)CXW2 zO{m_pL=jNXCbXic-Q3MPM zjg^o|}?7ykiDN>pOugnc#w zfi`6DO=rBP{-7~P=xK9tC)PAwGL|&th;m39DHC|mraY8mu;jcRos{S8n0CAI_mSfA z&>{Si$8JNmRXA}Ue%;vqkxT#Jsrf*|&QmUDU<}Ax&aXiIoy?KRWcf?)2PbY*X7bu5 z?cha zN&I%iKZ-IBztP`!OF}0UUP5qN7fxZt?3m&W`D;i1z_uYt=_bW+&1VC|Hu$xe=OiDW zf8)OTTvRVI%;$W_ptzGXIBqe{nJ}BX@3?I^9f-Wr^l6yHc7?hONAy?P5*jKoGiY!K zQB^6op%Z0#uP;9qk%+`{*h?>%)NGtb_}<7y92n!F({v9i9JkX^|MQ|egD9Eg(B`ut zk(iKpMm0y^b+Muy95Gd*0fVChu(_4j`xUA&Ny$K*NI%M2m2NhqHoSlU322XhNK4n2 zk@fmxb5+guS%%*@*6rj}Cno>U%@!TJ87jVG##NrN|08OGNiBAn@9)VLr%4l3cv_b+cR!C>+N@;VN&!$d6FC^D{`gK;P% znqw%(js^i%+VWgzr5H&(FN0i5{xgb0_lXfKy;X1N-K^Lx{aeYYBFCfppNJvd>xN^& zWhr8KsTdkmzzQGPPU)SgLE?`7mo`13@=`M()iqzoqo0yM#XrJ(=G;Gh78Bd5tx&z2 zlML5;tM0pu(A1oJbCJdzYyh#X3tGD_#+isCHHPWo?v8`Zv11hK5+410&I*_oS;QnH zy)Y>#TTnru(wE&t%22@IKCoKrsd5lCk_Nm?A#-qC3=8=zK~;<8XB9q6Ps)u6r>z@#WJ7;y+LqOH-?>LeD!Vv%nP_$hP}bchX+ zA<$qKolMUi>dA0_T+w6fh~OZSbnXfsX^Nx;w`7mR=S-D&84P;z!B zOE}c~4fb}GsU~R|WLaCkBpI@-veI6%HCEZ$p?irgPeL&ycOOZ|Hhv5?G{Cj#0boqY zb)<#56n%iu??(xALL|2`kplrzrM;Np9ZY{$1rIt+Y`=mOAo&CUjfV#DF zV=xhO4%Va#khtiSEJQ1y>U-s~U1ev6E_xQ>5HTyTYn(>CLo&5_#6 z8c`@w(TS2T*xAw4_yxoQkExuPpwoNAjFiYO&PB%r(_{q1X1x*%mmkjS2n}5taR{9l zWK6$T3Cj8l2OAJnm$kHf8C(z`Oj2}b80vY9(h-KW(30A8x=YpDl-G%CzefTeg1g@x z8=oKG4$O`uuUax7h`n(Wo2{QgDrK&gW2F|q4ww~x^5Oym00&Cuq{sLZ+F{k2wstOu z7*@dDv-EN^TH^$@MrbvTVO&4hAqRW_?MMgEh3gKA4?FtCRxuq$$AcS-oPuLh>(iLo z3c4`Z6IIp9SaHoE#U*R|M2B*VkO?WMc>)#-^(k0%$EiwT3qA#$)~^E`wv1=xec~L3 zHy|wCdzIWo4He>V(UX2O&3PaqI~yo=r%Df%Bv-6+F`BOt4no_Z>{CX1gj!E4lqpcQ6{-*%xl%(x?##zvjSKhn z1_hYF?0E^aS-Qt@OPG%*1w?&l8(i$OoFmSPo_kSKRndtl&2~9z0mL+}Ryf@!hkpE< zR0->mx51bWHwMysFFOrKgY?Dt%>3CZYoFd`9N;a_iv9w;E3};CISweFZmNOrj=Ud0 zTM4I0WTHD%ssx%7dk5!ppDtf3gXBt5DlYGio>Ua@ln6%C-DjGkdVw`{a3>Wb{w7KS zBZbB4juN~5sJpnb0p_Cu=(9xUal>Bk4h|Uvup<(#bOH7F{5LWRxlk?(?SZ`^#XMj7 z)E%&@n>Xe#{Fzy3=GOuf z^zCKrohl-LYs&WRygkJ(8C}_Wl8D)WW4~WN+-l|<+b2Eme#at$Q)HKv7<|J zd#Q-;U?LL{Z?gCTl0(yOOhl({U|~_mOw)`UcN_SN(fZTh>gM&i_ydTNFYb`j=Eh>EK=bee7Axm%*3govV4K{fWZc)b8M2dt*QQ$!y@T&*1SJ|9z17 z#vxx?*Spo(ACzR)5LttL2Xzmz%$;SDQ|% z*vpqvhGP?~k|YY(l4*9h;qzP^yf6GTU6yDGPX>(wm!Ov}%cAgAj6dP1m2e#Y`8{L# z`Ta@baEa{JQM+W!tLw~Dk-@2nK57zTOnSbRK$e2;?)j>{)!eH3o9kefexAiDVO1A_ zYNn<1*B9|T>uLrs1ZD8zx#juXFJqjpgY=Wq^6kpna((xaNX2#>AFX9FYq33?ct^!E zC3!ZMu5XUo4z6f=O;^)}(DZCK{EcT<--oT4S7Qj2bvmD~=X9}0N5?TEzgkCwaN7zo`*u&Z8w4?Z7O6l*DpyHNPZzpNqt??K#?lzle8`LrRfC)pWC_^Y#e3{ud1wrFicwUzdjL=yx|_~< zko%t&6XmqNHOyv{BJ#c|`(M&lxYH0+19!yNk2fGWN0;qIiUK`@oSz0#D}m(!K}GOG z^Gi;5L($+H>(y==KQOQEW7b!zYt+3I-B6t6PcHim5r31GYe|l+Wy%@uRY=lP2raz_ z_E+G%B6t$UNi((dhrV#Vaz=4HhRem)gke=p=%7w})AlheNO!@q31gSWX^Ws8Jh0j; zK}xQyFhJ$wbF+D#sp+52=rA+j*j_Y<%u%gp{SsZiI~RVpILe_FjWMz!&tD$RS1g!s zNKBq;VS*c+B~9cfS3fw0KFhIO(&2vCpiOLcGw3SYu;l1}-m_g4BVQ4t+Wb+tKU6iL zdB2-#JQvYVK_7|)^bPXR7tT6iwsquv)2d%QKXK3U``oKD+(B0fFMAk7Q`exxJWLJypF61fhY&mC~$k9 zdzUw+7-wqm%JEyqNY*^|S!^PpL~Lt*KVD36O&gz@&D*dvptv`X8)ybWt$Ehl9MPw> z8X?eeMpA*&26sNW3h@eVieAVl;b_j3YR9=~Q^R8}%gmW=Jy|G}T}@xpInh=iHUELk ztaHbp(lBvRnV#z>E)9Pl?DLadK2J8ncc}OL-}&fv%iSq&9+-i_x}4u#@wtxc#-P{O z9M*do1AJTwM2pkrR}6#HYH?PDWYc2UiRxTj(DuOO6LT(@vu#}ywg;68)gI*CP+&Pv z602$gOflC6tM(s7e#;HM*wnY7aCt5qt&H6n--o0QkdJAa_ava3wjvA`t*tOsCjuql zJx%ZF{SF*;Y-kiAgYhjVv~vc*f{G;-X|o;kdKKU1UZRIqV(*T!Po&QASE5cMan*8}Z*8r7Dn4U(FRV%=y#@SAdDj zzs{{6km*sL+JSS@~C`&3vnOUi#Z1!v9hzX6E8#|JN9S?NjUTzmE~vSpO&C;(w0Kn2A_f0f7H9 zU{GC)!&Sq7kFm?*PU|p6ZDNs)9$pQ zZw0+#>6<%aPk*4o1!Ou@`u4s+pPMV^d))Yi z^8OVF5$xt0AKzN9lGO>d`Ud~SX zP!Y;;7bo0&Lwt1n0lzU4HqZ2kc;f9y&xm>B@pNk?p7uTJ%D?G3{RSqlUM)3EID4x| zdhH8+X+MLD#ObL?ejoCC{Gcw1pf5N_v=^a#dGt$8`a$x{n(3N8h&MAD!lAGYwFyrm z6xNyX66y(b->yN-n{KL;h*4j=mA!`9Ssu5=mnmme?c)|CPjOM>U{f2{T3(A1n?+R< zP8H5WX!ATi!K+|uuw}fYgq#%us4!vcwixzqsu=6k_4Qt*N-gD;CR}Zk-!cqn2U5Cr z`9B&~RW*1vRN)P#nUR%)AH&zC!`i(>fkEzg6$G?o%C28i-cq3Ec5x!j{lpt=ewH+~ zagH4sgD(-oXl8WqZpjzh3^a^vzV!Vcoqk6`V_6UbtY z*1YRS^G^_YU+$(tDBl8(^%wURj_kXdw&E0yi_|yik7tcpx2XOIrb_Rl)}6QX*cs|G z$A%pYUzkgRgH9XYCk)>#-cce^qfsMyK8J^6C(`SwZ(nA9p)2InGw67(l}$`eOi~d} zPOU6v!8)n>xa#Jxlo#8gy|8q>J3cOV9nA>e^t5T5z3sn4DyjxKAvU`3?G(IRY)G0I ztL^vPj_y8FlJoi%SZqxymJV+^xAA?6=XF+^)*aw|i=AoX@l9T9<3ooLQqnGG*so@I z2>b|(^6CEGvMj$bTFii;Fztku8F@*J)qcvgZ5ZPATt>GT6X~Vs3U#UgbGaThPoYKLNlnavRA?0fhI+^c29_A=l~N#LrVS- zLt}^n!)UJ3a-d6f09|yu|q5)v4Dz#rUSP{wO zo@>IMiH_?$Mw2O*ug{|o>*}*{T*75q8aT;is#x-M=XzNq23xh1CNHI@S}Lln!$6bV ziSnAN&3tXz0JTZE8DBUU3g*__vAIRD$y}Qam+GZAk{W|DpHy)r5P`r2eOGbbDrNcW zn0iT;s%=M;p<2CZsR~;*uOXt27&g?9;mnf)-Q)wt5u99dvAudfb>t``@DXLrG>3QirON$$=9m>nCyWOHd75F_h}@+(Fp5ca4=%66qWVL;l?Z%B^sj_z-%z4Un#sHxl@-PPT=d`^iaCro$yZ8W+OWWXLcy=y2X)C> zXr<-XYKhu&c%r?W)w|h#y}%XTj0yE>W*o-vFyeylK*qK+!#q0_C%nQ+%XF%%CT~U5 zyz2CC7a`}mtAMy(_C;6f5SY;6WZ@#qS$NXo&yNyK%ato%fp_ zyM*80Y;L*X&D;)S`CXK!J!K~s+04Begt_=m*FE+ue)Z5;ap>_u^f`B#g)C$BZ@TS& z^u>SP;h8zv0sql$v;Di<{)@SY+1Waam^c|ZTG%_=IWqp)l{2t0VH6eo^P`owH?dXr zurai={sb!424+q~fX~2ZA|W9=cP)Bm4lW{kR%R9=W+qNnA}$sV9Y#rK18WN-L0dCx z6Cx%UMnNZ|Kgz#cEbM$ab)$ltT_BTB>$AT4{Ml}!NDYqX$wta0m9q< zS;54uURDZr%}#o-HJ_P1X102VK7)gk_la{$5PXIN0v%2HRSN0gytN<>>QtOIy zlvkdecMaPmm*E>G&)zx7u-=x9G*r>i@3zP&f;40NxGmCT*i&tq4KLM0q7v(^MvWX9{ZEv) z7&?2{n=pQLbTRqssE~n^$)CdhTVq=|IynoQ8#w+kqKv^m!^|*@Y8J-M=1y8nM67IV zpRnvNYyG*ZFOU1>x4WQx`)C71x3=lKxT`% zp8Kdl>&*0UG1eUsqb!Lccu7DeU`6xXp=eG6Pj(jD#zC`0%ju$W$n<4moWoD9<8pz= z&EqiVmZ!_pi1rre~^ z^*Nd|*xQho4U=Ks|5PA>2Cx4;B7;G zMkMk@iolZiWZMgZ9NkSCLcPZCe*R*(oTg_j*Mg{lF2uR0l*fG(^3P$V+eaVAaX(m2 zDDf0r1;K!GzckA6N)|7sK+nWVC~dpP{%-w#G(qq50uj$jS}?43Mm}vdcLe zxNF{=FFLckEI&$!vz#U4)^gjlOtwfw2msEVN8)7`dl?WBwR{5ri@-!hM=*<>-sci0 z7C=v1N?y!B+Snk*y4HMfu+T;iMvhlV<<}~;p~4Qy>l+-(op3s2bGvTRyH6_B*&WaN zkf$EPsDC9+omHIyJ0*f$d=`Jc#XSvH03Mp2vR}_4_z2FQba&p;xMTe-msTbX;PM_} zM1XIda|_qDCu5~Yp5)mfA9$onT;WzEEP^Fbtcx))@a$mb4qd5&pNC(;!@?pn2O&$a z=9j&^M0W^Io=HsWVCV8xncTiza^pcH^tiGT^1EDYqRIC>$Ufn+NmW~#@QGBC-MCl7 z&>)5Ps7;_oeoyM-cRwE)E5~7I#7LHzNJr-7Ul%XdQNOpIQ6^jhiQK|}R>T2Eh7q9B z$Y=dsu2Td?(@KuR#dYItpx0=pO+bsb0W9fdU0_SXduS&sIjqw9|~`VjHiicXUs zBXiHN9(szvnXe|Y+%EnY+0pRH1=C0!33zU3mqUZY>RlF{ta*{})m;++gSbvTQylW^ z)VLED0ySQu!oU_eA?7bt{<0(yvSec2FmOt8Qeb<5;bN7np=AX$uuD8+ixo3 z6Vz4@`&x_r7<7}g_l175P1>8P^E0WU)vYl)n{E=yT$#xu_j zE;y*aCS=yyo9eG@W?O`u7a}YO?(SSw8%FIc{(SLljk3+Xo=ZHaToSzSIFIx(J$Ws)HVOQp;Hf=KhsjgTVe>5fa_%w<(Ve^EPgok&?A`HL~xEk_qyvq zcaixqo;G!$7p^^oyit-c$^v%Vrx?lkZ z;xr=vFZUOKuIFQQ%a8gbg11xN)tQLKCM(8v_YKpw_Z`?JYb3p4(gED~W2w|r3<K_h8aMyucDBZA-4_)PHk*X&zD{DMf3ceqjb5g1YNwn?*q@c z?Y<~J_q&|i(m693m;Y=UALlT>s4VkjSo>X``fGuOT_(TS4`GDM^YPf#{AWqvtVBXp1 zM4HyfoZ{f>mto9`P25WKp5L*=Ud-Tnj zutH9qbhd=h>0HTRET<^+?BxZkFAGATCj9My{lvWxqx{&@Gu*cO_R{^0DD#JT#_tc6 z=@AdQZ#ycc?gVWFL0Iqs11w&NGDy&WgUwZ@tOL-*9`F>(kV6 z+J1%3`i(Z^{p_wy&K|23!KC1lQdcp0SpxwQ4-#WtEO!C57!*-EFi?+KK0)d0xQfpCMKMBn#bQo+!blAgXC zw&Z+g04Q2p+2aH0_sxWbl)Vv_nuc%+6^>XktlIBK6w%U;Wno%vbWN0m2h0h0nw*VG zStd@mK`75sP@Zs$f2)KJff!=0qxY*GsN>-`dmNqR^?2R8u2&!GnC4f~%S%@dTAQtL zx$a0UmzCGnv9p|nu@5uqE2fcs5F@X^R!%`U9s2sa(a^gJHeXhf0yN`#dfI|Y=4fI~ z`KP0s+`Da*i5;Kt)HC4@O!y&?=b(Zlj1g`@=6Qp)BrzQB@sjRu)QKjefo1hZ>mm>K zPQj)J{GZkuVU>r?iE(%?PyIwIJrrMtS`FguwIJjel;Pf59YN&+b3+zSAl%Xrp}FC z``dBx9xeG|u5!_#A7-@W`ek^mc<|6xI(KKOKuxY%tW z?eAy(^OZ|3@6Z9_ZKKOumT^nQQxGsi(Y|q=kq>E?JJByd0+G&N!2(hWK}&k(v!kco zNGH!{5*k4`lW}KsO@m?Kr&r*fVq#4!^89R|2*GW^X%Z&!;8r|djg|k^o(k|2vFX+);y6uGd?m{wkj|3c%A8Kj&S{vsch&!Ed%JPZFqEE__9t zFwUN_OkAGKZA&k0>nb!0)mOiP(`o$B-Wz^4eEiHD{2tJ-X};m%G#6T@ahxk}qE)$K zzdM$%>56ewta&I-pUFZ_>3ir^v@=Ifk6$mWq&iM0Djdnm8X3jP5|x1ukktlX;Y1d# zEd%i)6b;`UcB!WwPo( z+pnVWJ0Pub4QaRbKv#t3xYzE89da>V(1m^PPTDTDf6zH>p07P-F|ZzgscSPfliRE^ zyk*6XKCBdizILf4p3ezabq7S%({tMBzs1$F9_wJ>e?@!XB~L4m@}vutGI-fp&F)2m!I8IF-bzPZ zP*AkGB3}b91TH{yEHHTqQzlFChD*N^@}wk{rs`w{(;H)?j#O^L65 zb||(L73+hE+={xX?5fyhpy&IPz$ggnEs{npM_TU=79uTA3f-ru=N(Qmyd**5Cy-+Z zJ_{S~v}1}D=B%78$Y;nl-kfXCOd#8XDELlKWBeBRs7RCD9Wjf$+9hb}4QbM&Bk>wP zARB>ZhE)))OJ9%;frbtn@ z)+KVICfH#XLECA^5s*kR!8*F$XAZSgbaOb%coS&Tvv?EoQE~jbGYHHS6F0PIa*YQt z4aPBDqT-P{4ul?)x(Xp?<2JfDG2lJkG&lrv$v8SAKg?hIUeJk7)oAh%93 zMpJ+ZdH3>z=sJ(?g@o}MS3{MQOth@H3YF+D-M($DGmVkZWsS2b+!kDh4)v{)KH%*ell z#eEGlWk-SIg}>52)S~9Q3KMZI>3y&;q-^e{(B`sLzst3&*4G9 z684ogT)8G!tZ*i)n0Yz`Z=4|?D4mhp71Nkl6;JRUP7AHUJji`nXk0}IdwpMs6V6sj z-@e!t-_vDHP0%8Qdmlsx95T<6DUdV{(coN95TNGi<6&_Zi#2#yYEx~5t-#)o4k-?0 zvn_M&wAYBB0jFCYbCm&ux#PZFg>m=e*C|wJ^*#4{=r<#iLkGj(i%u^mGiVpNu!oNC z2bKhGJX>m{UW!96mD!~(S9mvt(Q7kI6=B4)fC`%CXRoz9l#&goqsx>{EJ)s8!r6C8vdeF!vCOC zlD5t!j$i*UBzhq`YvWHC@xLP~P5|>CM8!qK!p6={#LUbL_@5XRGc(gC-1-kl#r2<% z>N6)R4CCKZsy{H}zw(XGi~j3L{>e80%z(dP8~=$jbdttwdzp|#AD>|u*F;m?C9+9! zCD0=K^AJ-WK!sSQB?cm7)UO`zze#G9!cNyZnK@dAIydUr`EV3f=i0e`$rL_Z>ppx( z!D08}bLFcwUai6|PVwd__LP`aZ)?jD=d*ds)uT(iqvzv^+qSe#wdp!sBlCf#51S;M zm>9CeTxuI*^1hCEGp{QslNk$JJ}f23IYlj2a%r~N-L-As97ycyesR$ku4^iry`%pg z_H$d|g_JUiu6*3Ez7*x*yvvNsV&r|=dy!boCfZcPS5K6}pc!~7cnl>QRvCgJI0}2& zVlzN`;&97rqj{_K0@c0r1^h|yMZ&ZYq1Vdf__@TxV@d4A-=-*oOZ{zwRQ(NhUh{s6 zy!yTHth`GrXn{YhUd4}+ccH6$rSdn=dYsA!%A@|mFUiW^X`E>)A4cg#>e|vh~qQN!3-c`WBW}1 z8PCST3Bv;5AY$WU{_8l$XG36PV#=JDTJ z%-?)a2K*mCD06bMvHWKfTHvy9)>6xO?4*=#s^C<$(MVMrsUz2_TP$8!w6v;KWlVge z-$W^PF&vURDF9xbZg2*1`YB_PC5QP_;20zsgcmM7fEq6qAt|-+cpOlua0C%%5x`y` z`}*aVkEg437+SiY(YNBq4!5qC^R*O227*jMLudTF1V_tX{k<-rxmL(R@B5uQ(}A(oVjvy+RFA0K9Z zXj1;zlM1w3f;H2LU&(D0BvqijXpICM`}7r@5WSdK z-GAlc3xh#AVN{%xi6{*2A>`G3d)p4{nx67Kg<}}_Wl%jZq?#2G6YfegZA)3UQT1J+ zq>&rX6}OtiJiIX>MBqxGz=&_T329*{CRDwi!GNistY?4nVqf3BwcLtpIrs7w()0fJ zrhk{bJlRcEN7Ph+hzSvLF|sg#xB*znie6~jQo4(J?O-OPVZ}JdTf%UCAt2^VI>K0a zG{&vw8I*!&Is&LxFupPUHfen)znjWMG+72m5~lDWxK(w=sjh3f+sf}4H-R6=6Prf0$B+-2?lc*BuidCenNB4u>&6!AR zmab(S+Zu}d-vtZVv&Tw_SKD~B6?$xDXun67Ref8Z=)m5Ze#=+snkfh)EAwFIB5{Z! zf`LHh35P|!^joy?nUl*yU1uKUUj zSR@#nr<@^Ak35jl=%`TDAVEnj8@KdnqrhJ}VrwjHG|3ChR1Krfn-B#O4X_z=%&^=R zRw+webzGGq)flMBFPut;cE8^iJMnlhgUGT_i+|T& ze8g?YNdysCT+baMRY+A`-gmg{Z7Ef#FuzEHMw7!2A)S1U{Dk>L3BDh6vB>Atv{7y~ zx8sELv*;S@g;o1I+06Jmv;*@qL;qe8){LfzCDN|25@RLeT0x$1lXnTd90_X@ED8e+ zIgE}9gtL#}DU7f&0fG%Y3h-=2iZVG-Gq8suTp@#4q;d}F)C=l*X(P`*i5dI^PeNw{ z*|JT0{x{7MF&-f=Eh(Ab7;Q?Zv!^~TP3l%@vN{0dtW8CA&BMk}R`{Zk2ES=@oU0ee z=t1DFzC)+wpnxp2;?1va%lqtB7CISi+6&r6(@Q0?AcBgL&j`;|k;E>(37mTI#n6CL zWmWI|)-}uXI`y9wi?&Y7`!#Lau3@KN=jBNn@S=aye8t+4Epb0VDH8eGJFW0`L}@$4 zaQ=Gq)Ho2;@iFhF?TP2T8b@dX$>hDii_R|cN(@TkdKE^drWM{<(BRK+(I&-SdWX9) z0bd4LlNg!av4GE(xq$w-?AJHGmV3VO2Q6*BFlwHKSh7AQE72BV@XfdiH`b5fja;I74y6y5Fegw}**Ff*Ux=*?(dEE|h~~weq?-qg zR0Fc`nCV&1jQlvMtV-x&RarZ^H8;O1uBeAPa>>33CJxeby`?#NIi((^xMel^N-GXP zfsW){w>EbEu9zykUf6ZQ*9?-WW?{j+B{-RE!v(qm2)w5Weo=pxF=khqmayO$2+3R) zPAcCyRZ&UPyn{D4L{M(iJU^Z{n|&x%cuBVUF=#d4P*(QM0d&ryW=cwX&PH~-NK;$~ zHUH~b#b`s@3*DlxTVpw}n&#=L^TIw)VXASt%k+Q>8Pg{@2Np{Am;pOCHm6h-6zwJS zI4tBnWM(iJs&BdDpgT2?SDdPL{3c%G3i=z68C)XvCMQN_etgOQ`(~_Nc4k8$W>RHI zB6TfrL?&oTpy|y2QGs_4W0?YyFiMKh&wH;3_0z$d&v~Z^7E|uqPy6lG!^K4fIM^## zPGTgI1#lq_@Trdw)L>f(6xI;_5b*fW8jz|2+r2z|*{${Qpz@W+Fg;(BcppNLD_u)V zHZXV7npYqF=aVsKY2Rp29>R^cjrlg+(S)g*E;vFu3=y|2rRY^?8_tM zI-Ka~8epry@q#c7xu}dQK6hg5)#6ST$n;7hATvgD7ck8$d*$bY7svj7Y4y~}$4gtA zs!KZoTvkC{wWS@*UrbnIMCg+8eMVNHrmHl)fb=AFwyfc~R9*O-e6tBUuQc-7P%7TM zrgbDL=<9f}k9ETA+?0*ja)63i_i!3f_v*A)yB3(VtJLmdDuSp`uX`4!I~fJ;cS6Gl zW>w8j04vtp4NFTnBd3KrZGpMS$|04t)FlD-^)iDvYq)H_l>=I+_ifRg@f*DQ%x)PA zz)pez%(gD_4L9`t*2NO$jZ}xuQw5+@ngUFrYrkZ5j1@@c3 z{ung7%lMBc)~we<1mUi(;+I{NXfa~)O0-3`<@v&-NJd7h z)|X}^=Q)e!UfmXmSNMl?93%6{x&pJlwWt1)^H)7tFjvMj;5x&r(?5EP&ZO0$<|Mi1 zjgN$mwZ)}`I9^!RB;l>2Y1GK7@opo(1);zW4BKG=g1D!@p@MNm;6XA3!UBa(WDG7VoL-q`2GOcQ9` zP=1!45NOE4>8o)id)C3p!^Jbk7dYSsc5P+t^BSwSV}*Pf!2I40fg&GYkCib&G)L{= zdjGg$=ncD6wbg60&Ez+jAM4O=oaHn492s}jUz-12vXIZ|F0-#KZrNJgm9R+F^KygV zO`d)BeWo)Y4mo1M>hPLYTg6<+9Q#42Z)JE>R#uZ9#pY(jCs0$TOht!q`WWPdVab_^ zbNAu$@(1pd>2tmpOiHEcH}O(u4$shvMPxs35e^T_{18L5;Bjk^W86hnCnJ37&YmrN1WY;mixpOk<;k89y~+FSxzn~$)kk&1$k5L}7CH>?t?1tIxA2w&{1V z^gh_-+sL!@tq~@`PugP`s*PyyG8~_@x#e~A8P+o{qQt!BEc{3au7(UzOqcWHcwnXL zF|-yfCsyfJW`)eOFR@K`nB}QZpgjy*nkN=dt{YZYyUTpzC){SrFiCrlYgVF4qS)dI zC!4hv(D2*>xsvD~qEiM3F669Eb!*JNv<@K-Ua$;iW$lVhwxDS7@7_REea{VXt_*4} z_Ij^`}}t4d5amS!YPj-fe}>X-^rwRYHNF>Iw@>4FVLy9b9tph;LlAOaDRKqzhn3KW;(Uff#>6sNcq zcY+jmm;b#_c4ua1XEq`9e1GTs+Y@GYcIM5y`tG~$^X_=&o3}3fY5B_|kDTqhDoAUI z+~#}n#Ds0rGuVFXcRF)T-$Ktb{{HtCO|$RErJY>yO?2M%i>~arUTo8gg9Wx7Eph14 zglQuZdu(p>Z|hbs?%g{#`_i6f)6d-5cxifI&+VRiln)C^ejurs#*m_X-5v%yIX#>Fn#k zJBC^3t=99!pRU<5+jRJ+3m1xAdwp(KvB-OK_Efo=;qmDKcTL&eapX2h04_&A6=eoXG9Lf%?xKRx}xvduQ6epA3m^SJf}-hkeDecd`1!SBm*iqfoz~ zWq$`8=^1iqS)xV2fYSZa-g*3~Zox_Ky2U`yD$DTyJwpU)6rA=@*H5k9eYJG^!arYlYc4vvNz_1(f6{()AHkjtWu)` zqXMGey?B!=`?z0!?ET@}?AJ5<9o|0d)`KD1Mjr1gzuw`IHt+Vn&t@-v`s?i1IhyWh z_+!xLTRCs-dUx!h|Bgfdde>}IV{Xa4JBIdu;e9^D`mw^e%^w@h88&0m+&;T*)zTH7 zU%675XrEtNTs}}MVM0Fd`QL2Z6Oi{{dY_O9v!CtG{Jcogg2WFqa`w2G&^lZ6vMk*v zpDNLH@uR^-pY&h2V8F-<m5JUU|{E(IX`5puxNRUF(>Edj`gmv z;8Xfn9{y>PmhSRexUh20+JD!y?CO{QQI_MIYnS?v`=1=}KKCnQ7i7HGVoUYRQ!^}E zRzCN_h?>Rk<%nu&`>S6%k2J4ZHP;&7ox0F-lEHFsWH%+r^ul@5}YW%OylTT^7&++iBlID}S<-iXa{jy&f@om=(pKBdm zenMASGw0&**T-j0+qW`4bM-M-=lA(*!}R$PbFVD0ZJ3uI&8tX2P-CA8VD%w|Ln8p>djGd8?K0l=IV)C*w*? zU)nLI){D9)-oG98cF5Z~M+WHUc%JKUyrr&FuMO804<6tZKmUhC*FtVo?%np!#);eB z)O>n&Z}ohi=lOR$*LIrMEU!*pel6bkRx7x!T-Gb)Mr^rUu+Z-zMY?4!Rc_0hygxK) zme;RI+D?0Ro7V06*E7?%e|-)udbGA@_n$`$8~D_>=+P1DpBw!;4NSb-rl{A@{Ql3@ zWY~B;!0*rWXRl{U*z%3<(#KENq-(e|dz9{*@P)(t#xqD>HQAvPB*an z(cKAYuI}DlYvH^(w*zx7pMUI0uWEZ<`xedkZ-%{omFm4s*Ez1!$VMJ7{VLTA8Z>%D z+}sj13uVu@^NLr|E2Dn$DCyTJOH6#n!1908>NS4E>NJ(D&w6G4P7`tcddt6d3>jfd zb9Mi2Tbk#6_C*ccabWkYG^_6~O5^)^@`#ExX3u%ntMrq19-4W%-;^Cv=J<~rhW0(4 z<-(9`gNl_sUSeJGl1U>9JX%@qr^?rJd5nC}e!n&B;@ZhGqAvC*=I6QV{kHB!&rI%k z_i@dwCu+u5&%UMc_zvCLNAKR7#`JEU-^JgnKJT9P$g`M|y{cz8Zdy_F?Qi#wJSlT@ z<%1DrOW#ZP_Eq$j(U(4I6Y~y?{MN8DWcvI3Cr(?IXB0mp2wAK%iwj;dTF z!v~M!p;bI~1s6+tROy=M)2LiwLDv(Gc0M%AquaHn*@Ck{a;(V%Q~H=mepQ3wN?$t` zwWUDr+6}kFMRj@|Id9gbT7%AY+j_Q=w!rU`W|q2mFfL$5<`{FQe!kV4?y`31Fg&D0 zrVgbOhb)~rB>Uk0lcu)snR%(#uAe>Pw`TC0>eJ)?Ci9?-Imf^Gys2k&6OX`;+9h{> zY&K<^_HCAY-|qRb)sx#fKF>aPE$UpZsR8Gs&rhyBHNZFO{NzW6RxKQKrP`X|44dnP#bmwqa`(om<1Wq`@Opu+a+crd`zAszX^xZnTyB8^^U9f`S4$Fhg}Ny z&vT%^aZ#*BA8*`QzialXHTUdaIPq4urTq>J$l&$yedW$uuQ%LTeg0>UYfC=Ykxg}D zCKgv_%qEjy7m&$aIB^}iU{j}QtH6k8&z823*s#DT+4UMoVtX1aI><`pU3_qfgUej3~aZq zQo_THNwt5>T{io`zz5pB19knLTpV$4M%P7!`?SeY)!e1&&7*zxe_Z?c_JfNi(-Pg1 zsjDKF^eT2`NtuOrdOdu%aQudcGkmL^|9rdcxQ3e^RIU0bdP|Y_ht_m1d;ayU%l&5; z{rA+SB1f;c`lbJ`7j&^7&Hdl~Ud8j+lGnXI6p5HO=ak?1u#=WfdFLE^`DW4fVTb!v zEq3u%thM^=sh-6=suvAzuy^*i^G&r2Jqo@&blIcT#XH=2TPC1bwwa|~JRI=2?Jmzd zji3KEd&lU%S)kKGq8Fw|Ry2 zSi2sXwgr#8_=&pBvVI=?!RFEQ(?QeQL*LE#Fgf(u`*brt^qBD> z=u^_`+qFNP>`~%#(HS3#9`<;9s9pDG-#%JD^26f4yA+=~zRR_eNw0s%^{k@bun*Y^ zl)h5^QHKMM|0N@~~j^nvU}OYg|E z-H+)*(5+h0SU^^1Qut7`3Wi8Zq}FZQ;bCCv@*A`8;2 zzxQ}#!f0tQwiLKCt9u_JQAZaNY-=V=!t>z83Hxu=Hf{h2dqYBK-TUcKw^QKA)%h z>uuJ^jD<7Z&b6p@NSaKY0(0cgSa;XG6@N7txUxj|PDATX3-qtH*f?a}_nXhuDN(U~ zOz^2`|K$Je{h%!c7gdT_x%cv>^R0gyJ}o@R@^82G;Z1_Wnr>Rvb9&=r+nx^}7qE5a ztE)#3-TZje_w}#iuKK>-o+DeIe#MKv8uZPX+dnU^akSRxJZXlf9XW5~$2?a*EIMn^ z7R}_J@ZrkhyoaV-nVhCa)>XaVwwTap^=~aYkB$0cN6AakZI4#0`@6@j8?RQ~UTl0i z%5ZRr|E4~sml@jDGSqtMGqK9d%71P?yCdx);1 zew_4p-P9*#;@8f}JMVDUnv+_u`#x8`>dmWk$@F%P(U#jme@n2bAko@Z|I7 zrG}g@)gWm0p*GhxTs+m%c0O!f`=LV?mh<^EspyUk>u+T2ADK97#n#?K;#YN95^Vjm zzs=VF%9QQTo>eRU{7Kcyy?ajkvG0V_KfcYgY-_JU+4{d6I(uu4&Jl&H9PhVi?bAk& z2d%9)WxYp@O-sw@CMKk5YT32QG&o^m_2Z46)i_Wpd-u})yENWB`sm*?mycSKE!4w& zBC{p!qh*Ep>NU1kJjZdc^}sd*p9?%i~|;`{6{L*G(is`b;O z75ScTY+iNz@P&OE4BWeZ!KX~yKP)hvJX?Ryi54YZy*zPXwzVT`qnDBd$%cSXxHCgM_l-`-^+WKXIdY|2KWER=U(M8!(I-1VTs;;X!4wphCfw1 ze6DlZZ%tWqw3%2e^wjWLTZg~6FsWj{=Kbqbso1EIUrd*}e@E|ayX^YSO;!7K?D+ah z!JqFA{S<39-!BpPYQxmq^>&SE-u7b6F;n#c(?>rIwOrJM-D}^WMcV+cu5EH8P7O`k zSo_6?ai8Ni^fh!yeAJ^`Y>O7L-I`rKxX8QG*0J+D(Z@#(qCSKc)* z+;j8o+Ytf%4sJU#dD2Fo#E6Pf%csBFs$2H#W~YL^^R6wrplM`KP0iSKv!?X$&he=J ziV=UGc+sTxqd(`L9C-g;aGB+&ybmI6aiznQ@vv1G!&1=$SZ+5CwvsUSj?iic2 z-uL8^>wb&=4KMm^XjsEiFO&3H_n(?D;CKtqtiP2hQ-9CFCE3;nJ_}eI@vPL$14+w9 z{4!$wqaeR?4?UXAn)ltjxdTtF*fjZ@S$Vdt)Ha2eSxw1zx6a09HM%u;{PX&kr3VGi zEcoNJ$9?i9m}2~kynEhp>#CPiP7RrHdf)8HKfioC>fgpwJr8u4yl$U=wR3HD>?qT* z?M%aplj~;rEr~q0WB#ogZR+^EO>9$npgY*jP)H}J<#>&p53?V{30bITYjE@yv>Cghcm8g&|d4? z?Wb~1Zd&7RQZM+b6s@*pohE;Dr zrQ_D1y5ZR_TWbt`K6TWGQ_t2$f2>uYVQFiT`}Z|%R~D~=$>h& zZ{O!*tMbo?7T^7FV)LVd+e05+S^T=$EbXg{n;Y&c6nVT~-11HN@h??2jLv!D>OI;s@$&126XGYFX?6VM)vIM^pDh)CFU_ZboTEOxyLPovpEPNgEnC|By249$bE8M!Yu{Ze z+jdscobg@8*RQqCzx0EAN1t@h>_2kr-I;6u>2x%2%M*GgFOIx3nKbXUYX3xDMZPvBre6p?RI$`jg;$AJ* zc25!;Ot{i+O|}Ou4_AMb{y})|vV+@BUhzZK?ydWH6#8pnRJn8CJgu;KaMQW1+Eh3< z=JCE8-)mbedNH!pyg9#WI;Y7vd6#F0kw0e4Gi%J_qV1l%_WxXF#gJy-49Pe6+&^QF zXIy!${&`JA_Yq~f4==JN?aGzMkKEEG-TZfLVehglYBkQ<`uesWQ>GRuc7AB7K@`S0D1Tz&n=1qs9BXIGl4%iv#OaN$3@`NdrOW7gvhfNwo<_~4f6`x<6FRwm2V z_&!(uy>#*E`7u#t8+Gp7<#kN86&0#?={TfKyBp8zj=6WM$#vu+mu*4!neYCdD| z=GeB~qHiA6{hsTw<;t+|H&Z+GnRocv$Y-5~C$7BXGv=R;J9gInW?ROmW7G5~P_p== zBZH=ASbNB~ea!;hKJ3``@BKYbF_UJgi-D!1|fT>VES! zyxsDm{xefwvvST+06 z6P9Dwi*LH!;r!(2--kT*-)B7JX{lQL(zdj-|GAXq!tFhp-u()lX|wNbP)OQfzqt?6 z?i-V@%Bi6lrULbqEb4Qu!2bVRM(GsoVIxI46ESFgT5 zwr+N@+wn^i*ZuVT#PFz0^@5f(E!6CXeBXCmJjeK{TP35h;E~x6w`c7>c3sAUn~UD{ zxI5s?j-kO_@BLLbG|i{1(?(?eC>u0$D51gNtHTTEHc<%N>;ODFHcJjlSj!no7#0}Z zQ+96ZYeXy|#FqxMRS#G~gRjfksS1`5U|I55LV#RJV@0zwmeAm1R-2wqxZH#6cY+n8I#k_szCGMVO9J7DvqZ!Q_7TPvr z*y|tuEjL-W#%t#F8kwdoEYYyhu%uUQuOA6n+%W0SkK4bWR>kaPYdGI}7GU}RUav4E z?V|=Sf->Y^R;KTprTyByo_VH=Zpb=QnKpGj#zY*=b?R8y@NWY4H`}sl!}}8*K4o~k zHRFt+Ux&7NQ{snz#taGUk*?*w-gOUcTKP@6r>mzX?KF(}FtI?{rn5{xpV|^Nt3R_^A z^^u!w5G@x^Hi))}CmVqGvlGWR+X6OFZL;C37eVVTw+#*J^iQ5@ueUvoFLW%vPrnE8 zmSZ=b#&5EY-u%>X^XV_=ih6gL;nQN8&(9C{^eJ;?-{PS|OKv9}3QHvS>%|dmlQai7z;CX}z*}$C*2Ck5BuwVw$(t*G@Qn;^)(M z^aBUCNyZe-wh)Q}qd(rcA`+ZMtK2Zp&M zK76zN#f0LMPFCC9C~D#F32!}ytt;{S{PxRQ_S{gpf5T<-RwULRmh;o+Vi~`?J3RZe zsk*^;=M`AgA=Fs$Nam>O14bo1`P{AZ_dS0L?lb@D!STNreVf6n=YbU)D^!1*H8^o} z!)DD^Rc+pX^aNXvX>m2``}!=ZUifyp%D=V^ZIkg~+tIC;x7jzPai)?-`dw~3XpL`J z*DKenN4=?4KknIp5*PNhZFPF@fSR{5oLN1$aOQJqzRSC{YVO<~p{Cz&k3T;p&cD{Yj^>1zYlGb+Yx-z=z-+Sv+y4=G5 zd(*Ym=1p(nTGu_YxMk$#nfG?Xq-dqr^-p7u?zy@C z*MJvSZJ7& zf&CjbdmI^LY2Dtl&xn@&hs-`Vc>cK}D*@#aF}=a*SA`x$)$^RP^ii`FilM8=v}w0L-12Vqr6(iP2YW7>a5!sSpIaq2f9yI?KeOz+GZ(a( zI^Az~Zph*L(~LdVq|4Mhsbt~5-!A`WfXBzWQJ=i3)o%87V$tR&A3uH>-#7gX&E%6y zTNG+jp=7a_FBAT3aQA87ejj&@|NhOXQj^=fuHWPR^55R~DEaZ95vEtqiewwRZ|#Ch ztBUV^w7o&V$%oC()O~kpQtQBc4Nq@=Q?lx`jfQfIe_M1rFv)Y;%1UM4{@BiNI>|73 zTitv4J3eoAsL8V4565+VdwN;e_K8*W6?Xj@)}+_`Stoh~e_MBXgZdknKrH#&h{Hv9 z|8yz;s&_FZyDY6%e9Fvcb;p$sj(v0MFbKAZ#XP6U&`gb{=F9!ljKzb)bPt>6Z_?r7 zu2r*}>fXI9Nz(qc?trGQ7%#_n5}^X2)!E37=&zjdMICypP?JYt<@QOjz7 z99w^QSf!dbPbSWbSUslDqY{=+r@BvEJ8wqrrwQr*xwLrsr5U&S-XA_MPnJ9duPd! zA}4)+ul%|9_)GFE)`%Z|tY%vrr6c-6Ke8P;gNi9cSl`o0S1 z){d>eC#%NO&-lrIz~|aGLyDgD^Ec&>yzuz>!^oeq=dQXmp_ApskX&VF`^3L*5+1#K zR6v!o_X^dTxOq^9OZQ8U$<@C_`WANw&%R%<#JisJmxUbH|Lk99PN8K#)QwwX&DWt^ zxj!o1`0MhD718tO8FD81wTXHDbjtbrTe=3fIWg+=!&kLdmcKjZVefb2URtuh{aE{m zXYFcN{YN7r@8hSAu{%EQxsY>%rT6k_^Y_iQmj7w&1;gk%^N$z&>4kCM#h{bBKKQlm z5&7zLsgFq;28_R%F@4&1ug6s`^7HZvBX+;N>)F3h$go0Zm*nbsXUD8O)6;#NJ^c1I zbK_|<=4sYdzNX1IuFunAIRk=6FWb5I^Tf8Tas+GZ`*wRW>aAz)UYio5R^G6b&z-kW zW|Mxx@p@s^dKT>!pFM8&nJp_`jeoIf*4+lJ_P2kyVg8z31%AlVCQqY2r|@AU0^E$5eO7n-h)8o!0 z`mEZyZELRk-o+la>bU-VokxFeym2Jcqpi`y2HdPYzxe7W-oNab(JSxu&b!WypE-M7 z(CuwcPxWg)XZszGbqBpC)~z;fRpl{%R13ONKj5bomMoRM3ZMNcXY)$?D{i~eXy)0` zt)5NmzVUpgrqw5{+V^*}Nu7tT*X4Wh>6@v))xVmw+&kdinHx7gPW8IHV@v$Yd&Xm( zw!M3>{=m4n^zn_i6#C}-?+(Q*+1uOq;PgGcJDqCs&5;fBr(YP*|J9R;w&sa<)_ecm z^F!UJfvZ0oDh~Qv8xq(yo!77J&vyzBN_bdeN3&;hKG-Tg|8Bta?r#r$`0?cF?G>&x znAT@j$@D9Gl|1ircSWPpQ=4|{Ik>^=g}ZmY*lwJD=8r$xp7tNG@b^y*CUq$to%PcX zMH(%uS$;veMFYQ|shM7TXseSYFAuloiu(C;@z4SB-A4}i6c^HLeB9d$zZ=_qQ}#l~ zQmdMTp3$r})a-nxOPQhjZ_G)2>hn46z+U4f<@mSX^DaZPRV=t8&6JNrJ1?o$*|cbN zmsMvPKbe$REMZai=C5`pJlOwX=FEs6l7<(WK1yF>@cHz%!@Wo9GilRIo$zmh&QM?b z*NPfrnhcx}kS^c!v{@7KC$#OAn5E$K-RFAzwewGn=C=2>z&=A}7O4NO**Cw`3d=rt zc;=e=7B#1ZrZJbVSG7wf-{|a{_CML0#yqCu$lo(Q?i|o7)Ap+);u@yak6)jpf0pj; ztP{Ee`~CKPm=XR%_Vvxz99z31=<{DcmY>i#%Xh06HZ~ORFvYLLs)HG}#kbp%Fm}c9 zxSX>~H2n0k#hzLbqoxh=dtlRl8*!=Py7uWxw-4_yEB(t}HTJYjiud1>u=Hd3oOf#H z`m_9vTHT8$l$bKlyGq?obt*wcgj;v#EUDW`V|cM>;EC?ppJ&gROSk4$iEcSY)ID6{ z5xk-OY44nOwA(xGX}M7}JI)m>4`w^fO@Lt3xX24#JA)ho#J zM(LdQb6l+$RP{#W=q(wZ?)#(BiKC-SSmsu(o~w6(dwsKBcv8o>Q@ij7O*h??vVrM- zu9d@Y%joxO!Utw+aO2{jkZMaX&86&K(j%HVO4Xzm}hI1?(v4> zM{mrmH}+-x{in6+#aGoO4mn+LL*n|@<8%XJF222)?#`AqGdd(SU(haMQjORqyCNp( zz2esd95+>rf4T75vMfjE?3-R@LU6i^fe%_`A3L}3#B$^MUK;u#INf9Iqr#WZmGM~F zs$;3R$O$$2M+g7;p?iUkO=ecQxIAw6jNFHBT7N#ByYSBHi@L69{%~&V<(u=o^Y9z} zNq;$MWr0bR#~M%iR31_}BtvMS?JsX=E}XdWIsDA+upV{atypuk{LU%8Hzd|M;Bjw9 zVBzVx_Akr6>1MO=#sw}Lm<_3qf{^QK9iCs{{rKUy#B+V|DQYIkJr8C&bX2K~a) z9*>VNU6i5V%M&XPY|g%;w?1$Nd0P8*9S1&tdYcXM!& zAtTG?jBI_cUcZ1Vv6^42W+}Vo!m@xLFJ)a9zVdj+J=I3Mu5ck^@9J|Oc57JZyFYrB zD%~wXZn;rs9f6}vQrPfv}*7X7FdMpI`*Jl zaROUUw6yAS9~`vjX@KPoy}<};G*;I$SLJn8tE-7CnPf=j9nR~jMvG2u;`+;>h#|NM zE^*k@e@mo$9#(4Tr19FdcWW>Dm?kKD`IhRKelY`dHptqReaa3c9n$f_ruR544P-TJnhcx&$nOQ z-n%L&?)1$(Mg2bS?XhOt@1ri)Kffh5dd_0+{C`y{@#Lpk-S1xVZT|4ZrEJ$)o!x#W zVr!Q(+j_qJ_RrP1Mvg!8OPkY6180BlvB_+G@=RN<|2g)8DaiH|s ze-9hamLG7v@6b-Yi*(5NV9cEcuf{Fg{x;;m%+DUvKel=?;lZ3K2Oi8RGTu6%^2Cp= zmaiW$Jg&s~>WeGCFT3YKu{q<w7Q-HX98ZtIndeg8rIe*O>*^4}C1Keu-;w zu+vgaOXt&0Cus%rg1+Z2J zONL|@Abf-gJ8ZNglWORMk$r?+b7t~URK(28lU9Cyw1O5{QN_fMcl+i+J#4`-etzB! z!wqm9{$ZmH!%bQ`XNOM)A1(gDdD#5s?H?5x+{zZy(c8aHJ@3}G_!zi2FvM1y9vad^ zEmGK?=f?yoCE{HC;d*cXz$mQM285<@B;5$(cIFkBnaAfU)wbAQXd$4a4zngWWJ&hTXPxL!&&kU>D^gC?_ zET(l}P_%a|%vTDfX%H|ER_Ea!p*Ue}{=eiNY;&c(hTJUaJ$(rTs4}I_B^9ux+o1vm zLb8wyV%x$E>0d`Jxe_2$0=w_ByO2h7beAHTgxw`N@%6haRs^%KPkR3;>7_oyM7;KYs2&hi5`IGzN{?(zB>V$yr#*xtm4{hR$3`>p zZTLHr7Y!odI~#=ztUZIuC`8KPa{V*W@Jpb7W}*Joj*NvEP45HKD5%g%5N^98<3<6TPhNy;!D1mayb__aT zwXg@*rX9jgIy$4%L4Rq-;5z(Fe)oZMa4-4J34j_GNE{&&+l6b%y_|S_4xZ=N*P-7z zW5~782biZ2W)TL#wa6emhwWL+E}3I8>%8l1JrsU+v&cjPiLM8-7> zlN@*f9ry;Fo^eHZJ(m);Pwaz92=67_1Oq1=b?B&+a|W}~3n92d9VME`4VaAlA_GQ_ zD0mjAOGCwns(}nZf@D;Oi2)-6dk}`+c0M%s1DWb_DPT?6Pv10GBH*gf{s?Zyt-zMGydyc(E zj&RQ5QKAauJ6;2A60S-(MxMp)BT~Wpu^)^>Od+9(iRHb zaaJAFd=WzocBeoFdhUMdj9TP=snIf`kU&r^R1G@=QN@4=J5kJO2pNIDA%R4tkO|O^ z0o0DD5qu_Xv19_u?@Tr4HzktQxiM~zmd=au17AC zdyym1umUGczCKRFIPr>nJRu4ov?bU|@l}Zb4~T`iv6rvJPAIWV>_qiN#G>pKB%PYJ zKtdLj9%=X>vMCs&p2Nr%RR&%hYj-e&Q?4mDS}a~V@d)c2 zOA?Aj^f|Oa7)t^gP(GIAbTjE-pNJ%p2BaDKi~T3DBuW~-5E|Wego+x%&4T7Wk|A}< z2<{P`22(<m`xDJfwqO5^mR$C$!hc> zDR;-rO-7SdVoNhh1T`3jGkhMA5_3W#?PZ#Z*JA%rOUdsbWxHgd|Mt&}cKl8>18ISC zcpo{3nuF(1(r~oY=5*4`P;#Uy8swc~Mv`|BN!6k2bkM+8$UuIAe35uQ=ql+Q>m`v4 z_70z6RS-KN>a0WsQB){0{Nv6-IA-AQ%w3vU=ZV`Cs+M}kVc(=Q znxN?$!I(-CPOPhB5sIeX>xS9FVLb*0myp;f8!P~736bz2guKHVW~Mc@u!7heBGZJ( z*cfkrfVA7fVdc%cR#+s0+X)z1s{`GJ^gVkG6Z=Nq>;%~ySUv^CA=>X_@B*l^kJ-y$ z(vxLG@5Yb;f^@2|s{$jC>8d~WlIG2X-Gp{<7p1Tr!K_lIojRd?Wa)*52oJR4)|5L{ zFA9=wB@H@U)qz6;TVPjP6gJOXvb*er?gK{vTS2Tu%jlGJMKGEhdzWo z%gH3kDw=B|z^)@mQv!FyyB!=88yJQ%XK8#)mI;)FEO@zYS;8Lw$WQ=fkVg>@2A>?g zRvAge&PNZ513-bmsF;QkT@g$o@JDRT5U?Lm2moBH$fTSA1LBdcNiC+=vTS9`dy*EF z?WIXWLNCczi0EzHku6_A1pySH#ElcAfoslk=`%SA_}I9kMchGxQE=UoYZ;N5x2Vs_ zl953NYv3+qg!U$ui?Snk$VHA|hQg4vh*!EMTS+b?demwe$V1#LSv6B=mRcpngNS(7 zxTCM6B^0~smR!n(yb>EiFM-TcO)k^}Ld+!%mxS-(mKhc7@{uK+zOY-O;7*IL5=(S# zH+11r3vcz-vl|UjP86OhC>$ntB2O&!yox^N;t<#q38sW}!cXp;It=I=zQPYyw}a zBYI!PH3%3)nnaLZ3Id|GLs#@f{s(MF;?JEbcDYF!eHDYK@#HaC?|RU|m$OJ>Eb=%7 zig`F7OEWFOBT+7Lr9z9utzo(s*L4Lhym3d0v(suR3#84ejAl$Ug84Z!9|$ufAuXx@ zDkID|%?%7OoWYaQ7QZ_12)Tw8amk#qRlnat( zgi0GHN(Y6%8{y)XxR8mSs-mzc^qa_9I_=s>MLP<7g>!EeU==nq1Z8z+*3_7 z5T-(eD(}ip)8sY*KbO<<>(ol^Kr7+A9s{pHI z&!;8`-`VU-%s6E$mQM@Ol~y-$FM^PaAg){!&e6LpiwjXGasnzFaszk!nIw@brcrrp zf}*1_p^+p}1CV}Ujrh|h3#Ldj*LBs*yEF|vs%p;;Qqkwx8< z+BxBlMB|~@suE{;S{%wHIr%D;v^crNbyvB}pzxBkWy}(iegXB6jFS-_9WJH9BTcz} zqCj}C70n;s@96a8FBF~`Dq%yXz)4enNqLPAblpEiv!HB}Hi*XOxzWnHdMoF2$j(LA4RXDuNOX}BL6VIme`R<}wL;2U zr)`?zIl90n5QmOHGnSM}>9{D-TZcoZ`!yvdOdjZ(6^gv2{E;@OY^ZkLIvXhP7G8KO zGg$Kd%}%^kwmAWBiQdv((;{)En!jZ`u*G^y9+*mN@s?=+SK_U#2`djh%6d!PpjcRXC`F+}F=wuxZlV{FO7gpqK9%7v$?s^T z+@+1U#a`kT0EPDT`~sz18tKtTy6&PPhZ&P3>Z{i&8?1xHj;t8>f@Gy0a?>&_rt=vmXMQSAG*$RX^+>9+%0}wor?YheKcR$*%mj}Y zn{ei*vc(Db$yC-k>Ps#^T@Gb>wl`hM59P5(g~fzPQk8`;)h(|;w-bxB2Uu*?LjGDt zWyvV->=j5Ou1!wBVy3dhGm0LXToyBxC1g6QtnzrH%umV@Cw?khrCnv|Hf#}Tz)zBB zm*J=Ud`wRoaf_c+W$7Mp(Lt}?7NnTuXu4YqB_A;Ugd+=`Y3@p^C20>h&(s-eo73x9g(@gMNWZfH7V~M$XX#lX z4t)6=yN0@7twzskZU7LNJx))>A|X>xkVdZQbi!s+kf$4qQO*lPdKE0F{OT7gouT$b z=^B9##|GK)vl6(OUIhUu?2Vq{u!u^#*&pf=?09Ukx)LCvYo^=Hmm&j|9*dCXI=0}* zs6bp)Bg+$Q07)Db78+sW9FQ4{c%d&RTPII+-Lo%bibO~{csC+FRkK@+EegQTu(Oc& z8giSmcuOh^*IjH~2MtqCv9wC8b8PZy7(v*@cKP^XVHW!?AA^?#UV_H_J4b9n(LQQ# z60s^TakOqpdPd>6?)8jrKjKekjzRoT(wqW20)xWHmM7wUlJit`VF8!u#waPvta{ic zMK?xau^W@chwT3}8-2XM3&NY=yrB3YAp_@nvan~p3V1Vxj!A|n&RxlKX8+CKankqemkj81UU}lJN=bkA~9);fHOVtr~PB6*A`w~e) zSh0b$ zC639V-gNtqgluIsVTd!m5b4T$ftUnwV=ACepW?P z-BGbz9NAtyZ!y*6B7u+U3Bt{F#~gBzr;`%qlqgd};ws98BXMcpoZH4JltPawcvde2 zxN zW#N!|6}&4q7$LmXAsFc%SG}kY1vhDsWV>WJm^4++^xWMzS?SPqH-% zJakA##>E1qvT#+surQ*GCMw$uVLb?h_RU!`%Kpc0Gcv9R`YRp%RgkqJ$q3-JU%_Ui z!@sZ?m>drsl98uW7G$ee$?K^|23e1ik;U8Ug(aHgdd!9y0shs_Mv#nj{1=w~k!ejV z85!kFJ)4mR0BXQuyJTEZ$}*wi(TiNHV2O&}j1~+-$q-IRJ*66kmrF**^?+m~8=m!6 zWeXHbMn*YPO)}DLfO-{dsUtMA%2P@xbMiRk;uK4Ur>}Y5TP$^w1y^XBNrob6#e)JY zW=dyhDu7jyWCW;HyBVgQWTX**3b5578F@ zA5JV(+~>@uY+$c^vm1*^anz$}FZjSrnfh$vb_viJt(>SYe2_(0>(vm^^2LKv90sy9 ziZtj^!CZ=!kywdXzm=7dJyaUckoTdumKw{BQ@E^qk5kHy>%1)XggsxslGry&N})eA zCr;PE-0P1hC(d5~A_+Iuki;@M@e~W6COGU17%p<+z$gnWb~tk4Myn60I?Qt7P+<34wSB`vL%Dw{gt-_{{Wo24q{tO(Yw5{;i~qVyu+mTW zDA2_Z5tE?Gq9T)0s3cNJ!TT4f-bm*zutQDp`Cmz2$g&T_#1Iz3nudfU7)-d95t}s| z1PE3=S6_%TB||%uKv8T>NS}d1StVAkXp9m*E9J}qjv=kQKp&_;DxaRYB9@~{Bn(u6 z9Fb7dKoH<8A0*%(dr=qEEs>l08Jym4Bu2p5g(C=(1dU4)2L=@gs8~2;M*p>hBbm}0 z2u#N<$;eYGiw8B3*B>dgsw^2YKZPYf4j~dtT?JdoB}1{VVm5-=ND>DIg5PxAQ;}o@ z=vBKVDo4c0F&jx7V^D#)+NWm*7nI5(Q|ZO7>7~ggS2n|-T;R>*z$WxAg|-xK=ml?{g_H@rhZf>lc8vlI%3R4?&T$LdpyTrRk=} z5n8mpvcJ;2S-K8RpXQq9jtPJ~rIa%1%9(*&tk5c*no-=Ulz9eH-xZo4ZHP&WTca36(prtGQ=5)`^)DQZk3Q#l#Dc@b+@*u3rY>L^qH%$rlXjG!r9Gdr~%sDO&EZlUwLt}L%N?o!X)7>Wr;LgU;#5ePK>)|JH<@Z?D_t3)PjfAEheLHi zDTj25ha)viFminFyn;ObW{MhcFD+iKbSyCR;COpRaV84L8JXzLmkA{ z5*{kM2!Ui|DW#M-4Rva$U}eb=vxA{dw!o@E4WvgwA_fYaqhjayPJGXhn0yrkm`E@b z-6w8Q&1B@k?O26U(hm&F-7ye(vJA8kq*RI3aGTCzaBzz986yr^RHH!+k;ld0$f+9~ zjY|Vd6}Xp33>3! zkH_RfF>+!qI&B9rsDQo1auJM{T+(Xh;kI0)5vmFv(jgalIw@gJZc7cbsVo;ZD>v}H z-C_$@sZiepM4>b}R*nPdu!$~{cY@=F4SeUhfukbD-BJNV3MHHx@}(i7eJ3<5pwJ|- zq*E&P!M0l(D2h<5#A20mBe4gwKbbvwWDs_$C_|s<+E0HScEQZqz`>X>SEE(kX#FuU z-&7EQPI>GUn<>i)NrMR${AOx$#{s~x?^u-Z0xiL{q<8>Fp_F13!st*kJ`)I*>(+#n z83gz>`%oa(N=J4y*|`c>s*uo$X6d?T4o~QUQdw{r6ggCGm3l$}YSvCEuJm#z#H(3I zdaMlEu}emfspN_ZjY~5EDxfp5WMqPo)RPR^o+=?##gW<37Zkeaq=vHPI}IwZPPUTl zN;rItpH(1|s1sQlR!}DvKG3=((*8QldsHemiiAVUX^NXnHQ_kTd(=vn+9e}Tseu<{ z5zCugtiU}*v!ScQgyHr@tr}EdlZrl#av$W)nBgQGw?YA<0Pbh!B=lE; zTQVjC?q?Lh{p?Mqo^T|%CHgc41?N7^6{WIRKYFo3t4d~L*V*4OE_Ey_r628%)dihKQm0Zn>d}i` zs||ImMghRmPAK?3!gzG7lo1m1HNqTJaqdA!JtM6;CzXrTdnE&`W+b?}uO$~)f(Kg@ zD~$?}Paqo-UQ1~;65^a?qa1{($cDQv$_%M&2o6C(?o2iWj3?nFtO!e;4@`)aBrP%; zUKJ1)neDoiYDOc)BpAul6zH@Mdh(PS31v=_QNbuGONK%~z-lNboFt>{fVej!phRcM zNHWw$6~vZUGBV1UdXkZOi?2$NM~B(S6HAG67LLlA6^Te(xikuZLg5f*NQFZjp@KSz zBN8Y5R*XoP<3@MNo^7N`iM?U-3$fc#0bUA)>xe&`I+e`$LzrI#za{CBa`Z1vF@9-Z zfIpJw|A&!@eUBd)G?=n9DQHxwO2`eFR<4u|3DQKKQ3WU>l(kV%%`fE~b`_UMQ*88U z3N~SPvGSBs%ABlN1<=V{tN_YsrxXGc!g^?uaYAavDsRKKOGd^YV*XO1bIAaz83jN! zdw)~S#Y%A%^l5HMMwU`QKfy zVnzW<%-&?`Nk+2BMxUm@L;E=6f>K$O7-fq>tBT%?qr?~|q~6Rul$epO%8OkONJg6G zNCryGC@4?(6(l3gnUJR`@X#R{vh?RfDX;t|wi&ljVn!F^3}HP+0J11CdY3|vp^Jjd zq7w_1<9Hh9VD!P`c#gj{@;5*;YsCJs)ldoTDyb6&aWK-IPhy6OEzk{!1B62|5C<}2 zaDq6{C%WdG&~vBWoC6qX$Q6)0C?;u23o2=Yj|BJy9|L zDOM7dN{M_(7QCw4$ol~9MG`Biyi!_7laay+sn+opmH8;4N(t029gtKon2rJ21)Ut> zB;lP~Ndf_!Qph?Ed1Q=`x_vcNAj_>$q@I|IP8d6*3g}EE7eNg@dv{Y!F1XK4%tIAe zrb9CFlv2{1!WlK>C>@YpNQQ$Rjk3r}qZ%%dOGYqEas7su{7T7JPSlAdL-IFbS*Mz0 zq^WWhSf)TOvUC~==+9X$c(H58&nD!q%Pdq*Ir=48Uk@vl(OMp{hpEBRKZ47W<9Mu!Q@Q)-mO z)frU)q|CVrprZoj8F^tt#tCUSqJ}zSgB}GFirEN~k!EgGkZ~f(@Io@U)R$u2cbSJK zS$DA#s=*WO6H$3$jk3@>qY8#pSvVY2V&wQeNsrM_Dfm||9NCfDX~`iOwfBs)dY@R{ z+-Z;V>i4MugQfidP)u{kTRV2e>64^S2Mm5M8myGO4EnOrrC8NrnN$~dR zuV6NkFqS?|K?5CnM7Z7BDlNyZE(;kXqC zm?)S~%t=T}NJblzN)}&Nh!L}0ypc%1+s=yCh z#74$oS+Zt<;pC;4CIJr7-F}NpY{83kT^7_r#4a;WaW7SHjdraUU>aTY&JC@Xd%Y`z zqd}%y(lO;d3vyM;zMO?5F^q)B6nZnsq9jdfNJh3)Vxm|o;x5Tw2IABtK%BaeyrZMS9hb`W-lS&;%iFhl1h-;72t zlVe0-8ZIS_U@={@RX!R>8Et~HNqj3j>|%gnAD9c~CwAB>h&iWd045tLjs{fFh%DP@ z5&#iR{Be-5mvo#!!CW)cJ_OPtXVl^F){-Ci$*px$oSTyeS3&lrZpTb=9i#8Jaq5@~ zfKjM|CJI7O;+nkovlm361}0ys#-KHEARibGP1#FuJG27|;Z$|^)xw82aA z*JDe1?AFSzN$^%|yUam_q+U`D1<8GppbDkEIkAx3@RE?Jlu;pC0>Q}_si08BDx~Tu zzrYv4yxhbKT}n4;nbgXH+Fg*mJWL$&DUmUnm4a3(j z61F1picQRMgr~_%_+a^WJCJy-%YnK{^np&0sSZt>kruQ8DYmzN$X;LX_$p?1|RTYa`W{Fx2(`nZn z0%{O9mwe5Uod~%|U#XyK#hT+-JhyXF+`BLE%qCfEsfl1b6}+e2C(BF1#EV`^G)Fl$ zW@EZ5&EZ~97Jq6|!Jl%?p)g&ss6lh2Ge5Njd9FFMV4}D=v25HJ(_uJ~@i{K?i^%|% zngoR-zlP>8kd|1+D!^NZ&ykmeiIzi z)51Xz(o;pl*R7KCJf~|<9<%d2CgO3No-LYd^t>L2o>Vk}QAp1>`Ri%k7|-zD@Km&( z=l}FP!AM_KkGFFjfR~)HzH(@;p4Zicw`{YYcttS!cH@>>jh>@g=o@`;)_<`NU z-qr|bc%dW%%f-U$RX9U9M+|g*8ZPFwKG@5c;0&jfzU>E}#S_>DMwiCG<2U*O3%rIW zZw!1t2P=pSKXHF-;Cez!t-)QirWtls#YZ)1dCJ-0}rhwn!Wq3qX8t;~oVYa4$y}*msi;9eh0qBT-U=j_|@WG-2uns28AS$9w=Yd4+>U@*B-f zuo_|k8a+INnFqtBu;p#}1MLD+Nq!*es9|~`f1qTrExPQ$+!0IhvlSWULzsavs}djB zK5(|foF6DpX?jeBUD-KkBXYbniHf8%zV4pXCFJ^O5zQ4LIy~ zXpick<9cQgY&_!QlAfuT{X74i4Oe=4)Uc!0)iFS0Las2qbR4Nh^P$dhWW8ZZs%Pq{ zXPHkuQ&2rqO+8aecsmg>bUhoB^-MqY%(v>9hQgGQUdLW+pr_iY(X;Se&&C)%(@Z|_ z>gm267>HT_l#ejt(jk)%%I+QmG-l)$8^QSi?)u1N$;Nj+&P$H=@!xTtQNb<8#gRt| zJV;)C(IJl-$7l zgMrySJ8BGUBNeZ)PAi`SUCd(nk(Yhu6{Q_V`W#xRxuu3jywYQU#uvED!(bi-yMLr3 zB`>>5i=o2Pm?b!l)O+$mlSVe-;k6CzM;_UTj~X6}JC4-Sctq}eWc^|@2qPPVSgkJz znOJ|==wf7H4*=(gmp3xqG_p~|$aK@l;u{|KvvM8wd4S_Q)dmRjFqY)A13o!$9I4V7 z*cGU2_m3-T#k_!^@HtG zqr1mi!d3?=4z_DX!#CtOj+9Qm9fVJJIP%}|oeqBdJFpMKWIie4uvrd~=D1!H3z^+K zY8=;555}ih?jI>R&^?T3`NWLltvHm6W5zgS%yFJdgTr<>EQo#Am>4jDV;(rVf`cm@ z=c$SFg=4-%ZDK3b?7YUrmhkxMAYXxWe5b>biG@IX6^Ji0IldF)(D1}F&y>?lGiU*G zeKdcF->J3$n~Ykj*%0(;+1dh3ba@D6(b791n9|blNdq_m8q`AwqNT18f(I=P=3&^^ z(m)=DUM&qlV0eT0oKA=U3C%)x7*u%Fu7Tl{1?=Fg;Ui(51`;kTOb3?>F*uzCgZp8@ zxdtZxEOG{~1|Ny&!6Cs%V&gddVj(ZM0T`8OA0T*ULx%=#vHJ-hP-bE)8t_O=kHK8v zBhd*B#Kuf*Kuh5xy%xL`QxZ@Pj<(T&?_w$eBIW=EkPdvLJp(;rvetlKW8%~Rl7>l6 z173~^O#{FkCNE6@%$02sU2#UNF%xoxIRwlGL_?au79ANI6>N*vnrTE0xwFu&(GY^N zFqs_KdbFO^0M@g0I6WWS*ld`+d=mzFs)?);75Gi=5159sOiTbK4q_u>Kn8-onw++m z*NljWjPY(28x)h!%jS&$1n*jrQIM>FS0KXw0YF7?Oh>cD%L0mJ@wIsQFqE_p)V#+x zW1D>S0rnh)U%k5Z>gjYQU!BfUSEsYWzD+9xx)wNR!Ovzm!f=e|EqD!{hwF6k*=VZf zUB?z312v_I+IhF{@VyqE3r{gyy(}o^07#QW#RkXFoQ#w*)Hhr!^@JPvot-C?!#zeL zqn>5X9n_l*R?;&m^+ugYuBgt*r=H0b-gDrEFFoMY8}+~y8R|Jj77L?*QHU}`xw=o4 zE14R6MO2|TO)*ta{oMHhP?c_2e=eXv=wJ1lT-6%)6 zp8SsOfSm20eH`r(4&k+M4)4QjP)`WQ7&q~|T^|fwALw+>p${%O=Og4C84r@rIc5z; zlNs&W!8wcGODCfb;2EiA0}GHMGjIk16P<}^yrmAKkWt zgF1$v;aWSF^o&c)3p%(23%-N`snr;)A}*mPPCl2I)j+WtFSC$Kup1G4h?9O1ZXo5T zV<>YbccK%(25vP(Cr}sASHKs-8PqADnphXMfm}dtA%|IeqWkb#yoTLJ^c1dD=a@^q zvWPf_qfGKS#`OyPj77jP80gXOICG3s!MP^zFN7;H`a<*xek5ZGP%j*7$UVquxQ}>j zXcx~Z>8qV%I<8|h#p%#7qXl-K0yR!LW)^V_qn6}zjOiHce#3FdZi#@`L7(QtF*8z! z+(HXMF2E5fB)Y&xSp!%jp&q%5`tt?)MA}AO73egcBV!%5%XAo@r_M>2x@Qt`661p8 zbCT&EOdUkA3xM@xV;3_}g%(RFL~a5#s9W3$2?v2{a%6glT;{$EIfB38{buAcmk3^q zpIO`JC&@FAgUn*dcld`~Cuke3nQ+mU=^~2)9l8iR)X0u#CtVape@<^Ub1z1MSO{1G zA+gTBM-F2o2qw}0Iq4!yrYN^i&!FcPqzI`*Zon8zsDx{Xo}zAoUg9~zQM?DQQ_@Z3 z404=32RTaal^15#LDO$c=TZgUkAP~ z)wq>n%l=~SnS6a@BT|E2#Jw+y$IS-4C>}S1-;;~SQ`1`QBM9gq@s+5DsE9$rW_~H>dF1W>#-l$9<)R5fq%#|K~#2*TDg_e znX<#mEjlZ1;&mFI^`bcj$&I9(qgK6Wj$sC$2>XbgtsJNz)FDOa+c=fTL8Kh~q@B}3 ziZO!5Yw;R(9pN zPo*P{UN{c{>b}H>n!$$(=OGrzH^|LH%uKHcML;5*0czEJK=o8Vll|iH_#d|df*mI zpCJB;TNbl&u74Qw5s9$Kg` zE_GTse=$4NSaVOOxdgyJ3g<5t@EUUS7f9ICcn&E5eI>pSsYKmmR1v+y&%h!4Ohy%y z9NbI31J&dllM0a%whPyid$BFB6Q{UQhQnl3LusMkL}??Z@ekXE_VAg6yDqbqK#^>e zq!-R<%w$nN`TA`&K(r4l25^Lg3#8|Ly7s zo0bjnuUz+-m|oG9y}f$}21kb5V!YsA@A44h38Fl+Q_Vd0wBvuL|0#>{|9ASI!YKQH zMt@S4xBlPZf66k{|13Ys z7rn8oj1^wzH1?v`1&>Rj7@4>Z$5r&u*g5rdq^zVd#-Ib%I{{ApZVoL6*kRBX6cWK@WE6kjFu4hoA5 z@lNO(?HSkI7G?A78flC6>>V2z78;Y_85kWM8x%G8rgIMvKd%JLRDl9lFZqQtYqxq=a4n< zCMs$bXl)o)GjWqJ8qV3p$tN$sX7U?83t1_=AMZtrglF2t%tR-8Cfo;2gUZ97TUHfg z3+@iSGa|S<5d!S2F?s9s-g=#PAK0f63w|>=uvcgd7#93w^bCv$3`>X(jg~PblQ0cr zCRmpg2nO?#5Q&??mI!_TY>5a4a-_2PN_1DqT*fTUbfW7hAapOtIHu1i82hR_G8Kix z=0n_#;k`ro{epDcS)X&!batR{@6!gY*W}j z_I#1Tz%#HP*oJ*>hv#5j+dbDA8WBt++#@hLGQu-3#unin)7|E2_KXeU^v2}JVPV;z))=K3LiXCuVN!Y@f+R`VOKP0pUo3?^qJ)xhbZSq zvd+m@8Q7FT7S))J*q4bcMw9HK+W*&?|Jynv%4(9$Ps!IA?q*=jK@^_e0NG85+bm|2 z>{vr)Qs{GW%s>+dhfHE4Fh4$qpxL4Mk|Q%=;+pU?`grCVa6I7wfE4v(!gvtJ4ZH`h zN0Y}G4BEyqfQ%d178^6T`ygW#+(Y_@ZUuj5ZXsD~#)2^n?;~!9_nWUbW1o22a3nP1 zHSkRA9}QsK9h@nqi?4HqY*nah?FJgp`_Ruh_6K z^fWQiwy8Ll*a(bNr-YSkhjA16xame1vaC#`1r`K zr;tg%z$!@u2$pI0G*l5tTHlHDakyFww^BTbQzK+y0kB5WokGL)bI zxe}maq0rcMTv2$Uj|?5CVE89+|8Tj3Hte&&!wHoO7wgD037E{<)IrP?gq&w?$uqAaq#HbGb}JDnh@TQbX>)E51!86Ke_6~)adnn}lf*~6e8-~dM2)W^U znPiVql6sXtBcm>gv zkyOk|J_Dc{0YRAH%_QHAydwt1Z z19h?B-AFPW1_z9jAXxFGn00iD5Rt{19yfkheZE z-4&v>zuZQmLtL6jBn$wsFc9e(9T*W48SQBVv?{!&!6aiTqOgcms1fp^b|5Sz!LmHr z(hDIn-MLJ@HjV6R^KKJuYaSbe2_M+-+q{=8f}*J4%{EvXi=Z7NAp4^w|L9;-F25T5 z2+s82%}aDoE3Y^PaRuE%?%gCXBBY!x!m~}Q@*3}^fl)mhMs$k=uoix_b=AU7Sepcl zB`iu=8|I!dkx^_zE`lxWE|t%F41gQ(kBaOX8*Jm(k!4hz|6srZe;BOb1ewh9aB_~n z;o!{%a+1-9_6%S&kgr9ppw^P7&QeyVD~m$lo2TQW zY~7%i7%ZP@z|*t;AW3D0ed67;ho3Q*f&V$qLBS$`6G_iuT?^qk zz12W=tN*{k&Rxf?8;YX+e1#j=k#u$W0D=IX@wiQqPY4Vo2!a5P)8y;34l8jl0qLXz zzAky*BsVu2o=^EsL2HG46tp_cn6z03fA?}E2TZ$`+a2X@8Xs4^3ua(1hwAcJ){XZl zcNBQQM&n9(p(sAmY6a^m_)Z%O*XEJNfU(?rITqt6Sc1LWaVh+dopx&_FF~7y5*4&w zPz6aVe50LqtgHG#TNmbowm?6EcB_q=ppBBXpt0d4S}!n@+lX ztOs*i=Qy+6IxY}(5xp$eM!hMrm*d!v`{?x)Ym{RrE@@os(!3y%?&DU+KchWtr)Udi zGRjpxG3&OJX?*NaC}dH$`8(QC4>|1R8as`mEfl0Ex1cbB)-8i=-6n~0t>8FvE=edfnQzeDs_7uV1Byj^i}{b#7Db{Q|6aucImZcM!RVhx*7dQL7QdQgElH{7PL-elC&q^F&7ro zUUx1uyr5x6v%T4@JLl=SA~;Ik#qL(f8hs4&>FkAWvXwh73n(dQ7($i1O7D{3(OjYK zC6@<&bFLdm60%1J;Zx2%oK{yo_VHo(H3w{Z=9+`dh0mFFEx*ULJ?jJiHR=MTr||(B z=srfl5ba|I3Qps@Rmv>OE%d{v+Y9t1XzfWKr+fzdtBUfX?kq5?pp8Oj+-b*xsty{i zoyy&`ZlEYv?C@B(bXehAZZr&BU0r;n;S<`ffS=DC#U7pLxCfJl2E*j3XG z=}vMJg_0L_r+JrWr&W&Y66_sL&$MM1jAP2>1vl1wfF0DD zw}lqEe=lZ6bJb3-TU#K}d)>AUqXunZI_)$95y?j*tjM`<)BM-E$A{h0xAlw1%=TZ} z8KC4W3w=n(9;7xkFTGm^VN;D|EKJFmgDHKF$0|FBc+`dcz3ym*#}~AP6&SRIITf@8 zHn-CdH@DXd!fP)#rhLL<4A1>s5NUhexv_1gV1DiYtug4U2+f_@?$aYdKJm`kP$Yw@wY3)s5y zeemGK_t3IEtSYY^@9jb3V2Ef#c94U|(x-$ok|O~B+}`c1OQ4V6LGZSaV1s5GO1ZkI z9p$Ft9zxy1e2sF$>x-MHu^fl|H8O(oMem54_yzmx_DYsEhn17b(bGi>w#_G4NCk1xCY6})IXbT@TXbW>XXhV7&%~@L&QLYzu zV9=Uny0f8{<#5~6uHvp0Cga}TT-P{v8ayc;@9UwSEcc|3Q+f@+OY=b=)}3SFOGY2g zp|Gcvwz2p${Ro1~h3WX%9=FgIi0dP*G;!wFD7W5fe=JAT^MvmQOq6pv7W(jG-7Dac z@}Kd%tvgAwNsos%%Sh#M7HFT zOa77ta>lYBcwxClSFWc^520S3^x@ngtD!s%eI#F%NlxFJeuwlGR<(9Xw>8HrmLBJ> zNybO?vCyug?v&0Zv!wjc$-_0dzLb;vp17iEqd0Gt`o2O4@et}%d0@1aY!6v<*-K_c z_7XEFd&%B!=Ey3t&sYc<;QHaTqyJLLY3)44uU z$nsxKI!XP)-9FRKX?{Uxt1df9lEJfiJ=(%U-`9itJ8F+KzuIdTb6D8YNumDfK4K*p=C7qr9!d2FFxZ`Qx&^fjN*lx+z7}^s# zC%0|)G4pBbg_M0xpV)3hLHV$gcp>J1_Ud@jHZRbe_hw3Se~?V+daoeHGBsv0sQ1)%ZqI7{k#)Rla=#`|%uJLRjio8t=HUC$NU$!d@H z-ck=?rsb;;A$qRZ5O7`VQ>>BV1sEZH$CCYwR|z=R69F4PBl+eHj(KW*u~8{UbpS$R z1|vayaJQTjO3J2? z&hRc&=2WX(t`Wx4xlPi_vV(QjPkhCtHGMCNBkdL$JkKBdwOUK~MQhpC3o<)z^z~ZJ zPGeeREBXS)+sk$5`p~e7^Ef?g*(dcX9_q@;a2OGTzON;;^(;n=#d}^g6xAK}@7rMV zvky`z(mCU5nZZ@jJWqC`)t>jzNc}5M!w!LEYdq0m?4P^eCpr;3sId^&rcG{7awGk+ zUPRmGxeiNZzw9PUE@2JXWH?;f^dj8t!v&WwRsJw{t_lG@mKr2!Uj^ckd;T_Eye=RFz^YwsG7ZDFv<37%n&0%Xs^@ zP4AJS4HOR|(((_`#NstPR_XR}Rqh{$kPK?f>3HI+U_IoA)p4%We}kCaH0N#xv2)JV zIM$m`+q?{(f71AHo74w)Op}KOX^`}<&<64yaoZ)+<3!?eUfNB*JZUq@C7BzYncyUt za=y6j%54sGPTByx2+4G%@N!-zvY&O?ev==Ds?+?T)zt62vPdxpu&#VoQg~W(RwMl; z44Kc2amg<2R@w9H<3gB{v2M{)wxG!_KqDC6zXO``aBS)-4+4!@$hu5c%nL^nh)Pt> zdV_60%~fp$MqLDzyRUnD9GtNajB3|fGJ(R$2&P4);tBjs9nM^t$Wvd`(Cl0e4!$$mLAmg|8z zlAlegRCKqfCGQ1{%TFZ!a7-|K<08>*?!*SFiv2&JTL1Q|omYoqx2m{(a_= zw;$nuPL95Rdi(r(d;L0rl7^BJWYu*M7(I*6%*wckgrmzVGD8WU<@qz4o3xzqQtH_XlFbPK_-8r*q~gCn4!q?*>;L)d;^e{?IJpU2o!L�#_FS-xUBzDB$+Ow9SSCA^1P!_us*HG(;FQZr{q$EK}{n;nyuGG|@%nmNw1o#p@w z7Oq~$&0shNUxo}51$7vS=b?b_LEU1z6dte)dMfByVAPA+p?TpaNdj+yIIv!d5I zre<3IqXpl%%$SUXHCYL1sq7yuMz2cC&hq5oSN^k0u`&N_bxn3g@}F(S#>|OJj!TJ4 z&C0}w@BE{ef0kV%P0LEll%}ouXO;h=t$$|!sk47n!Zq;U7ypNH|E*wf@c+4JO3FX` zl9}a~gAe2XG;5g=>(|815yxewWoN|1`Q_l_vF5P<*-L>>T5?)Oa9V7fC&%^Q(}g}h zNJd(GLNcC_DGu;v3;lfDo#(r|JG#tv{?Xet0=!m2{CeN$EWF5%rRV76=IH7i@sFkF z=;SVNa{7Bwe4b;Yv!efRh4BfGjS*xeWF^P_eeU7ptiMai2|s2)kQ|-5+LN=+F*Ytf zIy*Uw;}r(uO9o#^?4X3yq_|jNDmy$YIwLDCW5JvsQ=OcE*Z))cTT^rX?E?5Hf`bKt z37J`G8SDRknee#ue_ilT1q-5Mek>eM&YFz0*zB0NSPuJd>6vNqS!<&+;^5V|Ry{dz ze0)M`Le_dVzS$|9kKL9K^q^$ zZ;v11KkqXy_J5B5Xy88@_>Ttuqk;cu;6EDp|4#$|Lh5m;I6PmAA0;y1i(@A7FB6q=Zc!!7ZK{fFVEy z*wHbWYl6f5BmQjjzdgMl_|wh-`W=6?_1_lxpA)rWar}=PN;JHPSInA>EL{F!F$Jy7 zTJu9z;xa2n8Xb$vYFwU`fp-v>H9yi<{Y@VEA+P?M{N;z75h3=$$EJ_V?A8A!ulhGR zMw*d=m%&F4a8r`A@jm={{IK}6<5CxgTdpZyTq~UdA@bemAJ&*w;0ILBhkOj=bQ?v2bR;^yQq0Gv(zSN${; z0Oq~J(@X!A#;pecy#fH}y6~^GRXYLT*k%AQxxXelBl^$l{IGF}@wi3&rUd|WA_2e< z0|3Udzv&Fm`;iaqy$b*l8}O;R0RT0%0AP!k*IWL52-gvr1cD%mjGxG4GKH#5qvD62 zmKI%`sb^ro)MGLYji*mDWSJQ;nI={yW)>EfmX?OoI9$#Q?(`X!Gk!Eez^hUzR9zZP zcLs~en(_a9d_M~?X~Z1x5Q)G9h)e>BN%(#du)s$~B>gb{|9KFIB#=s@(8+jqf<8bX z5%G=_L9(_soepZ@xl8~g8(2A0sBjp~Fgl$hXStL$(2cCU51Y&tugb1Ga`fEo$A2-N z#&vc7DI-hK(bw-b&u4LFxw7#O8#}&Vc*K(YikR5AoWi|4|AO-up9I8Tz%ONtcjDiA z@uNEgBA#x_{E_irvItCP*y{TrpiLs+Bf%ZR}|l%?h@@tv0gsg`ayR zd8XGTXE<+v6xB5_OGm$f=sDut*V*wRwpyHHEupnlPXA4uT}x9}n%ekg^NCpkAdkoG z8YqlQx1reTDro`V_|z2vkD$;4Q^Z&^`l0*lv4ZCnnrar)-YPO`^b}&Lr*-Y^iqMX_Vkb#hiyFeo6?8{hm{2C zfP#0eIv%sQLGe33>w@sjO3B@Ua3&nK{*p^oL>%3PKakJ4x@C3yu){B^sj-5xhRJq{ zsU`DnOgCTG?QYi;(Oa}>6*SJ$S?^s0+jwdtl51^^_n*xkc1+xQAfCPVIUL=SKFg;0 zn+|)=lu0XD9G^81O!1j(vwv>;8`2BrK`D9(7+d`ub{7{qT3w0@74uvUwk=Ln3L49I zdNrBWzd$cUl6~cd<4`aGeWW6oy|R^CiYRt5kWP?)2QYr-J{*(M{j7;~*08mNrVrJE ze9p!(5Zo89$T*aLK*<~(9gr!&G0zbf6MJ!nak(msdx<>TG^}^`-cB%U;!O#~AdpKZ zO5Y+u7Ft4x?6rO&WtBFVF$ZMa@`#|Tnp%Kx7_Eu} zW0_U)3Qyi_@1fxRMd4Nnac#0! zWo-yl@g2aS8adC-kv8E z*k-Ye?|nR-`%8JLTA&{Nfcbr>TX#WaXTOb1NUdURUT~LHPCX0M@Qp}ABFZsVhwR`! zcf88!O{oUs+ddYP#_DVp#~2ZvJX?Ybh_M?5b!$iAxZae$hG+AZ2PN6(^Yuj~Im0FN zp;pqo@RiZxC^|G$%E&ZxRjIhYJl=FNvWnQlsZT7wzL~^F~kfXRN zaifu$?i52f{Ivrl^5%4PW;_?Y*%HIMpGZ_Fzi@k3i^v}^r>L8^4=9Ps##Y;Sg&j9`a7Jj-3XDHV%Cum-AV-a;a@e5F{9}RYWQcl`}&$#t(;@ z9|T{xak7Tsi%xjzwUbF{B0#T>xGidgXL(bxesg81q3atoPCN*f(bA>h%nYrd&zdY?k%QPT9Y!vp`5O?~`uC%A@&t-!F}F%Q2qiL(dVynJHvNdTOMP=FU4L0fpr!l8e2ay z_i_g#qyUNaT=VpLM_;4)VE%NS9F$*6;Zx+lbfD#dR6coz2B`BR`Bv&co+AdQkKI)G z+FfISH$Y0=HqvNo8JuB4x$)DC3<9Iq{LAF8iP~FU4y2fMWn68hnJUgI4#OW`2D_s* zk-XlG5n3y5KH#IifLm#90z@}cSm)BoY8xM~l40Er!`$Z|Bq=R3B-p(I?yLGl#`fRK zROB5WP0w(Cs&ZpkNM|z5M#FzW2npk4z$PiR!lK4sY4%eZjF41+5RZlRX(~7st}Uw;O-5yU_NIZ}Lq0g;6J% zJB9M=cqZd4%F#g?wrws-*=0sbKZUKlmfX6N^;AAHRAVtRQx~}H4+#Y`8WrX`-v)tP z#0+y1m=QGgREP5LCOOn{oMqr0u@^A((Cr`zJiAob-IF`c0;x zCF{c!xD`-XeLY&BtW$HA5b#kZ7p$OE8jq@X#y)}^6n+EnC0OIdPYn{MNZ|=1cYXx z?xP12N$L@vZP#v}z%}y94WJ};@08MCjxf&58|NFjKN)fv>WyQjnC z8ri{q$jTP2+(HXam5SUG5tV1Ujh zw1XPiHoBn(@yjjyBXG2xSX`$=vga7->q%&J8zv#92SRE-fz1EFr#^s82W597QEpz^ zGnC)U(>Zfsic-gsZN2dG30Y7IpK@8|TFV2QDj~}_l2xWYj2`Ncr!IdBW%AdrS^ZGa z{)zq$r3_)SPh3S~a>00oC_PEh*^01*)#%TSa%fu?x;m_#+;w9!!C{S+y;;TGK83xF zZhRocy^PQN>0)DG@f6B_Umw;zJd_I%?oTb0b?V;j@BzvH$!&ZE+a)yRA;?6Q;6B_nRF-H%5K&3Vg3}(Z4 zJGsbb=T9&Xni+`^i1G#3w$59&w2%anI>`Y)kD_jmRHPzmXdOvQLOrjt^-X|lR~$dp zd9|!@lW(~ai1{dWLS=f7AWbD(Z%B8OBCdseX16a|O;I#mb>f+2a|{ng4=6snn`d7? zC@>|pvZ&8$*A&c}m26~&L>#%|R8XG_E?OC1ykw~+7!2qn4@4(*d+V2W8lrV0>?ze9 z1v_7jmPDXJQ4tPCRxfy0zKhVTwVEwD>JYc$5{2?sT|5dM8y!%LC#|0SXwj_ZCGCY| z5$xT&7(0jB^0*LZKhK;F@) z{FwN*q+?}@bq5mO{OB6=Ya}YTIc4e|C@SsTa?s|Pzwf&+PcC9oGJEOqH?zIPPXYqR zC*TqsFh%({VOC7@_a)S}WU2lXOPkpz8@1rk`VUQXlCHFo`opU_&+ zTV6<{O~R(1rQAWyprWkd9ZIh>-6nNBCXQUM+kGz^xSCw?hpt9{Jsi?5Om?p{@TP`} z81K;&_b(5L&fi~DQ$SxB@d4ex@is)vnSk9NNS3fF{?O?_D-N_@l!czxRT}B%se$-h zKZ46Dsm^5$Fai1Zd`1lXJB*jPoZRVSFD7^{QL{)P^OOIw%-=Y_p?E;CHq`M0>+Qbl zV|TdE(JhmLH;SrOXG10&@*7%0orDYzDDtglyA<@6uW$&`ZzqPP!`thoSb7r`u&rdK z9Re6+Z{s;;8?Ua~**g*e6ALLp-6v;S_sOU3nQ1** zM2kBz*jv@$Kvj_eqnVFQw*m2iL*1y`HhB9KrNXrxh^m`ACM5=%T}0?bDCM(dE}dpi zzt%PhC+^C*^KAN+TLh>nA2#3oF!%T2d52o;)}d=1yA_p!CUv)~_P$z1ZlY%=YWI>4 zrZj87TugF4a{ia+t@{Suxd(EyLA%pP8?HcMeiB`Mg&Ws}k zjvb|p({2#jsM~+69W2inuaa^tey&tOK9^5x=Q%aR%Y0N0pktU z12UIvE(We$7)MHTP?TKN=gWJ*SPMH5y|VoxSkah+mI%!a2(P5GrD#L&^PMbz?_30a zKOA>{@XGbMIEZ$bpJ9-Jx!E~*%dt=6aK-9bvzE6f!XfH@vD9JNwPpL()ff8*ll?Oj z^VB*!a*46ng7U2|`0oZ}Ld1pt4h?_QPGEL*81m$;H5xw<)X9_1?)H!9I?`Lps-x@U zh%&j*eoZ-H(it{9WpRll3va#KNs>eqf%(=A=*CFL$}dj%ay8qRo86bcU~te;wCpFw zEET(56y&ghFp#fv_8y5-a`MWcqQ^G(1DZRtk7vTLTi++w!J&^PVG`;ngKp+WqI&B; ztIh17xgH4k+dv8E>6HcGaE(Z>7=>=#>3{8kSv4Pqq}pkNGBZ>BX~5w4PWDhT4|aSr z*`z7mY${;3F8_dj`3rBx1rg|Ra|+<%@cfX{-Ug^RT;~VU#aGLPuY)jWu(;Htgmj>w z48z=-nn;f%v=qpqMMVmn^y)B7S9QVZ4k0PNMP)Dnl7Hse_Gtz$6gdUlR5<)qDb&1{ zf;XEmrl(ggrM@5^_%x$q+Qa2}HfIlANRb*=9yWx1iX<#?M`;5#3L9DnqPZV9GUj_E z_VI_*d&BG7fzWpH+ATf@TQ9!__AWGj3x_>Q1bz$A0M{u62({cgnYR3tAgG~U>AmsLObh>D0O+%E*XN}aL!&;;@-CG>QV@|^0 zO#3kXSR`=XA@m6MHwi6hWMc$SQ#>edv5ozh|CqY;p$acYbHwaA=ACRT}a#djgIR`}I z9#0(0I;Q!wJaSQ-kKL~lZJj(E!5O$(*eyjnL%zgQVlPL$9O2pDn}95ymAyyiPu1fF znpB5y4_Q`5H*2%t`jLIcusLTQslal`g=+|Pm2t796Bj0JXzTCHVtd11Zr?+e@Q3pu zos$@!D3rx}^%4aZ)Le?vh{tu{UfiQJ=uWztX`epxU5Li0!PkW2I}Vq>yAWM@sGq}v zwSF3~6lh0X z!`XWu1?0_cZ8~Z894XBkvA55Mcc%T)bs%zG!_nt7pebn*8t#5O+b9d&{j9#w9za$( zMiz^U?T(|BCuinqy6%xhn6QM_&hXY$bob|i>`4emC@qOp!OaVO`Brxtv~8LMm4&~E z{+dmFm~YuK!lxcgBybh9`f9Wc>^+Gvc=myGm$|O4(6Q|uTKz5UfVO3dnrR_5El1t> zhUuN|r7FF4^?-u$S*l~#hT)GoUU|rQ`9y<$j;o4@1ESF%$gJ&SRN*OCJ2h3p*lH@L zqZJ|c$A}jV>Y4)4E0V$Pl;)vm?`Qj;B1<-R)$wMYI+oM-I7k3UHXfqHyoAMIbrI^m zq(_Hn{pk|*)nD#xYwt^4eteBxuYVMM7~8l=wtheD6AnFyK{V^*Xvyz0ACE$`JsqYy zjwV-?b`8I^v7FX`UM#KP$PGfu15xegH*io-YQ2Zq_u;GX!v47RyPOV889!PvKkN7O zzO8>)GNO=}V!Kt+Ij4^2JeKO((Cq^QdrSH6CZUN}uPruQO}4vEa&KmDz+%cp+hgnw zbbwa}Wrkf-I&p$H^AfsEB4p*XdOb^j&y-=hjs6m^LuIgz2Vw=Cdyj%iLj$t@dmFF? zO?s8Y?H$DIehIYH>J&C^v9hC)xvCRz@oVFxADU9f;b2YC%5x|41*pG7oos$*qi&zL3t}4*)7}+Z@gyCA?BIe@7Bt4W-B8XdcniWI)SDPZ&4Ppab zU3i=Yzb&KD^>>t^@^_y{OyDbviBt)#cv}+!z8{on?8H)VThzA_;7UY-Wh_QI#5asf zQ9YZ6EE)bHyjKQ2kg%Ryv+q@8QJ3Nfh6R2KCRzE6+j6tVo#h*7S`tVDa-Ak*5l7*(D?~}G>fC)ztjr6lrRBbR zkLF$dI1cIP?iEp+0`>JmG&+kUr;l9S{zAb{`l2ChD}XyUgxFE5Mh(@@ z9EB_Rfp0w6aBQV$#oB8@W2nFh!UW9oNxa_OWRadc9)NEu)6g-q06KBRqD^4Z2g_h*@7#HIhFL>j#=)W+8ht z#1rH15o`6`MD1Pf!Tm*D0m{PbFC-{}{LYh9u+J5HW^tZw_hgM-+<(^55JV@Caxp5T%ZtDYH-Ocg6|L z_Gpau5v7=K~UFX+Q=b)RPb5J`e z3;4=65F#MA%mefH9c>4KYDuvZux)>hFr+-B0(R*wKc*j1j-xf73AiS$K=8HbWbmaU z20?Ml(3!8$3*FJlv(R?N!p;b6>1@fDm5z536~C`c<5$#rw>cjyc5IIOi+as0+l z;Z1w@P+q^3KkaDpF~=3%T2jgr@nVMSy=)ZSw&6Qq0}e|fz+aqUor@-@fr?Dlq1_eH zdA!n)f)6ayYZok|XPsziKf}xFeO5LJFR@R2-hOt`_Kqh?*F}kCa8cg3L5kJFr5Gpn zI)oY>{+3AY|G6J7Wt}(2twVb(8%$uaX7v`omg;P(fXi>)_B-^4Fzxf@+G7xi2vLr>h6y=}0$*x=FXJ4Pm+Na(5;OIBuWOz>1YXzC^8(H=_Vp%aUU zkCW$Z`ZRO4l9@X3elUB}Zu_`ps?R!b`;g(}S`+PYIj zaG!fE;Vhw8gOC|?23wZXr}(Wu)nJEBlK9A%Xm7wvNs>m+_bD1`MM(~`+Oa0@Af}*} zA=5D1!Kz9QQ68GWg!LIp{ZgTaA1S-DqiwrQ!cQ?OFb6%XD!7?NCh{vfLH_4Y2&4M0 z2>67pT*|pUr;@AkcPUKtiZGHX21}IQm(Mc5^IF?g_A;SNh}I2lckG+7GNXP|E)sqw zk@`wXXaDN2nPzkSdDnx8t~$>iHT#of(dOQn;?>@{m{0!{gS3LqCupSEXhrJ0D$PBl zxBVjGJE_6+g}pd_U9eAR@1loDnKj>HpqUAV(1~Eu)JM$vJz|#3<2KUF2(Y1x4p<)c zv450h;Il|_Ubk>rh?3OqSgD*>Ua9*;!4_qTeyx)0tnMLMKepiMYbGr7fQCmtkmY{Z zBWHPcwj-ZWwHGbXnloW>bi=jC(j4R-=KUbp=Go426+6|ihuHmd?H@~Rb^CHyOdzg2 zdjjftkJe%&AtH$g8O0r?yD3M!*Vc@~%tsRHm=wI65}!BX;#fOZkG!OaTp;IaBHs>z@sNM3v1`HOn1)R_LW}c=+my&>+S6bL(iFq9G--1e2D~X z3iVXe24n;DaoBcPV#g_og||1#bq$#X}y9|69y45OP4&JS;e z1M9aOM9~8qSN7l@c2hL74c`pSian6v%~~O<;npSLP7Q3#Zs&^=Ev(Yrm!ky?+AFuu zBc_&=k#E_ouv)kq4~$N8?^{ql_JF9TF)xEfZz^|}8}>=T*1!lwyv*KaKKffO zeXv#bDfoOu^NE5wDf`rMjhGfHM0ZyIQa^{Ywg!)nnogAfH4$g?2W1{9p6VG5-dS}c zWS!q{-Bftc4ai`5<*c({^`Ja?m5hD!A|mW)y#!j#SLWgmoLBQM+Pu&d=3i# z+G(e=D{{UA{&57$J<9Vtj-wa99fmd!6rsAGN_nP=)rmxqNI-S}fPPr4?kqqs3daaV z&+vY|A{>H*OJvBB zA>N9k+jkXM35$|nA53I$&ypls%0V9j_J-9M)irlUhmn$J!@WXnCy5%!`gI>XFrO9M zA1ZY{zh&t-h$C1vlq^^1L73z%6MTvti}DP zPb9j^Z$Z_yjLTDmJ+%x9+j0a=5?`TnOWmhXsI;}1Wh^-39I04EIWKo<9BN&|bU!j8XWuMh_ z*B(GvQ^5j9@j$@0L@*{2K%C#_u0{3meTSuAF7^(2*uliZa@1%zD((({#TAiZg9kP< z=fVyfM!F;SwJMos*h-g_8@&Lccse6s?ER=uejwi?1;+@bbxNZNNH_}h9o%XV+J>xH z_cUZ-P3en3%SYO^jGYyauhzyyqR6V;EVOtq3X2_FW;G>H4R_r1y~3#9f*~>6bZard z)Kg6w=TkOs>;TM&WO9v0h4TT-gDLT|v_8%b?hmzJ#Ztbmo`efiUn<9z_g2QbR(iu9 z(9@4|CJO}xA47u5u+K=uRnc&Qmc4hZaN#xBW2$RQ=SMAXOt&ONWAYui8wTg(cx`_E zk$UrnSL~=oqk^VIe`_AbJY_~}PYnC3Qf0Y9>bQvQv?5%lBb$T+Luw}>B&hYwOdfnw z`$a8HC$|U%6RlsN?sa^W&xEenKj4No;{itI0VM&=q@$ASmq_3?HBdRrK-n7BD(@tk ze+S%%d_DZh<&oe#3Sp3)%j#eri+KnYj7atMbE~J&sQf;jLCcx@5N(HqQrC%t@1cW3 zP#RP$z_$obj?C<}R~DFEOW=ga(%`z3_^y>c$CmV_SMNqIei?DLpgKo*uMQQ_EIJmZ zkRlxv2kO-NLzz(aHmRvV>hcMhKMrj|i)|H)5>lG%rEH5PU(93ewV6%?2Br`o9-F=# z17)S{{zr)lt-$Ldy8R@JY3qODGXl&Q!WfK@66R~3P9Z?AyLD4mJR~9E+d$rwq1B9t zTfYtUkTadzDIw;`?;Z>;jcS^AU~I?feA|h++Nx_t^9q4Xi{koRZI8wLoqa8Rs=2ra zT<>D%`lyQ|Jo7*Y*9JgX!D9BR>g8PA$KCn07^UP#e&)?e?y9P)JXW)MY+nvq5Q5&y z#r=U6$KNiB3{06{Srdl)D&c$qVu(#ZK_ME-ZQzUAR9Vf@YbR3J5Nd~noS5Jngjv?& zUQQw!a#=cU1f7fW2Njp~2Q@wiK1LB?+}8>Sd)+)z;FJd^yAEus>(wS&L6dNh!RnS= z`ev5do6AdU(9J7!h(ifzIkC#yTU0zqCNA|b2tr6>V?5jb*sji-#lr|+bk}?lDQ?PAh&atE2-Enu#*` zH6!uKCqot-Q4*X&n&m^MpPxKFbZu8tvvg*9T&j^tc`U}sekj{hi-0B+-JVN8NSO+l zJB-Ahe#_{HYp&*H8@`ysfAKL3yB$y+*OvHz+%56p3HeI@uHJ1tIk*6v0F4+br6fbx}x zn=x}7`YTt!EW-pxBjS@P>Qc1iEMq?X8df*Lsf!0cBP-I@yq(`Ss3~ZRTl$)3IFhX2 ze8=7zcR92R5K_2DfCQNQ(kvSi+RCt6x>aX)bVnug6ym<~xxyu%bWay#um8aJaFOclAX|m`BpGp1PE~XiJVT!Dbe0FboU_f zmnZZutAJxvYFg<^CJ-Yj14%!sx z>I}P|wkxl6AZ~A#8eSz_vaxfbis<|&gDcYqd4_@Eg$T4Qn{OEZ{BpQ-o(`K;|qnuVHR=z+MDQ(_LIS3o9SKp$=UK(MXj^fE5idKo2HAkj)#Qo8-=MfuD2fuKN68UN+=3(tVI`Eu_gUZWqX{+ z;}aGT)^v%0(_aW5ECm#nI8%p)Zv}nN4!u}YrdH&jt+7TGhis(=G{$QICcNIT+A1tG zgJ(sNRXlo)Ue7c`T5OX zj$}-sLK|**X)GdoaA>?WZJz1&mk`h5nkc#tw}!{f%xF3xjd@b01rVUdm}-4W2u0HtsDg%v;QpN_if;A7z8(M7awaC+E5L@d(2ckg0`q zTB`sN+B?h-?;$SvgT=5z(c_|+k#qLmr*7Sh_(9EyuZvDSp40CTa>do*J*qlX?UFq@ z4$q~nvA@K!@&*FUac%Z!=OU(+%!PW1K#@5EFmZ-mDpgi-3+YZeV1%lzyfGrT0_xoH z5~bb&zE0`1jV%>%)zvIh+riOUj!%Aj_R>Ka;{$I&N$r4#{}f>1is-L~`2ZFDh`7Xv zD4UlQUs;t~qLo_XV=q0HF?7Gb2IjcTxU7(IC*VXIEr$LPw`=AbF!+*D`yv_lrh-fy zR}m*3$^`fmGMxbz5{+2QK!?FVRQKs)bj5~j^!O(1MN~_EtgY|2^j923Cs~KZ#;hPe za*0$`(B0^wz6A0~J%oLo59Jp0Z#WSOuJ6jX9k%Zp5S7x+9R*+1&Jnc!m(X4bDg5*v zB>|hn=~Wv|m|r^d@Ox_C75tXQws{2&{a=L2cdi|UkfKabq(%b>b({%x#-{(!O)XXTi#*}gG@8Z zwm`$^#F1pR1LQ)@Wo)=U+DQan^IV-i4{ddym~&VuAdsBuMtI$M*R~W2#*W(i zWBJ^CsMw+W z*FR8qfB+@E@xb)m2Bb7s_5`%S45-Es$6$ay30-c^LSr2^Ftkrz+mO>Q0pq{Ek#K+z?obXf5kpSxjevh1xO`ni(wRZj~w2oNQ7qct~-yRDX|b zOllxE^UX$&+=izG?{@)tdFj?KVUNC*J?TE2;-9`$7kp9kkiy&&fUCToFaalBQXmrV zKEU*-X$7>RwQ#=sh(sT{?H`0K?g39-+Vo~M5;S6m^9v(TTjtS~Dbr%KvG^O7cdwIamU5By=M{$5)&av>LI?v38~CBsZ^)uGLGNr?B#Tt-3;?U^zfGwZC|+t4ROsM~(L*SCx+qK)3oB~7rj$E5m0A}z=I z^g^S#2C%S9fGi30jH(+UW<8X-b~9N-;dR?L~Agr zbw*5if&bRf5*pf+PIQ)x}>Kz~22~OAjmm&L84&}KXmoi&n+ z#7iVzDR*-QchUSmR@uEmFN#aHzT2Z=*fn9x63xTUE_j?^u|#86(R|$PmGqWn|@>7d{HR*QQ@|6c#}hw!E2wap)}B zQ1HG4)IEWNpHVoa=fc+2Z=M+M-dEPAI0EpQciTQA^F}`)=2<8=YaCv1XST0i zFg3x_|BADcJF}}a2R(PpW0iszXH2oKj6&H8j^cykk^-B=E5!GOBv{C_ALF?!E?VJm z&Rx92#^V>x#zAdyJmu&pWU=Y#fXuaZj5jO#UFR+n;fDJL+$U^NioYoRviYf`JCg`Pzv;ID0%{wj!_Wh=wu5wx*Y`BSGWHg_gg zRU|H7yT7KWzLNUVLTC*`#UsH4rmYO;a^DM0X_PVE@eN~DGw~ZZG@*n(@6A?~K|#>j zg#%ItOJ^tv;`s)J_7DV8DOl%^6J9^BopB7wqkHJngK(CyBKCS(4<)Yu`3wDsKi-O6 zo(0OQ@@b=|zfBn~6G1|5k~$xsr2(1U^KoeNyIMN0yisKliu)RvE*YaLuzfK71JTsG zYHypZV&-i>4+gmj?^}b}ci<_sH<9WT(~=I6nVn#HXVdg%y1vwSeNYx!g&0%@y7oyq zF=Fcp6bi&+Kwh;76}FJ-yhAGzY1uQyna^FsIs9o4PWN4RVku`n;f?6Es3^{ihjXXU z)e&Epmf-)-q0G9S68u@)z3IS%;SuEi&r3I8tG?X25Bbt8o8^{~e7%je2<}F}!@h3l z>4BkJx-)O3kUL)d^?E3Z?%jCeJxa3+eU5VY9vIHK>?Nf?dI|Nn0uwmRe$F1z`K57p zmt2VXUG&svAm7~HT8IZ#9x4Kt`g#*Q6uHQ<4Oz1n95G30EI4QX<>@dMrmnP%trN0SF>$Wf^#Pz(6{R$F$EZ-KTl6YF<9(e{aYe!`ybE;&%h~EV);dC zGP*FESX`oA*!cJ|Y5aO~c}Ah-ZOAq4#o(zAy9a+!|CJTBZvzss^~4LiK85Qj1aK4H zV=krTzWHxZpOmN^l!o$&+)x#P6Q7N0lZHQIL4{mJm}w`=_)&Mu3el;8qkoap?|s5z zzNI$GhB^VDdK}tb_id0A4HTgpEKU!S!rRH$kE}?zw0>I)yOb4$vyyEE$UF-jVD3AV zR!3)n{`LKk39zF}Rt{O5#Af`3=dz|xp5tm$3FvOG-=w$>UDJ6H?!dTX#VD5#<})A{ z5Ru%uaD&}&jG^D~2e1}ZR~$zT$^&IV6R=I2`dWFY8pY|ALU#4`o{?F3imL`FzKxjs zc_n6E33@%3HADV+*y|SMlPgd3+UQ`lo8SZbcC#3_>71=qgeC-_p*Y9hE*-XG5^V8N z%WXIEK4Q+}Gc;POZ~$5^MjN^X$chbF&xgj=_d6g4dFq)V5v?|{Ou;4U#PF(hnQcQI z5Ap+fPFdJz%;a(OK*{~C3)NR3FW5!8(CXG+O2zZaor0ShR`rJo7J-DX+|BP;dYQN> zZikztXDy_xAjHkaXQ_M~YL;*7_$<}0uLGO#$8(={Fp;VGj4a>3S#v%`Gq%MCsp(TR z`o`e_tO+#AQW~n=$$Z+Mh8F4Ledd6I>#Pmp4 zD^gTY88o!6^ACQf&96r&3ScBC>7mqEHm)Ln(AMAdz$bB0s-}_02L;4-lH- zm8I>AS)DF}S6xUH`6SFgG2R0PUTa{ELNlG9ni9~>73LB{FW`QrkcrLhj~q|$-U67^ zG8#kQVzZTccVDA=2OmI50)(m|K{`*Pp`@XYBRba+3n}0>$)^fyiMgYrP;OZdP<`Xz zopIRimm>jHw9vR29s1@7ze#=8bcc$xklq`zS42M8L!ii?IoGnY`(&abJUG4ma69?c zgHw0*4_rZXdQ3a+iWqK#GW?BzE_+K@7ROAyZFq}b&WXks}cl=n~; z9or{1@m`i-zj{mr)^D6*E%$tJs>RrVvGogwdLLe%0MFUX>n+z4OJ`(PojTGPSJSJD z+tQ>?61&A4CzhIL)z^``+8bWF2;M{n8P-5pM3#*`?p0^&j4&&3e%qt8MDpDgJZ^?k zW}AD1{2^%hk)fn@`jxg}ZKJTaMwKe`>Y%|IjHtKtBjPB)nbdO^<`GA6+iKwuVj#Hs z9tG;U#$gU>NH?G4Gc6?x{eXD4LHX9>*$?H}C}opWcNbzm7BoXi8QjxBU6F%+-G9pe z&bpW-s~&Jwu66dnt#;~@R~`sUJ8&?V&~^jx-*t(AS!|4;tjgkk3I?)2BIY0Rp%Vcj z?N_3+k*b{rZ&vDd8H)n$c=n7qp*L%BbmZ6mi>5N6$prUU)~SiPh~dGXa|z+*nBynJ z(~VDU)&Mg1K6!wM=sV_%34m=UpkKjCR@?8m?J5Gth$veE7WS*V` zB!u;r*-c@~G84ZZCcN)8nuJ47jl(wb`B2eE%s02bOSWSu2}M@8TQq zb`I_nvly`+iI?xmPXs>IA404b&Pk*`n!@Ik^0hx*BAoGolCW_|Ur5Zi?R`12MRKa6 z)z@1%vH|n3L*^{FdtWc#rO<@>3T=3G)V@@BhnoWHUQC*Vs|HtgYvrY}t-2ZIgdOmJ zVwYxF<74kTmjriTvd<$ z{i2?wmF%J~AxE|>{5g?v&b1jw$Eo`haB7I;z>87$5iz1NsoX~$f|rfF*&Uw95y$xO z^&jCJog!`$1RQK5Soe@Z&mU^=QquiHQjbD95q1#%LPV$ibrqqb7A#dc=$D70eA=Ft z%s%W8T5coE=Ns8Lcx*U_O5UMvf&>+zxlT&zI*S0Zxf*014zWBC z*Y2qa$g+k-yETP);{M0zaT_x7MK%fPTCpMW*uJO2b_^1^m(lm95Z@Elx!^T>y_<^3hWd7Nq#K{`^dS zo!U-b$dS&FrBGWEL4$~BcExEW_->n2FC02srXmWmQEDgAI+5z!z^A;imXMZy6Or*3 zqxfLRCfQIrl)$2{z+s1{boSyC{fWC2O>to|!e3AKGN96+q7SG$DizD@E!LtwuTdR9 zjr(;O!sNZ&{qMuoXn`;OqFC%*|yhXLi?P^Z!)q6QC+LQ(nag16ziSLWvqukLxK`kZQ1t%G{6I|w^MosuW*UY0a z2BpSBwOWq%GamnCD5`R1G*l<_))eaPi@HQf)qS@w^Kizs#J8Z$B|Y^9Ogz-w`Y$lj$tvakprqa#?}eQMr2l~hjY7YeO}u*WINs*3+q!<0xZbGgt8V5LtR;fI%^4$ zU~xJ^OGR?x*8p+qVe9wd#-us}zfRRbLD( z)SQ^6Pv=m=XQ}O=E7_o<863x7c*wzB(byTMhO?RP@$fa1p>Q+Lht3P{+fAU};GQ1! z|KjRAgPMAyZl8ou5~TOu0)#3}sz8F&NC`!drbsjNCMXC9p@Z~Lr5u`o0@9m^N|&M$ z5fl&wq=_I^KmqUhzwe#7GxrNKd|)OdC(pC@+H3tbiq{s@I12I$X-JtbV9ZLh1XOuB zR5Je;=5Z7YH<_uI7|oDF`TK~2{oLu+M?ux1rxZ0?SVO_mFv!LxcnubU%Gh4^;{&Qu zu%kqR#gI-GKr=TPWiAP3#O9BH42!F^vf&b$YIlL|#bOTsep4RXQTE;g&gaR9a5?pS z;7X?wH0k*E8m3&gkm4T85nf(VlOQ(w1()RENp%VI=n0wR)Vrwowz8eY6Btto5JM)g zhx-`IDtcRD9hcK5wH`T7qWgz}bUEkzY&*nKjB9P?ot@Khi9FiTXr;L}4kp;!GZ zDwPBzX4Q`<(RNWq!Sm;nA&D@RP0&17?MOR9>?yy-M@i{Y!%8n4P0=t5+Q;t#p13Ha zVA57@-I4 zFl2@4ZfdJjL!@Cw6m8JTqUtRrrujo4GWLu_A8{98Y%U<`Zv4W$Kx<#2$H{WrOUW{4 zqCuDM1b5)UK@iJR2WoIl4?kiq#< zJ;cR{0W>2dTd@)?8omv}X0Gv>*($NnonO5iO+|#E89>qj-C;7s1LGY6Fw_EFGOVq9 z{tVLVnkJNz3dYz|081@I?XXGLb7iWGj^d zFgw8XIA$TbR#1=;Fq#hmjD*38kn03YP*?OGaFzFu8_)LS?RBiGD!_z6P}ld8Nc3U8mL(SLJJ;Ydd0XWxQqszICs=@4vJ5E)&v5 zVp3})L2cZ!P%s(VQ|2M{=S4(~!bKb3mGRH5k7w7}Ye6A24MSo1%p8M?hDVUNj%;!p zKF5FXwm7m8$1%M7@F$t#)2}H!kHC$6471UUCDzN!Np8t{GUc&?q!U8`HlV$$qk}^f zu{Y0%h&jSL)2V<%s3)v6f*Ig2=di!w;ZvK}iaF|t-vE)v?vMghx-wXCmZT7HHiHos zLv!5N#e|9bw$ejNVj~V9rdiBRzRpod5g)MIY2T8Dq>DO@P~JFT&8*P?QzB8DiWp^E^U4p%JnC0R@QU>PE1snOilZUJW!UUV!{VU5P$v<@034)PApwWpG^=uTC`HK}nPM0H5@V9cQ{9eg;k4L!pyA_C>jd!+=&Zec;<>aGS6>-`sRDg-TXod%THl=$R_mxnH!8ZxKu$x zrtsWQZsL71nC38&vJjUf6_7V4qjW4YEetg^2_ifLO!Ii=$Otr|SQ%&;3ozk;ki>P| ziA|69e}k3wUocMr{ z5CSynX$N#4#Z0k?bwnY}yXwyvv(`c=UVk+z6)R9qJam+?KF8vO?+C#N5=b?d>MBT% z1QotY{1e$&weh{5p_tKF9obq1a6%mxRKt)UZgRjl193RpMDhi&wWPI4jbaX0Q4>tD#o|4Ai?>g#^0j^-x&ss0U zx>FhJcl%(9Xppg425qn`b-W23+Z#%CgaSd3REtC4jKnKV;PV~?bEHnJuOU#}Utf== zxrLTsEWb3di3Oi0@U74Yriz*iL%=0WPC!(J3EZW<6`I*ITm>i1B_gDZjFXI02jMP` zXr`$jXf80Im22%J8KDFuew`#5(WtdB=W~aVbs^2nG+E9etn9sS+(38eU}eT7iQ_oR zP&ZxF2B)HA3>HeYbRE+v zq@gw*OYtF`R0H*4yb_{w|>OWZ{U<8V4y1!gd`rA}7^Et}`Q0G#*^8np;?2Cq`&QW*91eGJv0Co!pquY+kWv1p17%)u1cQLw-efZ#zU#zUkYO3IY4f`~T(1WE&R zdNJh_+15BED}~~|V4xB!hgJ~qXwTQJeYN{%#6l1XK0&RW8E^D;bENjGJ&}8x)pJ;J z$OPIPpH@yZzTEC`rT$b_aP%6OvH9^e)K9(Kx}`v0MTx>&eferIjRiTqu4XnW7S4EW z_bm}E)HIKGgY(4C`OqoPW@X_PUEJQPn4xGv1c|6FitjpHyBa{ZAH4FA-F0>GsYw=jP~l;G>yh0&a;XaqGl zs+r8=*FpAsm=h}+ff17y$$`j+k4Ui;l#`Jxo7hzUbeR7hkNhQ2 zl?TE^@VOZuoMG>o+k8Q32{YILEUTajO7P#)(L<%`kb$&T$h+#^O>uKI&=KNZb_+HS*3Vm?Q{INB_cjY;9ur&~#XGAuan}?ySA|qR}L= zg`%OAUD6L!Yve(Dii0Azmxmmu?D_h{q@FDm^X7sZ`jR;S=udf%l)lvpj>3Px{ zr&;|^^*?eLQ{Hg9p;sxPps?ec{TYrQ9xaTHK=h(p``WVkE=E3cnV^ob!_5$eB#GKemCxsw1nZC z8+upXu#cB7nksZCvgVpio7Dot_D=#_GeiI$B=V3tjGnys0CB3F;$OlLn!bCHQ6=*5 zk(qZPd7ba!t)dp z_y@cV>S5vvNn|fD3;H?F*Oz&W#$w+3wI)HZmDE|uXkl3fqBej_Ct-MG(##4*zZ-8f z7?-&d4b}p8cp{T2s$W36K9!cVUU;p}!b$_qEvRb>egjTKf=WEwVo;%K35QpbT{Yz& z%@62^x|vGeCx-aUyem{m&lD$2al0MTJ3QVlN&0*TS09yme`@dCrw`1LGN&*!DwDD& zbWoKkPAjoq%WL0kzm6MGK!Kg51!DaUn77AK0Nrfab$(c>1k!#S&Mt==Rr4m9MncVk zty8lbuRBN~7#oMiY+&U+SyGOFV{{S+Z5Ma{CQ0YMe4_6HL!qFTRdB=+z=qNP zf`(ycqcT(gXpD#_6$Zid(vz|dFCmXXNN8%1wMg){Q{Y=Cs0U@HqxcjChU&(-3Mp#A zu5?DGm6$HN_x8yV_kTDZYlaMUR)0JUVA?VfmY|$_^vFl}t}S z0#aZwD@~lfv(lLowD>nr+|9hw$JiD>S*4RRH%*)gw7Im+vQ4zhjM6@ zU+`m{We2?SKM3nGX9#2zsLg%ZUCJMeie>PxxMH6d-y%+l`uerns z3M`7@AeH6DKgfme!;=2rEA4lvAU)3`zz9rf+xV0~dm6RTbv|Y4x9Rjeteh{u4=ajg2%oxC5t_94wJ;pb*KLh_==-KgYz?X9&0zgaRq5-Z z;N9{~e66I;s8v=D>a`I$<`Y>rZFvh|`Fa3e!c(9_gOyH>zI&qz#x1Y`7(}4?D-C(@ z{M}><4**I;8u3q2RXe&zZSvJ{E95|$709N`qx)tg8Z#4uCEoICqeY5XL3+gJnHmj?@wpA59{VP^$!i`w~!s`Q{&9 zz~->>pjn@op_uxYEYvU;%*x*V=8BPj0qrbNy1k>Au3Z#IMl#rrYEkwsZ#yscp!#xW zCi%oRzCRAnwS1a#M1h^pP$xgDy3Ej*&p^4e(hlu!r~CZbz7hgCF0#2+Z(nOrt90wH zWI$^@jm2b6Lttg`HEvK&n{2JA5yg=5@zgFX)ZY!}u;06$jcp68Y9r>IRJXcaD<9cc zR))4W+_7WW;9)8QP96=aiXPDg$cjWcr-t6mj~LxrV00qoXRhC+ZesO0q{z)p>OTqU zSC%j}_lvb_rS`6?d?3mhIWe(PRcqMQeT!HhlLmh`hc#RFmO2k={s-BtK3QiN`ebvu z26iYj;503~cR9y>HAJg@#KKfD5X()Z9jypBRDY=UXeZ{PIArHDMBudM*;0;Pn&>#t z^R0k8St)DYVgQ}GHceEYplniGpd(@N%Xawe_eG~xnkst4)f8O>) zwgURtv=|(Ozm+QcF^Os@ns1Pr{PKc>c;BZ4p=0a4e~|b_ucvuFMY5Lxelq$8n*BMS9<&DVw8-HinfVZ;+bj)3MSo8%M_912U@5WYf|z1WG$YpPJ1&Rk zRUyrv33z`fp0$>x{SjG?Y31#MGGJfx#|mHh5rKadT|iY(ikK-0o!;1?OZ27e}LvF&_LZ_l~MMIO#fXl z)O8h1Q_(0_p-4#-n_+l_4he?<+Y|o_?lyC(dgn zT<)m_?XJoN+b%&rf|U$5@T`G7z_(z@&>K(^@0yF4B@I@Gzd7$v13f=@U)bC($*998NG zIbEj#lQS>=K}w=uWuCSogUQKMMpVWixg?c<%0Lp0$+TR!EJF}GVX&o$S^kz`oVw2b z4?-r;{m1u-tMYlmnk`5+nMp~j9n5O0In_N>VoL>yaY-|`Hmac1U~lxy6Cqvmt84l` zS)?}VQZn4k1a$Xgo3c-{C*h(qH?ZUq*v*dfFL^HwKOXtp^o##q@IsyL#ppI{RmiBM z?p);PTB?99Hy(XZb$d$fvlm+Kooj1nI1(nK%f(VVEodH2SWsCFkssA&>#%=*xF<%j4t2w4xAe&wa_R(e+S3bzk+{F;v(r1vOx({m|@ZGh3-Q4`L<7!QZi+^(*O!3*3_55u; zTKh+wD>LZEaLG-!fn%On8R>d%%XdAitgmp4nW)nE#FL}9rs&uAo~3R-JN8TPpQoTA zoG4pQha|cvI-T8Bh?cTGCsG@UE&Clq7hewXjt$;Roq{be-O7Zg7T;Te3+yp|J9#hF za<8A;B|+7UeRw-@&wo?JH}3}{vF2pJJnx-0opo-J~o^0@)6Ys?Qf^-{}v zrnkMQa5a0LQ*rKrdzpqr`HZzeVAS7D8OX<>IUbi<5b^+I7et$}!Sq$0k$^YY+(=789yAHHM zT*F4TY0AB#Pd3I<&adxoy<>2YxvPBDFtTsMC|xb+{XS3|A01KnO3E-NksPC7WgTRyrH$=HNl^5!09Y;;js&gJa%IXHdr)q*un@L-;i z@L_%UckN2TanIt-g$uYG5S4i<&J?z{nwUYys66?!`N(0Q4@`HCpPsDs9! z4G zgI!am+n`m+Nckw_Lj0qN&qLV=yr!}HPeS+VSEK`rXENpSMq)biS#z&sO18pLQ`PQ9)>}_?o^MYyZyx z2hCFrmX?keEuH!X`JLXXb4fodi)n!GFL_V-`YvDU3kM5ihMj4qn9jq$iNPVtKFw8? zDsnhX=7xSnP3VJjsQ=NnW5=#hg-pOwX|%koi&K$Q-*Mn+sRrNGJPt~(Y~N9z1xZ`J zFo=2rvUS$wI@fcEd znLgrGycO?QFFy97|GLTZ8Y@Bt3G&hnhVK5x@42HdHP)-ryBK~wfw#lj{ib2;ywbCp zB?BX#v{!2ZEzKH-qVKy-FFH$Lvz|q47 z_RsIKvHRN9a}v;Jzf8;Yk!PAU+A@Qpz7igWm}~?e8g=+#yZM8us@0q`4<8Gr$c~-V z?}3FOz@*0a=F-H~bzvflHXRfUQ1Pq)&E&R&N{+R$amAr-yhfFR?DTb{jQcSx0S7&- z8ieI$kbi=Nwv2-J25Z<$@q5)m=33=MINI|r0CpDTQ38H%i8t(eUaAPa0Rbb$x`sgE z7fBt<91+<#699(!yg7TSwsSgt5>&ZGQsyGOCXA&)JU|R?Sd5ozbb9PqiG2cEjDVu2*iOj`4 z+`w+0n2+_MR?S#ci2hrxv3(5<^BEH@xA$`+KT%jt#;h}lsbTvZ8v0J__`hykuc%3> zGdUpczj$><6yGxLWLh zY(c8^{7)wn7RTQwb2F7C({crk21`Q47}gLVO{vJ1KCgdUDYohh9xsFn!~a*aiq2SQ zjnb4n!plE#U;bZ4<7!dAJlxh9M={>-JI(mV%%S4kT&uS9y1IFhH%^3> zyHBppcQ8ctE!XYD*=Kr+clsQ$Cuk<@yURazn)>rsvO7yJKJtPMg2=phE0g*+KgGhU zLPQo1HuZ9bIkkAVs(Ed1sXo`Am=0jy+9v;l^sg{}!}V1YrokG&D(6epCiJh=V_7>5 z)v;&~ZFznE+iCYYqK~0cOZ4c0pN$>9bjsP2%<5P7kj64hzt~WjyfxIy@;=H&u_icF_MXuRUF7e}IO*pY%4~J~SbNHLh}- zMoB=qYx5Oy<(=}cd!boNKauZ)o!Yh^v%A8=NEwx84lVi>8^K)nN^bA{y0A)lME8(T zHLgMZQl(*zNq7+p7p4B)?0N)KC*ODa4?@oa#SUmGbWNOPJHPd(ru*Xl+S~CTWR#)3 zUiPcepQu9}nvJsr; zZ@%<3{wvdQg1qXxzsyVF!hLUluT=9kM-Hp%j6%(QjBL$|%JgsVgZ7-JNhJg3zwsz=BlC=j`?oPgk`uo~p^FW>?c~jXH0ft?ErA^-@j&T{k z`c^n9V`);5jw;H$aAeI|J8`E&vNI*oKY{VfS!!YNt*aP2ooJqzvW1wnuS#k!hUQ25 zfBx)zyf?j)qH?t^-Y4rlQW%lhOY#%YSBv<6w=~1s)gzwId%yCI^Vk;bW!LShBs{+$ ziJK{S9E&ErKpddH(nhVhmp&MBaloO!@s(-?q~FI|{%Ymy+>6_*l#Oi}q}$`=?8roT zRDQt*t3z-q)6hRiEbeuD(>cQ+)f?6wQVQ?=O4Wv^eaebdTc_>m&9kI z8J+wvlc2&XkBKkz+G3@8L4YBM&e8v!)7!y{nAPYEcQmKnUTA2V5jarR^)xNSGlQ`L zB-|TKmvBH9cpO!dS^EnUrvDGz`vFaT15nqIT{V5O{z_E4xD7?(u zVvx7)!=M^Ie8olfJJ}L037L*kzXOse%%O@^@M$86QYTS^6G*7r!eBJ-XpxZOj&bnV zEQl~c+`p1JBi1#V+7>kYBDh(or^tdik{IKmZUlfD_rO%XZKb~i7=)&KQfnB3w9*Yv{8W@DMWR&y51mNZ9}T5wq9%GGV7za`EXo-%$PF zVBBBP>da~SQR?z&B7+VTI7u4sWgNK2kQQLdJ}~gYbr;8*$eE37T6cXQy&QlR!z#VGY^B#3qWExnNj8 z7X`?1zq5gvszM_yKzs5QrrU>=svk#H1tUdeiGXGT+6$qxu3}WJj5Z*4qR+~_@J>Ep z&;YW~OQs+(3uqYqj}I##pNtGYOK5{A0XO9_MnCQVk8nE1^;~Uy&M^|J_O_0Fmfu@W zfP!ga&$}Dy@k7S1FrV;vz@qLkf{Ko^itda@rGVb-Bba0GO}|i7^17?dC-qE`=Xu|@ ze^pC`bk(haZjNUIVXOk}NxmwG9iJ$y#B#Weiczb6!dAIg|2?avNUi>pzdo<>*O->x zeU|h6)Ya70WnW+AqtqGIH44k3&(y02mHhDe7Xv*yyBtz}jgNbtqE6av9=c~_%z0Wk zQt4N@vx)$z?n$XHbp8F3OQ?H?F5@+b{+o1ai7xFw9hBY&$W(T%ke(O`!otfVj1DU- zAM%R#Khu&+Nw2(hJ)rTyKZu9V!`8{(sXA^RevabnX7Y`uqOJXEIrr}eC#$&T*gskQ zyMdCks)<|GE@GP|H2EdiKQx^y;T7x=GwIvax5vYiJa7rvgOO`Gy@l@+*pAP^f__dr zu8)R8J4IXS+@PqgG&1ZGU#-3#6uVzNs3Ofa7I~}Nn^WSIyu%Diw3YFubDfv3Z*O?5e$Mu!Cby-zapGrGpi(UQHDp;KD^&nE4aZ zg2Abr2iO;*cb?`FNgsQaKHs4OonTQF`_bn)>}ods^;Lswmya){T&tBbl^&~%ZqSud zA8xlQymZr~raz~L(EEAyrIgI8)AEbRk3XwFQ5=h<@LB2x`Yp2kgT!>Ajnb8m4ixoL zWfox%tZpJbPL8yHJTnK6-|DO(8d-=}0--#jGYZ`w4AcZNsW}{Oq;|-kY6GJle{~%}0 z=#LR*74%n5MFhUyI(BWX{y$Ov+A0vrV0uy}MuZ%_g;1!m*xCEx?8X!ZpXRB!{+Jw&>&HK_+DPLoJP z-2-66ZFRQYTqieyq>uqJcAbk|Y5=M~TNqABGMJe6`pG_-tT0XWAhcn zuV9%PKx0WPNSHJV?)%K#49SQT8lJn%Q02 z3KZ+5(yAPgl{LiN&M$_!Q16c2%X<~$o&M=bgC&(`Q5bHd$khL8sG$wFcE8f@(9<1% zNZQr^IcF7b_vdXdfU2UIFMa_}5{}90id*`Xyh}TL{acUh3{~Ujj_nNoE}J@mXf5)y zFj=Lcixa+XOK&?@e(~*cXEhu7aK@x|{DYXIP!S}~&b#tm(eVXM%aNiT0!{j2J4Pq& zG1yjBhCwrhMh@#^og=QqAJxVL@3#o^U5NPf7z z*x@AljcP^Qt@@*w0Un*2`CkV}Eq#3U&HR4<@oj<6?UzqAbw-b)pGzssrk_Zm9_&+l zG7Z_4v|8SX$PpaMo{i=Q`{roh+n!W++|AMzMFXaYA??*t|fTk`=AAxZedK6kO`&c%SR zcVGtQQhsT7baBKwjrfCByhybjbr*;RTez#l-uY)<2VZ_mU5wa>Q2c}DNl*aI>-EVPhtEJ|nMQ%|?zP)WCzZb? zmiWSlUR!YZ#D8s-7RPKFGs1t<#tFEY*B$@bre1o;^RUx-EU}RX6p_CG5-2|Wv$r}4 zdK6`>ZpW8Dt=LfQE02CD5pN1Mn=^aAy;ZdLmB9B(4olq}%_@*R8maHkAoJ`WgzH;w z-rakpx%M0#+X=iFjTMNfgt!OH1t;6CEPCG~e({JiUMTQmeN~HR@LI98m2zy7q&NUe zJn4A%R?|%W1rS80=*jX8( zPSkMS9h$pW+d>ICHVD++K@g{PL)PoF^CinE{LX>@AaqM9(lz$$Z|;mJe%C5yPwz0F zXAFDK>2SERlBcK^dcXf&tnjYLyZ*2E^L_t}z=EH_MhE5xz~VFdQ;z#d$8oQY@3S@s z`qKS_s6IcZwYvVfm!&KH z_OL@!b5qEgvIp*&TFRG(-vtRmd}mk zYrY1HM@S4gTG#8XSs)9s%Prl(rSs~ioO8itx5o>;0mwbZy9fkMH=k(Q^f=44dp7T) zqL1&&V1JEAZie-8ij^n=W`z0)Dc1_$x6i+@&oPk8@$h=RXJ362&(+J?a>U0OJ2}I~ zqmnlFgb6e0Wmax)UdGy=GkkmY$NnpMf?cU2R^WJW2heWm`UkldmU8cpioS!uGFdtF zv#-^)N4ru?0tabegZYjs|2b#1puav(aNCQ7&aKap zI)fM&Pi?C-Tq67OBP6UXbFP%FhsEgncck!}eY;%$Afafn%~^KVnI__*?AAahu!N+U zLP5*_-cj@I8NxLiLE4x6okw0M5?x)tFe0a z)|e*Y=M%1^qu~n%rqPpFGE+8jI#6`N?F3i_#e`FJS6^M|eRckP#y?(Pd{Z zHAScBfi?C7jiMmq;~R6}56v2;=uc#xC&JOeo4+teA8v-h#OwZ$sR;$iFy)OZ2%7cH zxhDd?il@9{ccJGhgL0COQD}!nlOXVJG=}BzELpcWi7NV4!DMulp(b@GxU{2203`i) zbww`9Bz&>x_ZUrD*TB1W#7nb1Uioe>BOF-6Y(mBS3YV-CefSHL#57e%S(B=zi+5O- zbY;+NgEgVg!;t#VjSHzP@Qpc@e>O2wK)E5)91fZ_d+h{YUh;~p`x;=lg3ZYDnJCbi z#orT%!@N2nU$B3&F{R=?nLLtM0Mt)UjXlx%EI7ZZU4C z)c0%#K$L3~v20zm*E^)HxUM7Hl96RsEVRP#!nlW7?ord)<#1HgkUfPpW7=lCCl*_pQI`CZ+ZaxMd1Aq`QHj`26B z_cy}B2BFn2U^bsYumQE~und(c*Ms|U&dSGWJRyfwTiyK+wMIwTXX6K$+NdM$*{oTH zzj>8Ln|}F2_%)~b9teUX)n^Sw2j!-O0&@ECP@X=p=ezt5qM+)NCihL+FWwh2miW1I z)arq}D~|0vnP@f|vvPk+CSm^8cUINeWb2%58aX{SpZdQ1P!)*Kp!mL3fj|VMnT(Ww zy~Nm~>wu{n!qh7BaVul#6|7QSnOqD@*B0hcfDc*%DS@A21hK4X60ea&qk>cu_=Q)@ zX!^fo@L_p#2sE|>pKgLYIU!q}G(yP~?KGOs9nDRD4R$GJ3h&nGE3eV~IA7oU<+aw> zL|6>t??kXYF6p;}7$$;wI%NPs8UVwsd?H}>dV@Qel0QEBvACE+V$n@|M&I5J$dkD^@%6%z8~gTC#ouPc=eNgoYgt}yWnmA?3fJHA@8-Gs zWR(bidm5{y)soABHL|I}y%L#|KdMk28@lY~MAKp0r+Sg4GenD_%AtMo_Kd72C;9T1 zwFkWWDt}X0x_pNbM&ojuydxgwP5xQ9kwf{)D0K6sY|~Ibq1*db7w(%oM*L}&aemM? z_x^8#_Wb)IF9s&w-!6~BRT6Fy7OR{_8=tFi%|xt)W)btjg-1u_Bd4YGr<=ViqN}LS z{iYY=z5)^<&dZ}Cdm#amqcz8_Oxzo@afS00LvhcJpWi>4f6!I#GIP&+NY2+iNGeI~ zsaxOER}GYpuDi5^@SF6w%5OE1DJI(ja$B-ohX{gc-cp3mbHqae5Y}z%uyWt zj~)yzf9+j9o8THs-lZJ(@+AcLbg;C=KBEm#PHel@-Eet}xr%EdM`LwsGS%?#27frF zWi*Yk_m#t!9t@^kZoYO;U|%sd@lR6X*yam%V=sEfCGVivfX(or z1bOkDQ*6vm=WGX`MOkxJSd8F%$4jq!6)tkMUFCJ`GjY@^rhCi#4?<$wo?W|n&}(HJ z#(QPRhPEuJ|5$@F;?w(!y>mvTcUI;1%3XAW(o0YM#vfg~l}CG<`Zccd(`Pow`Z}Mj zLgyB6KsI;vy1_e;#*n^vTuacBku41Gkh_+7%Un}TrM&y)A;In+Bn7;{B8LAKDyAAN zX&2WAg?xp3^zsH#pITQ>;hs^P-_B?Ht2^L&xR4@t*-ZT2o6FGgaPgFxgd#oFuwt=! z%@q#C*7oyO&WHO=vnh_Ee_DMW49@+7{O`vVy$c;D1(~JsELk@O-@>xX%$^`S8BDLq z*tWQt{rsIq^3)5@Uma%M>);6c1+~05>*&UjYXh^pC+<>4sxcyJ{GgePOH1nycXy(7 z4v<9*Y%NgynEO&TmAwsQADI_ouiahxe~s9{|{qFCF~*f_9vyOIzitt#=|+4LsRnKPnMU|#|nxrG;jvR zEc9DE&HcLnk~1N)ZiC5I1Ado6BKBaL+}+{U`E%e$W+ z66_zObiDlEcTr=>plBi}^d7Qsapl`TNV485wT9Dw5XA}58AZrXzc>>noj+AqPms$Y zQ4%WDne1+w6N&c8+}DsYIkT=!ERID37ra1Vw8*++u0&I? z5S7i1gn|4WFCNfb4zhk{$9#pHDBTp{Ch+YW`(I>3Zy~KK#j$%p9Wz{af`U@*wS?O3 z>s#28wWaE;58mzj^laf?0TvmWHFCUA25{}76I*%wP*i~1pu3>aIvhzU9HBqOUN&E| zH=iSTwlKvQdjfMnkr&ML-+luk zJ$NQ;(X>QJtWa~KMJy@G0uh6a?UWQ%5Q{Pr9HBOCr5k47EFfXcx2j+kB(ni`r75yL znrq5SEGqTkyDIq9<0&eu6_E&nNRBP;+X_hei$F8}nIqeK|IPg+I-P?w1;~0U^}|*_ zzSV*_wIrew*#u3C#cR-|!Yy+5n5!5Y3jMGyb*giOVDlVjEV2;3f7KgRLu5r^sfc6u z4Q{#(+gisY-09WVzc9CUAqQlb!-y9 zy2WXITh|a$&@t$mFBG{&{$GoefZD0`K4L+0^~KJu569Ki7Ioe%>by@9z^}WB&h6hq znl<%Cd*CbD1|DH4b=3nC0lfYTw6x>c)AlP!h!B-Nks$G#ha9Hm5OC>;D&R5Kz;RF< zhcyGWMRrT=XM%Wh7S5~;_!HBwI#|lMv(1;b_(QUFK;}`GYw=#a5JtdUE`pFw232E* zf^$(h<>UJ$MYahFS@AjHzW7W4`aQuZ?82^|*F=IHqP4PYs+RB;npLn6qsSP+@s_g5 zH%(t$@z1&F3_eFL;9zipWBxnv0Pv;seWpA-EEch!KD zX}eK^j8RjI3mI78O?P+Xis17nmOvB)-2BvF)cU_P^k`9naz|VClhM_u$yet{^CBK%19m)>kf$9Q9si`GlT-!=zaDKSBf6G8kQs)bHjYe*=&5IlH;6#4n9$@0%j z1cxu?+)rMRmRy;fG|!KXjX{7*$;tRgJ<9eCA3u0c^M~7kaI(0)P#;N3;r61H9xS4* zbBA;K^{YV8wmF^Q#FZ)#8dk zBE9%ZI+CC7)y`$g-yDI@6ZpD)CYPoGsw!D1V90Z){CdYDe&Nos{2tyT+NDo7=x)3I zo#jeY^`Iue7ydXftJrP2buCIAOEHeU$z>h1UK*T%hyFe;Bwzv&2qAPe?_fnE_=8ABP zBIPX=6}|Gt_Y#swa}e7uO;YZ-Je|_bSnLe054Ipy05f5fHIr!6Z1Wa{a%>?DxTr!I z@Idjt^4i2m=nZC-qkdtt;wg?0?w@aA9=rKx&{3&JQtRItF`6(G7|($H2toC~}`pTcw_I zT1IL4YfgZXw`UE|u!3elE8#Mf!H>%gODR}X4a^cLeCWUknL!nWg<%p8sF5z)0#pe` z)5M`K0hMSWS4ujNX6TUKVMn{&z`SQi({V))F^Z#la;U^W*VHqx%M-3a-yZT~Z)2c! zOs2BdS4JO(;mIOs#UJ1P{-spv`1Xd%y61AzuQ{qe-#ocY7h?rJ#dHZ=-)v;mU--Yn zsLSszHFb3Q<%VBPw?~UD4PWRCC5EXo20mCwX2|t4N7ei=$`%ik;JbF{997y&G&HUe z19t|?s9nob8iZlvD43zMDj=)lyZUaxg)-p5CGftZO@c7n$iWYQUoR<+SB5T*49Un| zE4Xedc$S4w|9E5AhB%IFz$&iv`m5197Z zb(vkJiKwJ445IKtf^YIxrY|E2<(Idg9)#6Bm7k14px7Wzetc-AujZ^&`ykPWrP3&w zB6KPQP@+--E)_yDU*0%?e(eIpjPZ7O-AHoN%ZUVnMD;A{?aaIGlbX*QHkB0jdl{jYAQ-V+8guDd)4_oIQ)YRLq>yU)ryYv-}ilcpS{nV ze=;O9FqvWH&AXoWzOTzHFrQ+|&i1N>eSpW%eGavJ8b6H`m}vbm*hm3szn8`F@l=OE z=8*75friqQU9fBB5hzcRCr<^($~2hFqEb)XPmq^JLLjjAM__eei-lQBj(H~%8UScf zsFa6b#Zru5qPHKAuBjpw&|9;{AOck{wEEW>h(?&DPQzUQAq5Gf=m$=XPm}oBEQCpl#PcL zogYuY6w$)O94+6B6sOWpiIivH{Ne{ra}Xpb21M^Dlb?eT$fv<8S$N=>2vm^xL`u~I zUs(aERk&yktjS#emNfn;Pb(2EZfTyag%fCMB^p4`!l=NJ5K^csT?4y~gleWwSy_XW zmZiB2%2sjma?6D69up;rHYyY+CK{Ybdd01-j0AN6LWRhJGSU2vE@EWlx2-Amh4zW$ zb}O`f7)ba6QqsA(@EFA52Z`PKC;`kGCdUx$QHx{~%mt;!fC92~8b!e^7moPRHl>X>WHjSheE8nix z@C~r{v1fwyF9F4OmC_#5e{7yFQDhfjsZ`z35SE2eGekfl1;jZ)2Bbn@#3&;`?moCu zrxjuYx8@GLcLpRwmx@2W;1ENd*Sox`8_pN@Zv+Q9eth$kl-!@^|GfX~ixVZP{|w92 zO~n;k!?YVo;C~^~;Hk9%pDHP=1<3AtNQ8)8(*_sSJ4K-XXSHGlC@{{R8hk1Q5W*PUH;dwdh-IPzCL%#J?7L3IwN{)hQ+C2p zngg1vPSRGHL-xBV7!hFgBpN}khI_-}$3q|$1^|W71CZ0jBp?8Z@d$#I!Gn$uSjgtq zQJsGPoeY1#MSQUKR~e+?UkH6PaGTK(+yR{rLFa96rUbY4#cZQ}UYst}e<^H_Cp^6_ z8<4_;Q(WCH8jPy7rM{T?r$uPBcP+y2!p4v5k>&@-@zvBxktNM*L8|w}F#2O;ucCCb zmJk8!jb!t4#dNm43!AL<3$_Bv*NAnKdmMYU{WqEPo?U)g;$iDD-;p~d+Rc7;ElG&t zgf`0l{>6=Xv)zxJG$lb#Ym@`V60g~X>%u4fyz{(uc=sCNbWU<_rik+K6HzX^6&beP zpR36hx#pk77F>T=X8mTrpjhfw7t=E+UHZ!!rtudo+ZBV?9|rMR`x>SIHKvaOq2W&2 z_BP$&5*j`A;-b`ron@uWrmLxo$g3vo6^XF~v(zd+cIX&ZIgng-RyEitEw9K2lg((R|Kf_$k zac&e^@lqyI9=)yu!Cj6t9|6$9O#cG)wsHI|EK-gPDb?WK%tzrz?5A79<^sR%QAcib zzpq95ULY3zZ5^9~!MEo+-4^p|L`u^2+NhYRsR8^`qztEloag(a*FW{>2ij%7Bpw+J zM9-T{CD|k?W!p+hmJ+JORSAX9$z>3i#_gyjp44P{5tOB^{d)S|n^i`w>l$xvPg&Q0 z@@_arMVO^i9&Vvi_|cQ!K?*JP4S}&jZ=b6zyM!#1!JjR(?j&`yE%Kup<4fQlTi!+) z48rpbj5JD-V@ONyqEF9Ax^kPjb^_9<=bl_!0&BykUE%0!kSWQzK3j{X=d zW{?_-5ie9j$H#TwsIoL8~n9(-P*486F5t+FzD$zY~g;^~%q7Gi~Jy8R!H(FpYAykw$txdMnUQjc)1!mNyy6L&yTTAJn{h9D9LFh6bH#D z%^(>GW+87LieTg-f_)P7MLck)Na(=^+7YE)B@NO0X}r(W?$`XpJh?ubArK`?N~-!~ zpCXVGdxiWhybx``Waef^L%ddjq1Nu0>ZxvJH5?>WTLT%x8RiA33?uRzM>0Q)N1ik< zUt|687jjR&`n$rjs*98Q@ckIrF>r4GYvDVkaG=J&#@7El@TK)02`cAA`PK6Jp(#I9 z^EQGBwg#4{T@l<>%LO)*?^7yw1B=BD3e9~KgS0a4MD4LyD(*TWDI?J$p9XT&4JOMV zRFn7TO&{+8I$7NPYv3ICalt$yb)R7~;1qW?Ay{?3S^56sOIpQL*N zBS!6&SkC{m7vnhNziIHWAXm5K&haH77f=VF?(`eBQPQVU$&ZE?DF7gwtTCIq%G5x= zAF(WhzQu{n)`R1Z|?1+dWMO+?ms*t*Gr z7!Qhl)w2~Q3y{Yk$RCzZ2>|kdxwx8mAP@nvpRJk;t%n==64V}5iU!^Lv(y>38K%{_JAw_QhroM=icLeD2}wUXUgpmsaqE??LhX z{vowXzrM0QjGMaRT~{+)X;y$>C}l2pPNyjPkRpO^Qy85xU6{;iD!jThMBKIxnG~PUf?=`brFr&zvdJn7@ z(_e@x2f^o(=-3vsr8k~*{V-~5+<0y8>C+HNK?Pf&f{+0GA6E6ef;Cyyk6tdj6jjh} zPZxD73)l1w+lBpvzwuo$z&P+1R+3<*J|S>IW*^VPAxDbz$$pwFN=fsI%6P6<&QFyr zSNsuK&-FjkU~AhiI*%m4WTSHUVPo+DZeaN@L_?}(vlQ0ZrxFQG;8#PK4*aLhuDiN=4aHMu)D55(L{{T~088^6_ zcbGdjrSt`6%f!IgK-%WD<`Vm>38pz@!8`o-d%zF)Ux<)Q#fi_?%3piT^5*tf5Vy{w z3!VB1uY(nir2$SGO}F2r;Eq z!X62*2BM=Fm4TQQUVap7KxvA`dZm*+2Q@Jou?6esE5oB7eMRR)z-#>`>?9vTIV>2N zLV+;ZCE5fo8n;`3AFuaEXb{*b-1L=#R*<#CC zKw~PJRyL39;XaUB5dw;HI3fDrW|gsY4b*>+f|QH`I(338#b+nkRD9%B5dERZmKB{# zW!#JB$LU~YDVWFzv=U}!rKKxD;E5)V#UlW4l^;gZrISJwWh(k36ZVg(NXP9PDDDnN zTnQ41T%q41a*~4iAUVY{Rs`cn6%Zc<+9XM5L7HaEM|yc&jrR!&L`6C48hPBI){^xrEjDLF;(#L|nx z%YDT^VmUnY=+h)yb}(UVK8IEsuh0Faer@QcK4fwZmx5`rG`c{Ipv-Cs;0R%VEJ{p? zR_bFwX&D@iXfj0UuLu+wF=($yn;k8F;A0_8Z%iufLf+ zeB(e0!zV83KBq7fK@I?>Afv!as;oT%{mrxnYSr(L6^S&Y;6Eig3vQQu^I}VH2OE%j zplhZV$Qa9dKLDp-9K-YLr>xNGlDu4%hkWORk~jOITDMT41hxmp4}=#omp;3$%Cq)H zc{^zp?Z`8%cMikTh4c&{z>+oxZA)vEK`H zH}B0q;rme7G)Kqb{S~*WRnV13MJ^B@y(Mqtxv6#JJAajHzD?aEdHbQ)-FRtEI`wZ0 z>b+9;A&-C`gv!+C{OdB%Bu{szNA*i%a?V~mycF+wJf%^ljv&MK{P{36b5}5aVV0FU zhx=uZ)XPV-#&5fGlggT2=h?leHz7PbejkA`-lkA9P>^_VLH|a*q_^TCJm}mmQP`hX z4y;(s{Dl;}Ib+uG(~PvgG(RM=U@YPmU(YSa?w+J*F?_iOyN#B>B1mCmDL1YDLOh;; z4@pC;=c`WV`Es?Wr9-;y^YN5|cigR=SANwyFMQ8*ufO+$s+m&zGE2pPkR+4@Dj%uW z9`G0PznXBWBS+Wb+R3?p-DF!-uH~H0p`5h6G8oHb_V|obQ<%ZRxwo3Gy9)g z+PBMk+jEwR*&N2%n$Lt|t=o5*1m~(RVIaTM^t9y zAu{Fk0_xNqw)x;-s8m>bN0K`FilpoxrKVM*p0X%!WfIG0vSu`#jBi^^qLs~K@w4+Y zV5ug~hYMqGmsQ|Z^;&~& zw|_o%lV4XGWbJ%Zxb#lr^M#}_DgLJmZN*?)n=haAk2lG^N}_k3RMf+xEZdSI)Kz!e zVkFb!T0)aU_W0?h7Aom~Y3O^MQ65wNk$1D7So1&n7LF0zxjgltl zW&aY5NoDQ3a+<6iF=-4-78W*W8Zs*DJWn9I?z}HH(z32Q&bZJLu*sTeJD;2NI=eZ$ zwyGk}S1Y|Cmp@Hgujtl%QgKNRxYCND7|B!ZD(I1a{u|TQGO4>51=yh9+jZVtzJ-&nz=;HDO*Fq;FL#$BkY)PbXYd)D8AAxA! zmXyKeeitcRTuFJ-z*>W`iMei(5g=MacF%@vp6ye+3#}^Iy-dpE6XLD3TR*o=Oxk)URJiIIgSRne}v)$s(1x2K@YJyd4w`vsUwMx%Jkj?P)nTjxo`-d>qD)LyfD8(1liUoQHIScwmyn~KDzjbc zNhm@Az#0;w@ZA$sT+gaf8b`QfqCSb%5~xi)prFziMBI-a9su_zJz)33jiAL@u=PeL zp9}1~5|qJ>SW{+aTYrH`_Upxil)v`-KPO@TYW(v(?zL5l z+6khW+1^z1D0o5LyQ>`4vc{7671c@pl!Z@2W&YDU{v~_Wtl5U@>v2y4rTo}3DQ|CZ zpW_$H`<|+HTF(dF5gV^c zdX~dkOC)xbKyPSc{cgT5q?Cys+}5qnUhNti8NfV>2oo5?T^TLS6+pPxK-B^gDUUrV zsM4ari7S!J5LEtw#^r}Z1|ZAFAG%zmBUnh;)GS>o`GOKZ89wghtoYl@mF|J=EF;p)ol*~6`P8Nhs! zX0LSejdvp9R`yrUzuer;)Kch}J1yQ&OE&lmIgH%;^Dsop-!UG8A)p`zqGgPIwg!vL zmpl`vjY+yMd48t`zkF6PzP48*!s@XqSmT{6Qw`jhYIl_1=~c0L!^`p8+YJ*7mX&Y3 zB~Ct3F%wQw-dVWRw%?wwakS@C&istQY-qDfA=93hwkHUkGd{^R&mx81eL zgd46&62R_8?RTx$0(2#y4WZtw^f}!K=ZB1&FZ*6fcyYlxdM{J5jVTVgmp^+ct-27uxYZ@$ zF)YJN^%k~Urw}rnRzi&kr}57v$n3O-^dXNF@ zX8l~0YjS6XMf_m z%-XkYPu3$N&EA=lyl5m(T9hBI;epi$DeB8Yl?Ej$Y0<$idVIKgERSN9y1&<6j%AN* zeQB3TfhkyHFe5R5;ncR|Z>PR1Q6cZSEiL)-GUFqLMeo?}3(W=1Zz)G)^Zh9OLIQTj zA}>T5AU&C>Zn!M0x6j>_P}Csx}%`M#ck(lWnIJ&p2j8<=}PWw7-_ zF(O>`p+R!QM9KW^Cv1<`7k?QUXaJE^b~^OLD*6p=8n0~K=8Kw7Pa z2;tj9!rsw*itpS2X*XbD1$tF%II%!lEGv!yz5xa?CIYlz(b$#5%KJ1n3{7w}#cgEEoj%!=<3A5F9+=3aCA$e44|u zYjY(A+4tcNR+NdM4AChjQ{Ic0XOr(Q{A^Yl@mR#rq!IQytrQ_v|5DSUXhrgEv$aq5 zL;EAy^_RNes(F2MM@_PpB zkd&wYDVP5TFhhDNCF_Zh((3;O`CtQIlCrC!!X8*d$badMN%PHX z7bxkFfA5qGz1@-f7qVJrq0kV_4pIZVQ*3vdSv11T&^OAtX9-a})X%dRe-nzWMOsaw zgPr1zu2bkScL(d%ayX|QD>8DV{U!vNy)_VtI`~()Z+J#F_$#;Ar-F5|Lg-%zuV&JB zL$LOKz5n2o*rC-^J`EJpwcW2M#)=gd65a+9Qw`9-)(G}yB%k+Nl0?3NMqn_h3!ykk z?>?y~Lla#VWDEG$REVN4v#7|l=OD&gB+$5l-PT4bw!qKBhldGz1M%XCI_{P0m zZDk`y>bh)umuxYHMrIw<62LmFDQj}D(KR?Tv$tmYGx*m4&x&-zb<&kq>q#FaE$1&7 zDuDE^;6qOqHjSUjPczEgtFY^+jP(R}qq5sn%`A*m{eW3$rButCkkt>*=RY5#^g)bh zZN^9cV^YjreQ^eybobqH$AXC1;SQA!$&5gr6-A{OiSmthE#J%+5aFA24H{$J349?j z;MgrOxutnKa=TY>mh(=#Z8lrG;zFmQxGybN0JWd*vthHhYD+gbQypC@Za-+Ua`#bP zz+qSK<87Nw;KJ+Iwh`klE{ecJ zXMSMXJlsJOUd=~-@hfd!JlR6s)I}Y?FxAVvuk#7~&5|U}z3s5*R5K?uoN%ETD0()X z$V#;Oaz_8~!snmA)7KHzaVD|wWsglW_PK&xfu8NP0h6QinTy{G9UnCH+5^Gw>}#n< z7c<(o&&}_i+|+v(6h^-_=EU+BvIm=8JJ`oe+WsENRQCa!i1r^{w`hbR5qy3R_U`!1=@LMP@0TK)87N0nSSx`Bgq)H zCb?CiqT1&nPFqRpksi7tXqe$hUIw8#1l{eRytu$vsu{cPA!cn@dLU0X-^cU7r?q;( zH0#n7QJ30`&iSKI4HTYPHxzN~j^a_xhlDnOfDR-?Uo|YBnt1;4wIpeJr^RC)95RtC zS}a6B+;j#4=%8Q*ED$h0#kgriA|iBI!wQz*!yNXA(fV|pMg#tl3vKhNk*_?@X)^i-k>_di?G|8?~IpVy*(r6mnHHukj-2hP$z9PHfIc|Jre z?YFbKxn#?`27!$Vh}N){rvcE&5~eE483OcMo-6zzR{H(5A1E~J1c}J1=6?!`ig&0; z5%fRhsdN(fTuACXpphS;I-&VQoxF>D@(qwiQlUDWg+wsJ^C|5VV~eGPf2yYYTL;Rs zKISwe^7KFq)b>FkNLCG8Ok51RrUXVC-EL`yLau%(f{?vpl?Q2>2zgUJ2HUj|T{uP5 zyQoTe_E6zICawSvKMIC)lWzw=-&F$CAIqZwDlit}J}^+g|IFYyH&8l!KLJG$yFNvf z#k8&<8C3BKz`3Ci=i9EGb(*_$W>R&Myxs?Fkt7mmD)?Cs`N&oCon`9JKD3PslB{!D z?{x>@XMtZJa*9t^iGSd{4Gt?Wy_D#Cwtv7tg~U&!UQi`pKl6?L}@a**n#bpJ>s zesQ*Q_JY;V?Kp|AS3KpW>(?B{dm|T`LEtB%Te)tB{%ajio1QJ>V%wiR^16kB@OkMJ zz0EVelih!>lz+huz*h+4xFM_ki%eVhRUeqS=DIVkWmo;e_N<`Tj`7YkD_`Iw7 z8Yg(cm~zDY7c$HThCKD2l^xri{Mc^ZRH)cNK9h1-Ofp7;6rkeCaJnSbui&2i^pfM3 z{7bzIyTmL<+n5Ux82u9`rIh4 zvsuD`+V7U^XF^Osf*i{&t9S4RNpA7mQSEO#T0SK>B-tE@-MTpSdX|UQ=(oHf^eWm5 zcT>+#ggVxbjr2j}qGEho_m;KP)&2uBlNBLfJs<*?8dAUgu#@d*S9*3q(qo-YtLt5K zeRP%I@pC_Z9C&Fq*xgk;V#nKPVN>bnw+RuDGwY$*Ke$x69jD$)q;bmio<8LD-CpBe zwZh|eubZ_E>}LF{O9>EtuGxVJ`ul_3_XZl6G30$go*iS2ly%bNpLS zHvYmvjR>Xd{tZBioV-^=er4$I;-hKr2LbVr1Tw+MUzWDfg>4|$Sm+!a*W?s>DrHw^ zKGg`V1YHR>JUGeLrk2J4sVVvLQ52SHjozASclioQCW=6zVu(l5rjYQ55P3v9tYP;x zknCk}Vtb|89geLQAO*?=ied{vdpra@ewU|q5+B14WXU(;M_eGZXw6Vk`!*`lbxy2C z@&~NI26(t~5{kTpfEE(z79wFIzF;Jl5|Ga$H$`y(Hhc!a%ihsw;T|0cCy-AFCey%m zoD?cx^AWh@XCx(ECPx^W;Dr9HxhvN5OyG7;11Klb9uCDJD9N>XCy53=%CDuRJXYj5 zfa$AD$42KbgU5HuWxQ^72dfS*eZ(I5*iF-%q(0vtG3<(3k!2$A3;a_Pguo%lxc|K= z|G%dw;7_UOz3we?*ncXr!*1R2L7*^JzvP^qF;yyb=6j z5_wbJEUcba2{gGfjU+5I=NJ$|8=8;@pfZPXh#Glvr5gD6>za#soT#`!%^-ie3UD`c6VY-AmUWuO6z_WOnJ z7M~#J)cus3sTaOjbyVbkKgti~KflS~k3F0$<)llS*W^&bHD9+i@2q~eP3(x9W*ZJa z_M}QX88r-{{=%VtB|7}xcHouu$FFl}pUQ2@g(Zq8T$58b+c{*t^)_~{+Gcw&sayOT zu2FiWqH@phTB}*+x^8dGgP!(Ri_tY0S&L_gC%?uLXJ&ZXQ40O<7~19=eV^|HOgmn0 zr>EZjXzV(vXSMqc#F+onq~T)c*op1msIBH+TCcQ85o_;e$3#44K3}(6$^8j3hfOPt z?{)X+Hj{3X(RcOF#nl<}+y(0vOcZ+xBKMBm~o34_lV;ZAnleM-xWRuddbHzscDC{>i-V!dgqmjoHE^;(L_TQw}G=iZ#P8)@&N* zhsiH&l0-p3N8|eHo{gDYm?9YhEWw79I2i@sTi&xR?Roj|moMugU-BjI^yukh71_$X zlfte<~r*@yeXUkIz;Rjw2vyL+@WBI668S(LC@834ZL9SJ)9A zV>3^FrBU_NBvimEB2bni`JHtTSe4Q7y||okM|t{*LbTl*_xM|_IW;qSD_GSK#wi{O z;#a%toij3<*pmU&;@r zd$~{SCTxs#!Q)=SbAL5=ojwtV;FM+NgvkY~8+!*qP3zPy2W;4;QB}O+Gvll|diFEj zxJf0qUUiMT$v^c?hBs_a)cPY^GfBloM=m!q^G?rlaPwxPuTeUcZC060P@dj5nbzs8 zUXDu~l3#ep?)#4Wm0PS752>{3K-qd0VwI!|qE}=l`m$v4$v1IRvt%&7toqePBBOm} zVa9Swd5ooLtG?n}-fz{F$_A6)>1cwu{NtxKJ=OY_w~R~YB^L#*`# z7I<|N9%_naXDFXSnlf+6vrSB?`NYB8Ic$y1#U6v1TaE`tuHJXV8htc#_W_pyC;zOn zEHX4x@?=^Fb@f#JiDzy551P&Fa)bSR8YO+3=jM0H5E+le1u?p5veu?rSvvus70Xl>L8K7J;47T?u?C(Jx6De6Pq2umI;>=)W=i}x z5U{uL2e{K!3d&qgPsg{4=&k}~!UFt}L~nGe4sRwZb=L^CT7iL!I90dLG|ge0!j7B2{z2>cXllm;_^!apvK*rJ?l;kcpSt5_hz9L6@SeV zRR$H&M-Z*M7?%ADd;GQ`A~88}0YhN);$ZX#t8#*N-qf+N$nBz5K} z%G^XsMf^e+2}~x%7$4!+sJKvo5T^svvs$FEVZ|}LLnGTBl*WG@RY2|M@CK0y1MO6? zH=TFChc;B9&^(oLMNN$lNin~>ve#Yh%woHucFp0v`6on|$@$H9lh3tNv>gqLa5A}O zTtTww+^{_(_>CQ8l^`?PyDQ(!X4jnX0d$O{jJigyH|@h2u31wek^Q@?=s@0eWRToO z*=WkWqDmp((%Sj!*Kyv6j~G`{xQ`ao*3UVx%x(`xB4&SRI5!CY?jWG7on8XHOwULV zgAf3yOF%FVM_$?o9t)B^UZ08d2jszwH3?WJi~j=(@I3!fs2o08foT{LWy*mbsH{$r z+glRe1^j?7@#Yet`eiw&YdHm}#_qSE&;|g+>yoI_x8et~nLc{OF|~gxqUnLTt{&7( zIW$vYx5i;Lq&y&BgeL};mIeK;3%mIiUf^exhau4T0|^-c`EaF~$OKU|O6*D{e-sMo z{uY80v9P!*>IJ<++*$r?En;I8FhG(j` zkc$W)!}mDvx#$RsS{dX5FSHCfNra3(JS5t=mPft6+F17N&#N_@tTb1%4b>wSAd^B1 zbOKy@;`GEMv+!qL)C^t>liYvN_4DNgVizrit4N(9HZ0`U85hLV|GF825oSR*0G z{%3LTEmDRARGs%ON9w(6;0RRoXuZPY&a?L%DbeQLWG~e;Z;LZA*as@iiCE4}9ipHP z(TLiNHIIxQ3|5bW-bAMw(*7o?GI8^G0qgWk1lIDWs{oa_{`cp2A#d{UNZ8~tQq*VF zf!I(cp@wEc3Lub02`fk`{XMgi#d%>Nl$$lx`zV#@FW^vBw>#cC`(BGBm2oIeocs*{ zPDe;;K=-U7P+A=|g;jW=oJEq4=lTQ4rjzi4A;BVZ5YZ}TpqBvOK-<4wMZw@=sto?} zY;NXTt`B~Q27q|G?B6x*A6i%6h+q3T`ZXdeWRQ$2$vpA%TH-fG@RDQQeq2WGcEqsM zX32f^FGOZX1Yf(ueefNJz1Z)%L4CWGkfD)z>LDD!^S`#$|CxXP`!)2hH!;1BG~X90 z9;kf?+L)LWn)gPW-IbQtBENCz*uxNFL_QQ2uy>hzIsB4J^1}1onp@ewz0yIQhDRXJ zsK2nC$sGu3uz9^4Sp+BXx+HDqIwP2s_d#l6#wkPAsY8y-5M{ZaOI$}M8;3xXXVeiK7Nc4Rm6>N0M#e)EVKw{AZXAv{qBxpEH95BpC6^7 zRLr`pWB5X!g|?B+_IgC}M~l81vipaFc2&RXxWpekWWkXDo!-A}FvD>yggVeE1Vm>j zo#N!KoE}QHk3MaXk_MjMihi&07S!e0c)yUi7bj1u?LpzJuP=OOc}j1TL2W}YB7&6( z9L>NVM5#n50qqk~mTRpTeJ6Q?t%)c;nPlLsl0M=+6O9KB217YxIrS0X9XzD^bvZst zjl;?>aOYl9JdV=v>}o#IfuZ~(pG6`~%*1qoNm)%J8|K;PKR}O=Q6;>0pTY>9`u?Nb zFp|qj_PuyNB?y=$HzO#UWyM4U@!({AxSCIxjb%HMhx~`CfbLvDFj;3@f`ls0;BR39 z9>tLs7P3}%w5O!%{;^b+-Zqk-fbWpf5qhJ6yyWhTtXR-e!UEMi zcl?3;3??)Eyi=T1K>1_brbRFRUU7l^@_)>VgHyX8#p1WsFBKzH5@!6^C_qp z=n>~HMP^(TH2eg}Arw&tqHlm02slZHKh|W0iJIZqV)5Fe;9{3B5wTty8v#nLDW1%V z!)i;hM!M|)1gNce3)hH&pi)d4Av7XLy8J&IsNq-XC{rljSh?B4va!lz!U(dS=vyHh zR+&PMp*rz!#J^vqWy71H!CfyCTWO52kS@-x41Oo7X`k#h3di~sl%}WX5on;AI{@Vv zSzHatSmgTz7K+~de3<@N1Q*3bA2pneWH=4gb<2f z504a7R3jQSW$z_;H)KiaL3oTvmY60A)6Hn^){s6#gYBY3ODa9!Gtn+=@9;8L-0rWN z&XI>yH0~GW_)|;R03M)>KoDIVFZsT7M<1r&E@H~ez4icj&s$DPIyBMp?e$G@d`^X= zxN%V*hKk;35F9I$Tdg54V>T{gZOpF?4hq~KX(VM{b1H)Y2_t2&yv=JMwM9bA%Aj9f zL>_#pcAv?c$|h2b$sj@lC-tT&@Y|o)e%oSdiFBW~UwrYQtY3P^*Lij`u@MXrIT*>V z&&B$1ii;aiLz$lDQ^;JQ$h)F9)OV)68%3_wK6Kgf&wGTD<3L*0Lou;|gU9IS!LNHQ z>Au?7N^~AJ$K5&LKe+`P7nEbt9A=S;`otT4UoMY(q4Vg$L45(Y)Hmgg$-t&qZGCUd zx9eu{8B7Sh@~GPX|NN9*Y*1Qre$#gQ_4mIJhN+*ZBkzr`q?0*9I{X0|L+?FsSA+I4 z^VHFwXTtaFB3Qk{uKp>wMtdzce5u zBZyi-vT%?;*g$2=g;)beKk+P>8NXLL#>c=J39|Jo+ZmzY%+P{ zvujotr^;e>=MNJtYhso>x9RS_&^&V^-0rRb8Ql#pCk)BhXbjCyW*!=%RjF$FFmE8I zeXIDLhgh@rr_O>FAajmmEb`&HJWYTg-W@~jVS0-Sq?ePS7(pKE{wWfswlp#k!CXs# zfMgZX`MSJ9lWyg328Rs?{nsBZ8FiDKzRDsXF$Nrl`cc1e`R68}$tTiWz1qw83&KU;&N*qgYZ{9P!YQF2+*%GX-|Npe3aWj(btFs0P>(?g;`^T03{5u>1Lf*6=Z<*eGD=FMS(cEU zqCBHe^_K_0yWww>_>%9@rA%cK9#l8DL_pK0f->gLhlki}C#OVm^y&uc>+^^w??z#t z%sr7ZpaY%#BbG#yrYHuYOE$he&>#EeMQ<}(aLQy;iymkH?YHI#kXswwl!1oos~(Ug zcvc+sbrnm=@bZOC#?{nrgRZGZNp)o{yO>48m0SF!MGN#EA}!ZhUj4(Su2$Vpk(RQz zp)2*I21UwOiMSE27C=w~2?^DO+zBBX#g3kLaiB>&`DuE|C($m`ZB2DmIs8AbU<}h5 zuvmp$0Q=B=71ie_hw?BVi!|h5VPoZQVooOwkY~^kylMeYTf=e2i=c#lp%CdVYKNc> zQ(Scr_E|9VXy7O`$|C?@CHOjO$hr3hdVduStNlsTf1C~>eEA)_59O~G zGiMTQ$2u=aPl}y2Md||bW*=BV;w}R!gMx*^Q-%x6ggPclzblW-n|gdegfPh$7eSny zS^xzNu<`RSo1+PfpeR{sHpcBl+| zUj+Ortt+-T&d7*-^-ZG0j!HLalw|S`!b=rGC{7c}tbvqtafusVUJ}tI9lx2>(t2-x zXSpf_(~5N@^6M2<@)_;VM1fE_@@xD+ZcVBSq zFPU#_V}l=Ef4uoh!B@Izyni#3!qh-epKBGxfNgK(Q6uX4k43;^^ksM(nEgDgU)S79 z7<0u#&SIdEP2~~rPy&qyD1YaebwD$?sClC1idO(7IaF)jDUuFYM|~7Qk{a)zd_YyM zY|wB7#BluptCUD}0db5lGcEu{@DYgj47H=QI2#`qYs`)BDL6I&>KYlPaR8ijJ0v*F zqMI+a8ZY*XkDU(=pV4I3RTudxep_lwQWKU2!B99^Br7EFVbN2}PJ} zcgNxB?Tc68PokE#6ghVvmSBeG1!?t^IL{{D6nw!=qr{?d%{ay4Y3aN zF{nz?Yaujowbu8h6s0)5KL0Y_r%cji3rk-yyY*e-%|1{QYa8G~3sk0n4n3IIEz;XA z(2?*F^i&vSi(8zGJtnEzJZ`(-G_5y?a?i(W($5#lkBOAg^Yq%OBi+7l%azhPPC1A4 zyA;}$Q93^e&ENuI;48SaT^T=mhsUUtv>298o zg)oLAYnLg^g3rSD^!h_;Fo~$wZFw*#oSm+SVS>PZLz6E9#COWUIy>yhugNxz`CG6y z?YT(NPrk8Jyu;XM7rJc9vb#SfZ;p;6@TZ>RhHC*H94Bke9(q5YvUSG-1%+Q)M?-&H zN4pBxVD;q3@1oIX6FK0E8(M`ZM! zw#o<0c!%8ksgBn%vepQ>g1YP4R7pv=3G!w6~i53>i_37{x|@v4j2!%pJe>7wxGhPE;ILOG;c*=oI1KJa!v)s?0B!h{-<94jY zoJsDZS0#BzZXpypxiV-^FZG5hqlPj8RghFJ%4Bo%@WTsZ0>hRVfY2*KBEIT${UNVh zMG+J>NnsQppDvdfklQr^P2b9=sj2)CY0nJ+Al`Cs9feci#ByQ9fVYysMAgCxL%oC4 zV-V_3s#{nTeP+TH(Brw{FjK`-96+{n?0nI**S}0Mwl0E9% zT?exv(_rf)1#EB~ZDDf0C~|4JU^+M6Z~d8mX8Nqog6JTn;;|TnyJAU!*J%4{$2{NN z?RMZ0GwBz^{nqbp)Rd@3Q4$6jxTL|>=tJO*@OWAs$#mV$Bx3hP_IEC+=Gg74kRRSE zX6xDd0pI`l-KjhqfvA-Z_4~mgY}&E_W7oj$2twKrTN8AAC94_f*|@uy4xj(U^9!z3eUDvIjT#6S#N?nG?9So#`{p$hmfnxMWR|E-&A< zE3Y~Pho&W)b2smml874N1{4nRTO4}%-02z?Fl;fUV&Vo2Xma0c7&_0LtoKvw5xWk* zufyln>1p1wAFQymWz#my8HngPmtK;$TCg0?zC+3+WKVEsEF-@bOgS%;bYB*vbn)TD zlIcbybSm6t2;~~-+^4!sZQ04~m!;lBy7Y3J_F5^l4N6(jA*6_m9XXj|q8&?I5ADCA z*IF_u8~a)wGIm}z&!4#XG2nJ>!!jdtZ!Bu5nAK+ClD*o)$OW9qaQ%9m6wk6pj zA7JmkVkrBC=9PDnW70!Cvk`Y;LWY(ZgvmhOLyf_=VLv~6MeC=JrJ6K$h}vtne7*ms#w{an6Uj$IsYNf@NNk?&$lD%K%%ke!ce> zfrc0JT5_-~A%N4=v#c_$f5Dh@ep9&FV>Z5CQi(~F`>b--SdZT~c5JE}lA@nXS zfK-uQ5~PC=iu5WSqzlq}?@d4f2~`w9kd74TN{xV^G%3=hgA@Vp{{HSc=bpL$FcXGh zGReF5yWh3e=XqQ{&Kt_*@ZUjUL>>cz9=l~JRf6#f+YtHaA1lp+y^9*nA6m531&rK* zcbHwlnELT^H>~xsS9OTz3m5;5z0-=p!(5;oX3t{#jR)~)kv&58RZJ5uz*?{^IJPCL zFY>}WRqQ!0nVTrpEefK;w-&1x;W*(|w)mMrrI=rJ?oASk&gBv10I*tx zYEs6f*dc78}w2z0bA^UpR8RWQsx-)M>Vu=Y-a?TBLQ0$MP@jQrHS|DmpQ# z50__ebC&E|dg*Y+{q!1F42^p{$^&G?C_=Rr`VzDA=|!ieS=$-KcWRXbYu0I+M>Y-`b+w35kW?a3QM>a;RABw@Bx|T6E69NJA%G#2wkud+O*&IAO9gS&UFs+AO&X29$2KWDrQg|59E0B5Iyrw^4eJ- zdq0jp-e{^w?gN5peCH>uBc6u48f#xTEZ0#-}4$IU6QC~157y|o>({<*;id= zzSPuU`tAI@6`8J>eyB+3O?XF?`B|)pw*D!*gpkm0bH7iSB89_{PuZ_)h(s?8R>-M` z+KR?Vv_0eMLNu3#C^ZEc+Z)`c>xyNTmB5iu%A8bLnBY_6|NAm4b=zbUyK8RuQtn~A z?M#(R>8UcX>`{4Am-5G7Ej!j9Vbm zw0UFsiJk0OsoBrg|5?Lj-0}E_Yw-VB!(#D(1oe7rI1msGmazEL|0(}B(pWFtHO(YEc^vWoM*M0Xd;!27 zB83Ks)h?0V7afu&&wCF?1)WDc-91=Lp1i?Vanz>FK8$448JO8>Ump^#eMb;|P0{Dp z42J()9YpCi@;=x>rfDBpeP~Uob zU*JW*?(tXs?Uov_XcI^~7~^RB=X>lh^A*2^feXCjHA>!@Bm7Ch>$?} zRvw8rhooqa%tKUVX+Ogrinv}*7mT3i%1YS0S^3iCV>E->}zK% zv)LksM+2b!Vrtj{0{?UqA4YuRe^P1*sY&1JhNFmxBq3)XMQG>xxHBEH@t z1D#>-XFUY5-?&1>3&*+n^Lc|v3o6~sgt#gAv|ur>g<_sz`$5@I$QUFyXI-1RpenUW zvL#A~@b=4PW1;_c;rDQItR*tDw3db=^O!^H993d@uKfQyiUKdurPpc~k-cqC`@R!V z;@RA4>6p1>i+An>2fNDv?e^=ZU!TARJazQf#P6_cV z+G5w~L{cG0hidQ(%jtm%y{^n_b^TSl${b3@v}uZmK!RKuUj}CtBjT=^{FcHoB7ahT zi|>2pYj-3WyC+)0FyhgRx*7#GP2zWV6ZzPmV%18p^#je=jJOY|7U>x&q(|*7!QKc02kX2f-tyRdOhUv*>pf6%b~fKfC$Z=z9M(*CCB}@%;eb zxLR6;^k)HbhiWq}pw{JcKF#>?WNV!{_hz#P4><&zV`566lyJgNRI zTO|eR1g5_yd+p6|dyIJS4OC^Wzn0?QVAtR@C@6O|O`krTNYHV}9 zx4yxReAIq?iu-KR)#<`!SyyP{T2-AzG0X@e6(iXy81SFnK2YvET)<5w$gYLs=m zZT{H@k4UD#&lk-2v&vP#+=OaL z03Gq|QYyTx_{guHcpDu1>>ESK=@Bq7LvP`By)=6fqgVAKJQ{edyXJW%AUt^k`wbJj zyq%Q@XvtgXTO$>Y^A_-@3LP-kQJ89W@zE_T|ExEUZekq5!Nex5grw8^0Z(TLHRVcj z9DUIK-E5FOZVFroG`I4CBpQ^>_72v*M zUWi*C2^iQFY)G0@sMb0a&teh+A!sxFVVYTXC7DW{;UcY$6Da|_bSnkF%9|3*YBDOI z$1`f5>UW+i#aER|M;`{&?bY5NGMeBNNU8kVl-AF8=={xZkHN?Deut4=h~((P1H4aC z;Uw+7b=6H~3qtE!Cmx9C=YfdlpvZhmC~Phi*}6kcJLn#e9Ou;$){it>HA=PoKywyl zfx-~YkWp>4tqfJIw+I~s6mPk7v?}2S8em3-HQ(M6+I@G`_D`a!zLq#SXWSrSSUk)_ zte7}79en-f>w3#-$b`{g$S8lKIYSyn@t}fs=)qTJqSZ)xNBq^MYhB7_%Ne%Q0;b*S zr;$SJ935NKuLm*?mQr;jsjWn%^k(5x7A)yCt|B?y58=8tc%^nDC!8+}Pu5agr+wyQ zrCPwf`jZa4Bo{?K8vF*p;D{^;4?plF1B(CM(n3U!r4!2ztEocjS@R zu~}#au36p6(7b&$O#b$R3S<4exWjN5|K;M)b=QWE2rFY}!{h#yF$Mj-QVVWZ{T{K< zxExdZS0K-QZ!7K%Lf(M#w;Ov#6CLH1cxE$K&tE^(D6#ZZ_7>&{c$mh06yAT{lFBh+ zK~3E+d|ah&P`aY-`CGq%!Vq>pVDBxkn5b_#T3^RXM|Dvw$C}SG%OkJc`eSBnzgYsz*S`k9n8^)|{02)J0HvdZ(f?4Ooc zRp(!eIt_-9rFaeOV9fgkjV2AtCvtyj(#q>&5%N`OcGs+efY^KJNjuEqi7B^+Jh8!Y z(tXQ7Rg2f-#WeKqNxjd2wDsXDqBu*@*afEG>g3fXItw(1Egnne$>oTXtxux01 zB0#C`uDwQ*1Ysksc=KdzET<^v%DpBCD2a5J+30w3Y+lu3c)r_2g^-GC-yX-eCr;RD zX9gw!<1qKIskcwbU`XjKKWqYTAQm*k3&;U*I6SUI2arj>ND3 zj&oQ^y|YHCX<_caZFsFEl8LsQa-7_DZ@ywlpKv#0Bz4Hr;PI2+qMVG}X770ka(>DK z%+${(k_mPsaGN9dkpi;M#7WFZ2Ouprsiu0*Ebr^vbrN#<-$R`P)tL5wAVDyZ^)}YY zDhCEotQC(l6LDaPE_@(`v-#g>~9M% zWto2*Wa3b_E79V05dQO*Jj+jgh-tB-y5P07_mGwM08Pyh%?nLEF%4dy;ID=Z_t+{U zqhxSwp7W>}zZcjHz>zx>B{Ok~VR6!gx*&)(*v3$<hij*r5x!hp^#Nbq%We znJAXeaw1%h`Lw98+XB2c`u*Wwl|~u(^^Ac--<1FvlhP(7VTaQ4qy4GS~h+m z6WA=L;x$ni@eW{sC}~`OV{)?j2jU%%4W%s;bQ|?}c1Q&BX8WVq-_r8VI*>1f`{VuA ztXOSIR9gJ+(zUVMw;sCxK;z%j4}y!w9w2WF7mELZit5>x&J|zA8S~h5eCt|H3s@`k z>~(!O7RQmWC{=A-!PnN}{p~LIgQrDkq7oKANb9Z@(UI)%5{E<1WBP&x`Jl$@C)SNV z1b*=bd};mbuco!#6}NA!`{3i`s5MtI>jrExp9=O-;=3X1MCxv z1i!c8Dn_HvbV)xn_j%1*$c)u}YpO;%MC7E`!9)gDpO6r*TEN#JLr)mH`)YkI zXZFV*tz$6xzx64Gqra>$zgQ2WN-|r`_at1IX=zU9{==#oGFHQ*Uvl*HPF&|1VZ_l? zZ+N=2a!O!agQbn6MnJ|31+9#DqB(QD(}%R;Y>~yYKcYEr$=Yt9rL&=5^CsRi<&HN@ zTx-lyJs18l*ZNhlFaxK3^9FMX?DfUbwcjq*w2pt!?p`rzSSyum!inmDj-x=W^T_&v zsQ9Ka74S6KZ)~afcev_jdX=H=sA9~$YsgCR;{AUhgme9BI8pT;Z@N_OHx0Z^kw&TL zzlQDLuCvNy%Qvdll5$4o7G@WbtNn^EjeX+v4e#hzW|R+M2^9=oW!Mgb%oWl=t6Brk z1BD+aD&a9YYH9Fu-hK!h=6<>k7+Z;1TsQOOCO)=+M9${5JS2uKTRHddBwHFNhcs>g z?SSziI#`PR@+_fy5UV5YmpZl@64!h!qzkU^6k3@0d z1N^NU1@ogyvY~5{G|o>7Sx=Y)2MY}Le(5LCFgstHpvj(Cg1pr*wxbG1Oe6EiHlB*c^9a@BQ((k`g=m*>A~q_gT^^`i2ar_2z; zhMv+NwP=FX+>vC0k>HH{S!Ao0m4_NP1%&}?u7dn~0g)z2VM z5B0kw5cR&Z@RdQ-$kq$0Y>AK`sxIeyXjDR4BOZPU)|_f7LecykP9gKUkxZ0RBY08gNp3@;2(zjaz*DqBvAe@OXn2uc=_Haxrc3Q=!k+N-Q%#LgwHv-8Op%s zlUthemwGOGTafbq-#LA3C-sUYYQ>noRxoJbdFls}bOoSH5|dW`lAQgBZS?`wnsB+- z1cB5oOJ61CX1prw!td;X(;wN)u1n|EO$QpPBe@obqF&?hRAv;g7`N!R=R(uU9GU1KBH=JS9cd9=Y@xpYs=iFnKWTJ9az%gg{zmG z&%24~=uODkdIA`imW3((e?O)}Dn%X_Xwt?I_>UT?0|>miWVX&_YJ~f~(Q50RLbq)R z`nQFG<=5yICbS0UHw~+<9D!0{!5|C-7Lr#y%)R_s z`k95^Jw#t?ZJpm)KU~E;=g?HA%mg8*-W91fx*AKcG*YWPHIC?_zV;j=S>kSeBA5ch zG7*KU^yS#NeHruarlzXfF(Yd8Nr%1|>KPrN;v^ zl-VbPcg`Y~|8zX)3&pFh1@(Kp)WgKkoI$PS1@U} zehT-8cVjfvIBqYE-^g!kTi?aF+*Pe)^RMfd!)%l723o0&_vb!4{AzD5Ldm|CA?8+y zQ!^tSr|fN2i&jYOv5<7|jEm~aOK5V{K*BT)n~+%=+#2vwjp(`PNnA+tMs~GRL80M} zxW4G_03c+%8eK#=JV#Q(25fMtmj-*M4N!By&$A%rPj$t;zAKl z(%AF_pu~+d*TyXWl<4nC!nkkFtaVbp~M+o9Wp6FkG!C~*n3r4+ z<@w^QS?HlbY@%;S3b)zkNfwwpWP{msQ1>=l+>bENy(<}W7N19Nz$fM{DP8BJixD^6^~!uwOI0g$+^?y7&duE+kOj# zSbU$I&8*(2T}uaF2W>5c()<$MU+nR^{ zD)S?kLF5NJ_*0n^VbeU?uTW@AMjb+Y^0CBBvOq9!$n^>%THa-a_b}`4)%`-yNMSAX zr!}W5hV%_}#}j%t<2wGo9hkR|T+lPx_aLTr-%3mSM$ms<2MLMV)pB;*uUFmOzEAHu z?r|&}b(xpilD4Ks*;vuJHpa%&h3*wqnCc{$~{XL6fzg=`qb#s zUp%I7c)__>I%}nuH=#qn*6*`9U?kmd%snx%$n<^|0)bzRd<(V7V*TCQi3JkhT&}rO5)yq@7o=Mw)!RNM*s`<(N(*l|je!n&@ zZd(nEC=dB+u%1J37{SUDrl0Ez) zlGr+uvg$7F5+|O0w5e~?_B+Bcc%8+$9%!@>>E0FqlJZl3#fmFIzZ-^-`VHWl8qcGJ zP96QPE#C@4dMs+)KFikQkutNs7Jhh-`DVQJR?tvw_&!{_=*F+i26cwO1FFc-vDUv; zV#Yzo?-b(7%h;`4Mvinl37`*>(U>giHgVz#8|Y+^3YgK^86Q%FB=1^ujHKencIGWS z{Fu9?iO7@WX3u0vCE#*z6{i&#IYzTt`TfDZ>pws{I)$v$7IRCNRHx7gDJhA2+KgfI*0%cIMQ7lMtN`wEx6`_C9iahQ0E#WcqbLZ9cIVT zTLQ{H(+z_8i^D%ZI)hh)RNZ;D;DQ>OVQ7}k$BxytXtg96*tRe_JLy|mX@7c(9c=X` z33YpbZlng}EO1%Ovz90i@a;gLnN-wKVSXMJpCpg!n`StJ?kJ7$54$FK%h>;(2?)@U z0AQ+ut@mA>SXUS1t8?-nHNYe(xc(rYAYX4HShJ%8lF3)c>FZbTvUgOIY>cGPnIrYI zGr3rru{S~g9ed@%?@MR)E;N7A;p>0aLt>(++Te<~8ID)xZSkYWe}e@MWWL2offb2} zpYKeTQ{LaNr5&EgO&c}^Bw7}JGGsPTaia!8KX61^J5DeKaFnRmsO=)FH_`Xyno6Li z+{ml4Ca?pV+>sB)Vt~p;>*r*GimC|F0&I9DjG1VkPp$en^9p8|A|?BDK!V`g+$+B& z)X?&%cN#xIUC9^uT(ww!OU!FTHh74|xqH2hEo+p6U!i;t9k*ehHJ2c*?d;6aSX6~~ z#M*a?gHY8rl4ue-<5lKRLpk_NM0g};qInjx!?s+?8z)OO%$C_+VEZt9dO9!ZMNwz~ zk}URl@+p?+r#RkOCd$1&U6Wu&9ZLX-??q#XCL>GyfixA&B8*UH&*z3%V|SSDUd4-3Rxo|H(d3 z^}2{3RG=SwbFKC1A~{`PhyQ9_ke&Q6qBOKT7&jz!;`Z{|c633dYhl2NM`Dx%C0cp z5&!s+5Vu+@OjDgTD|C!uD0cH7D3Mh01v7F46wKE*U^k`^ih^p*0!ym9$sNsmRTd)hQrZ}EQfAg7LhjpE#YlFMxe=jg8S z`4U)(x+HR!n$lV6=C0mTiX48EQA!?dJD2F#axYBmrH@ufOPdK;`|+otf1o#|c7@U{ zgC?F#-ZO&ze*%bBy9YHNB-Yw46#ZEX9-0uJgKU(GIKK^X>#KC14ZgD?DJ>z8SKfsT;={!e8O-+!Kf?}RsP0!s4s`y>YCsT~`j zclM8~Y}t8!i>_ZfIQ@aWnAmQDk9pW%j5Y|;`~$h2{|fV5)4K|J$s_$BMbx{W*)qlM zP4ksVzvruu$G(n&|NHYAV0;=53i!~x;z86Sf$F>5zlvrgEdmKaX@usK_Xu=S14}!m!E+vgHs!XLX$^PE$P~R{%z09 zg>m%HhjTF!w|6c+M=z8xR?mx++70;>_jhsk1UQPEQ!eXx)7;)q0!}Evl~q{YJO>uL zbd3N*o`NARDnt9;?~~0vxRw{(;{So_c-^}hzAHLy3Ls!)mkG!*R!shjM1<%F`Q5;Z z!8kp!d|5q9;SpUrW^|P8la&z5$g%`{K255isoMwZ>}rEz84bIKSL3JJ!RCNOHbgF2 z|A~|UB4}0o!TH1H#D5?p0X?t?s@fDMs>ATsti)FD^*SEOX+0HEX?V6|(tNRCs;>8B zgDodDZrTEP5dT)<_WssmY3d(n08l#eNb4pa*`^apWa;E z=4jn-XFSSu-fJ(^1<4l4Vpl)89Q^t!`lZk|iP^VuPvKFsyj&Y? zZJivK_DkrhV4CqE$4b1E#;DNG3x_Q`k`8u5$gJ=mfq0_g5sL@#NMW zvy(N2cG3fpBQLn`u^QC_H%iYMMy@l$r*lZgsO+;W<#PlHdI`z>LWKkV*bymaxJ%Zs z-aO;yS-5?U(O*mQ`zaDF`xm3((ju|+xX`q1;;q;=%SIGb@D~&l{a0{{%bd)0C)(rB39|YFe zLm@ItaH(5#p#X4QA6~WrM{6X(zED>{=3G1o{%gmcrK8bz5T9TVK0PN>(rKh|4RxmY zI1^cwpE%V-)bJ~hKz`_YyrYyZ&(caO!+kIpW+ z8I*IB9DM4OAQlipCFehwtF2u?7fs~K_+zPYZkKq|mb0Jjfr8kOX%u#I+~J~W`8VBI z!}2cOMcR=VLGOC9VX@D>_uoMjDwrWLU$&y_p|ye58G-apm&a|l%XPW*Y5n*w?5;n& z6|mqSF`LZcdZQ^q&GeGuZDHG|f1vtTKvy#)vVgoVzs17O3AdtkTNVSU&ZEH9-Vk3|DC2iBmoQbpwWg25s zJ`q!GJAVm#dVV8L#-RLpsseJ-?0)PJyHU85L*=bt3MGL}z1D=9lA{T;~8oj*>A8_F7IF@^CVg-6Fivr@uEyX^i6QxC<&khpUZuF{!5b= zi^Dv4=*(z{C5H6;1ll?(_yD6XA`AP73s_R8^U_{x#mX)N6^$D*u0+1*wBqJy{&oMP z2HU$FpDv2Ui_)72#U5q)pxB?vVn_^MMDYG+*SgNoEqVo-5;{Q}n`WY#nB4c!;xf&@ zN>sQK06P+K>X&&-=ewcDJK4|i`0!EU*y>q{Mp{LmlP^&3Z-RV`1T0njY%(M@wfG87 zznK1G?}&=-Ad#SP>|dN?pppB^<;-fHPs1Uk2re^5$bO2IaYL~^K)KIEhyqW|bY@+- zurDqoqge`~qPr-w=9|8f0((9;t4O|GGy#D`1&2*6K7=)gY6po3F<_GcD{trHtUdj2 zTFp!Y-8U$!WRqaInrY6UqAf^yk<38_L|bP=-Wg28?u6*;c-)?n)P6n`DYHy#-415zZ#s2(p$>^$LFdEJ0T=CD<7g*qeI$x^Ox2%?An zSc(cfN+1QpfALxqPhSS3fz(sV0Y!E-(zZBxeZ0R|p_r)@W$1))Mt%>M2L)pw2~(#y zlc^W*@`!w+I28gjZEc*Q8AzMzXD2?jj0;QE-R6M0ivZGL9jt&QpaR_)spSLkZ>1U_ z6xJP5b?rtLx!nmNJSNWp8`iTU*JTrNIF9cxu=eN-dw;B&rNW{!*IW`UZT^&{GS2^f zL@kkooM@u=%?Z23>WDQB^(Gxv>A(7kVGsb62B_{D2@E84G*=zc0rN}*I5YVd&h+n|L(znpd8 z#YCc1)H%&Zu1~FA8QUMAD;6C6jxNUAt$tk2 zl|Kl+;qOzbjYn@cQDSV@Oe&e8Ryzz{_aCK@TXsrOCCX2!_Ju=4v`