diff --git a/404.html b/404.html index 0dd90769e..cbd1dbc18 100644 --- a/404.html +++ b/404.html @@ -2,18 +2,18 @@ - + Page Not Found | Routr Docs - - - + + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/css/styles.9c6cd2dc.css b/assets/css/styles.9c6cd2dc.css deleted file mode 100644 index 3c6a63a04..000000000 --- a/assets/css/styles.9c6cd2dc.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#0a3622;--ifm-color-primary-dark:#0a3622;--ifm-color-primary-darker:#0a3622;--ifm-color-primary-darkest:#0a3622;--ifm-color-primary-light:#0a3622;--ifm-color-primary-lighter:#0a3622;--ifm-color-primary-lightest:#0a3622;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-color-secondary:#5fcfce;--ifm-color-white:#fff;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}.footer--dark,.navbar a{--ifm-footer-link-hover-color:var(--ifm-color-secondary)}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--link,p a{color:var(--ifm-link-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-background-color:#333;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-white);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#fff;--ifm-color-primary-dark:#fff;--ifm-color-primary-darker:#fff;--ifm-color-primary-darkest:#fff;--ifm-color-primary-light:#fff;--ifm-color-primary-lighter:#fff;--ifm-color-primary-lightest:#fff;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-color-secondary:#5fcfce}.navbar,.navbar-sidebar__back,.navbar-sidebar__brand{background-color:#0d3231}.navbar,.navbar a{color:var(--ifm-color-white)}.navbar a:hover,p a:hover{color:var(--ifm-color-secondary)}.navbar ul li a,.navbar ul li a:hover{color:#000}p a{text-decoration:underline}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;border:0;cursor:pointer}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}@supports selector(:has(*)){.navbarSearchContainer_Bca1:not(:has(>*)){display:none}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.d0b421c9.css b/assets/css/styles.d0b421c9.css new file mode 100644 index 000000000..48d55310a --- /dev/null +++ b/assets/css/styles.d0b421c9.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#0a3622;--ifm-color-primary-dark:#0a3622;--ifm-color-primary-darker:#0a3622;--ifm-color-primary-darkest:#0a3622;--ifm-color-primary-light:#0a3622;--ifm-color-primary-lighter:#0a3622;--ifm-color-primary-lightest:#0a3622;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--ifm-color-secondary:#5fcfce;--ifm-color-white:#fff;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}.footer--dark,.navbar a{--ifm-footer-link-hover-color:var(--ifm-color-secondary)}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--link,p a{color:var(--ifm-link-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-background-color:#333;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-white);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.302);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#fff;--ifm-color-primary-dark:#fff;--ifm-color-primary-darker:#fff;--ifm-color-primary-darkest:#fff;--ifm-color-primary-light:#fff;--ifm-color-primary-lighter:#fff;--ifm-color-primary-lightest:#fff;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-color-secondary:#5fcfce}.navbar,.navbar-sidebar__back,.navbar-sidebar__brand{background-color:#0d3231}.navbar,.navbar a{color:var(--ifm-color-white)}.navbar a:hover,p a:hover{color:var(--ifm-color-secondary)}.navbar ul li a,.navbar ul li a:hover{color:#000}p a{text-decoration:underline}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/images/architecture_v2-8861306d8626ddea399b72e2aa55619e.png b/assets/images/architecture_v2-8861306d8626ddea399b72e2aa55619e.png new file mode 100644 index 000000000..38677403a Binary files /dev/null and b/assets/images/architecture_v2-8861306d8626ddea399b72e2aa55619e.png differ diff --git a/assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png b/assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png deleted file mode 100644 index 38d37811c..000000000 Binary files a/assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png and /dev/null differ diff --git a/assets/js/017ddd06.bd7758e0.js b/assets/js/017ddd06.6edcb824.js similarity index 98% rename from assets/js/017ddd06.bd7758e0.js rename to assets/js/017ddd06.6edcb824.js index 519d9bdb8..c8497e314 100644 --- a/assets/js/017ddd06.bd7758e0.js +++ b/assets/js/017ddd06.6edcb824.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9845],{6740:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var r=n(4848),t=n(8453);const i={},d="Users",c={id:"configuration/users",title:"Users",description:"Users exist in Routr to perform administrative actions on a Routr instance.",source:"@site/versioned_docs/version-1.x.x/configuration/users.md",sourceDirName:"configuration",slug:"/configuration/users",permalink:"/docs/1.x.x/configuration/users",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/users.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"},next:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"}},a={},o=[{value:"User Resource",id:"user-resource",level:2},{value:"Example",id:"example",level:2},{value:"Changing the password? (Redis)",id:"changing-the-password-redis",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"users",children:"Users"}),"\n",(0,r.jsxs)(s.p,{children:["Users exist in Routr to perform administrative actions on a Routr instance.\nThe Users configuration can be provided using the file ",(0,r.jsx)(s.code,{children:"config/users.yml"})," located at the root of your Routr installation."]}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"user-resource",children:"User Resource"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apiVersion"}),(0,r.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"kind"}),(0,r.jsx)(s.td,{children:"Defines the type of resource"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"metadata.name"}),(0,r.jsx)(s.td,{children:"Friendly name for the User device"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.username"}),(0,r.jsx)(s.td,{children:"User's credential username"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.secret"}),(0,r.jsx)(s.td,{children:"User's credential secret"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: User\n metadata:\n name: Administrator\n spec:\n credentials:\n username: admin\n secret: changeit\n"})}),"\n",(0,r.jsx)(s.h2,{id:"changing-the-password-redis",children:"Changing the password? (Redis)"}),"\n",(0,r.jsxs)(s.p,{children:["First, run the command ",(0,r.jsx)(s.code,{children:"redis-cli smembers users"})," to obtain the reference to the user. Here is an example:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli smembers users\n1) "5aa69ead8fd6861d92385bac"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Then, retrieve the document for reference running ",(0,r.jsx)(s.code,{children:"redis-cli get {REF}"}),". For example"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli get 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"oldpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Finally, search and change the old password and update your document using ",(0,r.jsx)(s.code,{children:"redis-cli set {REF} {DOCUMENT}"}),". Like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli set 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"newpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsxs)(s.p,{children:["A new token is issued after your next login with ",(0,r.jsx)(s.code,{children:"rctl"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>c});var r=n(6540);const t={},i=r.createContext(t);function d(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9845],{3731:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var r=n(4848),t=n(8453);const i={},d="Users",c={id:"configuration/users",title:"Users",description:"Users exist in Routr to perform administrative actions on a Routr instance.",source:"@site/versioned_docs/version-1.x.x/configuration/users.md",sourceDirName:"configuration",slug:"/configuration/users",permalink:"/docs/1.x.x/configuration/users",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/users.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"},next:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"}},a={},o=[{value:"User Resource",id:"user-resource",level:2},{value:"Example",id:"example",level:2},{value:"Changing the password? (Redis)",id:"changing-the-password-redis",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"users",children:"Users"}),"\n",(0,r.jsxs)(s.p,{children:["Users exist in Routr to perform administrative actions on a Routr instance.\nThe Users configuration can be provided using the file ",(0,r.jsx)(s.code,{children:"config/users.yml"})," located at the root of your Routr installation."]}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"user-resource",children:"User Resource"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apiVersion"}),(0,r.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"kind"}),(0,r.jsx)(s.td,{children:"Defines the type of resource"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"metadata.name"}),(0,r.jsx)(s.td,{children:"Friendly name for the User device"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.username"}),(0,r.jsx)(s.td,{children:"User's credential username"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"spec.credentials.secret"}),(0,r.jsx)(s.td,{children:"User's credential secret"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: User\n metadata:\n name: Administrator\n spec:\n credentials:\n username: admin\n secret: changeit\n"})}),"\n",(0,r.jsx)(s.h2,{id:"changing-the-password-redis",children:"Changing the password? (Redis)"}),"\n",(0,r.jsxs)(s.p,{children:["First, run the command ",(0,r.jsx)(s.code,{children:"redis-cli smembers users"})," to obtain the reference to the user. Here is an example:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli smembers users\n1) "5aa69ead8fd6861d92385bac"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Then, retrieve the document for reference running ",(0,r.jsx)(s.code,{children:"redis-cli get {REF}"}),". For example"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli get 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"oldpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Finally, search and change the old password and update your document using ",(0,r.jsx)(s.code,{children:"redis-cli set {REF} {DOCUMENT}"}),". Like this:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:'$ redis-cli set 5aa69ead8fd6861d92385bac\n"{\\"apiVersion\\":\\"v1beta1\\",\\"kind\\":\\"User\\",\\"metadata\\":{\\"name\\":\\"Ctl\\",\\"ref\\":\\"5aa69ead8fd6861d92385bac\\"},\\"spec\\":{\\"credentials\\":{\\"username\\":\\"admin\\",\\"secret\\":\\"newpass\\"}}}"\n'})}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsxs)(s.p,{children:["A new token is issued after your next login with ",(0,r.jsx)(s.code,{children:"rctl"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>c});var r=n(6540);const t={},i=r.createContext(t);function d(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/02617853.735c7221.js b/assets/js/02617853.735c7221.js new file mode 100644 index 000000000..cf9a60774 --- /dev/null +++ b/assets/js/02617853.735c7221.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3191],{6163:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(4848),t=n(8453);const o={},c="Message Dispatcher",i={id:"development/components/dispatcher",title:"Message Dispatcher",description:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.",source:"@site/docs/development/components/dispatcher.md",sourceDirName:"development/components",slug:"/development/components/dispatcher",permalink:"/docs/2.11.5/development/components/dispatcher",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/dispatcher.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"EdgePort",permalink:"/docs/2.11.5/development/components/edgeport"},next:{title:"Location Service",permalink:"/docs/2.11.5/development/components/location"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Dispatcher with Docker",id:"launching-the-dispatcher-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware."}),"\n",(0,r.jsx)(s.p,{children:"The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor."}),"\n",(0,r.jsx)(s.p,{children:"The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502gRPC request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502findProcessor() & forwardMessage()\u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502 Processed Message \u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502gRPC response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(s.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(s.p,{children:"To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,r.jsx)(s.p,{children:"You can configure the Dispatcher using a YAML or JSON file that has the following structure:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Dispatcher"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.bindAddr"})}),(0,r.jsx)(s.td,{children:"Ipv4 interface to accept requests on"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors"})}),(0,r.jsx)(s.td,{children:"List of Processors"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].matchFunc"})}),(0,r.jsx)(s.td,{children:"Matching function"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].methods"})}),(0,r.jsx)(s.td,{children:"List of SIP Methods supported by the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares"})}),(0,r.jsx)(s.td,{children:"List of Middlewares"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].postProcessor"})}),(0,r.jsx)(s.td,{children:"Whether to process the SIP Message after the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here is an example of a configuration file:"}),"\n",(0,r.jsxs)(s.p,{children:["Filename: ",(0,r.jsx)(s.code,{children:"dispatcher.yaml"})," or ",(0,r.jsx)(s.code,{children:"dispatcher.json"})]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n"})}),"\n",(0,r.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,r.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,r.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,r.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,r.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,r.jsx)(s.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Link to the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(s.h2,{id:"launching-the-dispatcher-with-docker",children:"Launching the Dispatcher with Docker"}),"\n",(0,r.jsxs)(s.p,{children:["The Message Dispatcher is available as a Docker image from ",(0,r.jsx)(s.a,{href:"https://hub.docker.com/r/fonoster/routr-dispatcher",children:"Docker Hub"}),". To launch the Dispatcher with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port ",(0,r.jsx)(s.code,{children:"51901"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,r.jsx)(s.code,{children:"51901"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(s.p,{children:["One easy way to interact with the Dispatcher for testing and development is to use ",(0,r.jsx)(s.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the Dispatcher."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function l(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>i});var r=n(6540);const t={},o=r.createContext(t);function c(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/02617853.a06ae3cb.js b/assets/js/02617853.a06ae3cb.js deleted file mode 100644 index f87844db5..000000000 --- a/assets/js/02617853.a06ae3cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3191],{2744:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(4848),t=n(8453);const o={},c="Message Dispatcher",i={id:"development/components/dispatcher",title:"Message Dispatcher",description:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.",source:"@site/docs/development/components/dispatcher.md",sourceDirName:"development/components",slug:"/development/components/dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/dispatcher.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"},next:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Dispatcher with Docker",id:"launching-the-dispatcher-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware."}),"\n",(0,r.jsx)(s.p,{children:"The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor."}),"\n",(0,r.jsx)(s.p,{children:"The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502gRPC request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502findProcessor() & forwardMessage()\u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502 Processed Message \u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502gRPC response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(s.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(s.p,{children:"To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,r.jsx)(s.p,{children:"You can configure the Dispatcher using a YAML or JSON file that has the following structure:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Dispatcher"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.bindAddr"})}),(0,r.jsx)(s.td,{children:"Ipv4 interface to accept requests on"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors"})}),(0,r.jsx)(s.td,{children:"List of Processors"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].matchFunc"})}),(0,r.jsx)(s.td,{children:"Matching function"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].methods"})}),(0,r.jsx)(s.td,{children:"List of SIP Methods supported by the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares"})}),(0,r.jsx)(s.td,{children:"List of Middlewares"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].postProcessor"})}),(0,r.jsx)(s.td,{children:"Whether to process the SIP Message after the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here is an example of a configuration file:"}),"\n",(0,r.jsxs)(s.p,{children:["Filename: ",(0,r.jsx)(s.code,{children:"dispatcher.yaml"})," or ",(0,r.jsx)(s.code,{children:"dispatcher.json"})]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n"})}),"\n",(0,r.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,r.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,r.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,r.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,r.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,r.jsx)(s.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Link to the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(s.h2,{id:"launching-the-dispatcher-with-docker",children:"Launching the Dispatcher with Docker"}),"\n",(0,r.jsxs)(s.p,{children:["The Message Dispatcher is available as a Docker image from ",(0,r.jsx)(s.a,{href:"https://hub.docker.com/r/fonoster/routr-dispatcher",children:"Docker Hub"}),". To launch the Dispatcher with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port ",(0,r.jsx)(s.code,{children:"51901"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,r.jsx)(s.code,{children:"51901"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(s.p,{children:["One easy way to interact with the Dispatcher for testing and development is to use ",(0,r.jsx)(s.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the Dispatcher."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function l(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>i});var r=n(6540);const t={},o=r.createContext(t);function c(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0457fa99.50b2d5d1.js b/assets/js/0457fa99.50b2d5d1.js new file mode 100644 index 000000000..3f2c469a4 --- /dev/null +++ b/assets/js/0457fa99.50b2d5d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1238],{4718:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(4848),r=o(8453);const s={},i="Deploy with Docker",c={id:"overview/deploy-with-docker",title:"Deploy with Docker",description:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.",source:"@site/versioned_docs/version-2.0.0/overview/deploy-with-docker.md",sourceDirName:"overview",slug:"/overview/deploy-with-docker",permalink:"/docs/2.0.0/overview/deploy-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/overview/deploy-with-docker.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"},next:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"}},a={},l=[{value:"Deploying Routr",id:"deploying-routr",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-with-docker",children:"Deploy with Docker"}),"\n",(0,t.jsx)(n.p,{children:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker."}),"\n",(0,t.jsxs)(n.p,{children:["You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"here."})]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"deploying-routr",children:"Deploying Routr"}),"\n",(0,t.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,t.jsx)(n.p,{children:"Filename: compose.yaml"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n volumes:\n - shared:/var/lib/postgresql/data\n\nvolumes:\n shared:\n'})}),"\n",(0,t.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,t.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,t.jsx)(n.p,{children:"You should see something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,t.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,t.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is an example of creating an SIP Domain:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For additional examples, refer to the command-line ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06896101.5deb77fe.js b/assets/js/06896101.5deb77fe.js deleted file mode 100644 index e12606535..000000000 --- a/assets/js/06896101.5deb77fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3738],{2007:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(4848),r=o(8453);const s={},i="Deploy with Docker",c={id:"overview/deploy-with-docker",title:"Deploy with Docker",description:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.",source:"@site/docs/overview/deploy-with-docker.md",sourceDirName:"overview",slug:"/overview/deploy-with-docker",permalink:"/docs/2.0.0/overview/deploy-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/deploy-with-docker.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"},next:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"}},a={},l=[{value:"Deploying Routr",id:"deploying-routr",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-with-docker",children:"Deploy with Docker"}),"\n",(0,t.jsx)(n.p,{children:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker."}),"\n",(0,t.jsxs)(n.p,{children:["You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"here."})]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"deploying-routr",children:"Deploying Routr"}),"\n",(0,t.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,t.jsx)(n.p,{children:"Filename: compose.yaml"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n volumes:\n - shared:/var/lib/postgresql/data\n\nvolumes:\n shared:\n'})}),"\n",(0,t.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,t.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,t.jsx)(n.p,{children:"You should see something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,t.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,t.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is an example of creating an SIP Domain:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For additional examples, refer to the command-line ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/06896101.ffea88de.js b/assets/js/06896101.ffea88de.js new file mode 100644 index 000000000..1f63bfa5f --- /dev/null +++ b/assets/js/06896101.ffea88de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3738],{9588:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var t=o(4848),r=o(8453);const s={},i="Deploy with Docker",c={id:"overview/deploy-with-docker",title:"Deploy with Docker",description:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.",source:"@site/docs/overview/deploy-with-docker.md",sourceDirName:"overview",slug:"/overview/deploy-with-docker",permalink:"/docs/2.11.5/overview/deploy-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/deploy-with-docker.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.11.5/overview/concepts"},next:{title:"Introduction",permalink:"/docs/2.11.5/development/introduction"}},a={},l=[{value:"Deploying Routr",id:"deploying-routr",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"deploy-with-docker",children:"Deploy with Docker"}),"\n",(0,t.jsx)(n.p,{children:"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker."}),"\n",(0,t.jsxs)(n.p,{children:["You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"here."})]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"deploying-routr",children:"Deploying Routr"}),"\n",(0,t.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,t.jsx)(n.p,{children:"Filename: compose.yaml"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n volumes:\n - shared:/var/lib/postgresql/data\n\nvolumes:\n shared:\n'})}),"\n",(0,t.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,t.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,t.jsx)(n.p,{children:"You should see something like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,t.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,t.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,t.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is an example of creating an SIP Domain:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For additional examples, refer to the command-line ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/093b4e4f.b05d61ed.js b/assets/js/093b4e4f.6900c6ef.js similarity index 98% rename from assets/js/093b4e4f.b05d61ed.js rename to assets/js/093b4e4f.6900c6ef.js index 3b7d2030d..fb48bde40 100644 --- a/assets/js/093b4e4f.b05d61ed.js +++ b/assets/js/093b4e4f.6900c6ef.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4714],{2357:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=t(4848),s=t(8453);const r={},i="WebUI",a={id:"administration/webconsole",title:"WebUI",description:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.",source:"@site/versioned_docs/version-1.x.x/administration/webconsole.md",sourceDirName:"administration",slug:"/administration/webconsole",permalink:"/docs/1.x.x/administration/webconsole",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/webconsole.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"},next:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"}},l={},c=[{value:"How to install the Web Console?",id:"how-to-install-the-web-console",level:2},{value:"Launching the Web Console",id:"launching-the-web-console",level:2},{value:"Does the WC affect the server's performance?",id:"does-the-wc-affect-the-servers-performance",level:2}];function h(e){const o={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"webui",children:"WebUI"}),"\n",(0,n.jsx)(o.p,{children:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"WebUI Animation",src:t(6462).A+"",width:"2880",height:"1586"})}),"\n",(0,n.jsx)(o.h2,{id:"how-to-install-the-web-console",children:"How to install the Web Console?"}),"\n",(0,n.jsx)(o.p,{children:"The WC ships with the Command-Line tool. You do not need to install it separately."}),"\n",(0,n.jsx)(o.h2,{id:"launching-the-web-console",children:"Launching the Web Console"}),"\n",(0,n.jsx)(o.p,{children:"To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"rctl proxy\n"})}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"The WC re-uses the credentials of your Command-Line Tool"}),"\n"]}),"\n",(0,n.jsx)(o.h2,{id:"does-the-wc-affect-the-servers-performance",children:"Does the WC affect the server's performance?"}),"\n",(0,n.jsx)(o.p,{children:"No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance."})]})}function d(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},6462:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/routr_ui_animation-08da33f511e04a6bd6349b610d7098ab.gif"},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>a});var n=t(6540);const s={},r=n.createContext(s);function i(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4714],{2122:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=t(4848),s=t(8453);const r={},i="WebUI",a={id:"administration/webconsole",title:"WebUI",description:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.",source:"@site/versioned_docs/version-1.x.x/administration/webconsole.md",sourceDirName:"administration",slug:"/administration/webconsole",permalink:"/docs/1.x.x/administration/webconsole",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/webconsole.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"},next:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"}},l={},c=[{value:"How to install the Web Console?",id:"how-to-install-the-web-console",level:2},{value:"Launching the Web Console",id:"launching-the-web-console",level:2},{value:"Does the WC affect the server's performance?",id:"does-the-wc-affect-the-servers-performance",level:2}];function h(e){const o={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"webui",children:"WebUI"}),"\n",(0,n.jsx)(o.p,{children:"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"WebUI Animation",src:t(6462).A+"",width:"2880",height:"1586"})}),"\n",(0,n.jsx)(o.h2,{id:"how-to-install-the-web-console",children:"How to install the Web Console?"}),"\n",(0,n.jsx)(o.p,{children:"The WC ships with the Command-Line tool. You do not need to install it separately."}),"\n",(0,n.jsx)(o.h2,{id:"launching-the-web-console",children:"Launching the Web Console"}),"\n",(0,n.jsx)(o.p,{children:"To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"rctl proxy\n"})}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"The WC re-uses the credentials of your Command-Line Tool"}),"\n"]}),"\n",(0,n.jsx)(o.h2,{id:"does-the-wc-affect-the-servers-performance",children:"Does the WC affect the server's performance?"}),"\n",(0,n.jsx)(o.p,{children:"No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance."})]})}function d(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},6462:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/routr_ui_animation-08da33f511e04a6bd6349b610d7098ab.gif"},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>a});var n=t(6540);const s={},r=n.createContext(s);function i(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09b719bb.105201e4.js b/assets/js/09b719bb.95079ca8.js similarity index 99% rename from assets/js/09b719bb.105201e4.js rename to assets/js/09b719bb.95079ca8.js index bd97081b4..b6ea65445 100644 --- a/assets/js/09b719bb.105201e4.js +++ b/assets/js/09b719bb.95079ca8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6541],{5722:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=s(4848),t=s(8453);const r={},o="Routr as Asterisk frontend",a={id:"guides/routr-as-asterisk-frontend",title:"Routr as Asterisk frontend",description:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:",source:"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",sourceDirName:"guides",slug:"/guides/routr-as-asterisk-frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"},next:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"}},c={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Configuration Overview",id:"configuration-overview",level:2},{value:"Configuring Asterisk",id:"configuring-asterisk",level:2},{value:"Calling Asterisk from John's device",id:"calling-asterisk-from-johns-device",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"routr-as-asterisk-frontend",children:"Routr as Asterisk frontend"}),"\n",(0,i.jsx)(n.p,{children:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:"}),"\n",(0,i.jsx)("img",{src:"/img/peering_ilustration.png",width:"600",vspace:"50"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Content"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuration-overview",children:"Configuration Overview"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuring-asterisk",children:"Configuring Asterisk"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#calling-asterisk-from-johns-device",children:"Calling Asterisk from John\u2019s device"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#whats-next",children:"What\u2019s Next?"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"You have a SIP phone connected to the same LAN as Routr and Asterisk"}),"\n",(0,i.jsx)(n.li,{children:"If using a hardware phone, this can reach Asterisk and Routr and the other way around"}),"\n",(0,i.jsx)(n.li,{children:"You have a fresh installation of Routr and Asterisk"}),"\n"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Before starting this guide make sure to have a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"})," server."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-overview",children:"Configuration Overview"}),"\n",(0,i.jsxs)(n.p,{children:["With a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"}),", you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario."]}),"\n",(0,i.jsxs)(n.p,{children:["The first file we need to examine and change is ",(0,i.jsx)(n.code,{children:"config/peers.yml"}),'. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field ',(0,i.jsx)(n.code,{children:"spec.device"})," and change it to match the Agents domain(",(0,i.jsx)(n.code,{children:"sip.local"}),"). The file now looks similar to this:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"config/peers.yml"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk PBX\n spec:\n device: 'sip.local'\n credentials:\n username: ast\n secret: '1234'\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Head to the console and run the command ",(0,i.jsx)(n.code,{children:"rctl -- get peers"})," to confirm that the Peer exist. The result should be as follows:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_peers_cmd_output.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we focus our attention on ",(0,i.jsx)(n.code,{children:"domains.yml"})," and ",(0,i.jsx)(n.code,{children:"agents.yml"}),". With a fresh installation, we don't need to make any changes to these files. However, you could run the commands ",(0,i.jsx)(n.code,{children:"get domains"})," and ",(0,i.jsx)(n.code,{children:"get agents"})," to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_domains_and_agents.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Use the information in ",(0,i.jsx)(n.code,{children:"agents.yml"})," to configure your SIP phone. The relevant information is found in ",(0,i.jsx)(n.code,{children:"spec.credentials"}),". Mine looks like this:"]}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_general.png",width:"500"}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_advanced.png",width:"500"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Make the adjustments based on your prefer SIP phone."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can verify that your device registered correctly with ",(0,i.jsx)(n.strong,{children:"Routr"})," by running the ",(0,i.jsx)(n.code,{children:"locate"})," command:"]}),"\n",(0,i.jsx)("img",{src:"/img/locate_john.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"configuring-asterisk",children:"Configuring Asterisk"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Using PJSIP"})}),"\n",(0,i.jsxs)(n.p,{children:["Backup your ",(0,i.jsx)(n.code,{children:"pjsip.conf"})," and ",(0,i.jsx)(n.code,{children:"pjsip_wizard.conf"}),". Update your pjsip.conf with the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[transport-tcp]\ntype=transport\nprotocol=tcp\nbind=0.0.0.0:6060\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then, in your pjsip_wizard.conf:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[routr]\ntype = wizard\nsends_auth = yes\nsends_registrations = yes\nremote_hosts = 192.168.1.2\noutbound_auth/username = ast\noutbound_auth/password = 1234\nregistration/retry_interval = 10\nregistration/expiration = 900\nendpoint/allow = ulaw\nendpoint/allow = alaw\nendpoint/allow = opus\nendpoint/context = default\ntransport = transport-tcp\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:'Using the "old" Chan SIP'})}),"\n",(0,i.jsxs)(n.p,{children:["First backup your ",(0,i.jsx)(n.code,{children:"sip.conf"}),". Then, replace your configuration and edit the file to reflect the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[general]\nudpbindaddr=0.0.0.0:6060\ncontext=default\nregister => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Configuring the Dialplan"})}),"\n",(0,i.jsx)(n.p,{children:"We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[default]\nexten => 1001,1,Answer\nexten => 1001,n,Playback(tt-monkeys)\nexten => 1001,n,Hangup\n"})}),"\n",(0,i.jsx)(n.p,{children:"Restart your Asterisk and check the location service. A new device now appears."}),"\n",(0,i.jsx)("img",{src:"/img/locate_john_and_ast.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"calling-asterisk-from-johns-device",children:"Calling Asterisk from John's device"}),"\n",(0,i.jsxs)(n.p,{children:["We can now call ",(0,i.jsx)(n.code,{children:"ast@sip.local"})," and if everything went well listen to a group of really annoying monkeys :)."]}),"\n",(0,i.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,i.jsxs)(n.p,{children:["You can check out the ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"wiki"})," to see more examples. If you have any questions start an issue or contact us via:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Twitter: ",(0,i.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,i.jsxs)(n.li,{children:["Email: ",(0,i.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});var i=s(6540);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6541],{3389:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=s(4848),t=s(8453);const r={},o="Routr as Asterisk frontend",a={id:"guides/routr-as-asterisk-frontend",title:"Routr as Asterisk frontend",description:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:",source:"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",sourceDirName:"guides",slug:"/guides/routr-as-asterisk-frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Basic Setup",permalink:"/docs/1.x.x/guides/basic-setup"},next:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"}},c={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Configuration Overview",id:"configuration-overview",level:2},{value:"Configuring Asterisk",id:"configuring-asterisk",level:2},{value:"Calling Asterisk from John's device",id:"calling-asterisk-from-johns-device",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"routr-as-asterisk-frontend",children:"Routr as Asterisk frontend"}),"\n",(0,i.jsx)(n.p,{children:"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:"}),"\n",(0,i.jsx)("img",{src:"/img/peering_ilustration.png",width:"600",vspace:"50"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Content"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuration-overview",children:"Configuration Overview"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#configuring-asterisk",children:"Configuring Asterisk"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#calling-asterisk-from-johns-device",children:"Calling Asterisk from John\u2019s device"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#whats-next",children:"What\u2019s Next?"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"You have a SIP phone connected to the same LAN as Routr and Asterisk"}),"\n",(0,i.jsx)(n.li,{children:"If using a hardware phone, this can reach Asterisk and Routr and the other way around"}),"\n",(0,i.jsx)(n.li,{children:"You have a fresh installation of Routr and Asterisk"}),"\n"]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsxs)(n.p,{children:["Before starting this guide make sure to have a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"})," server."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-overview",children:"Configuration Overview"}),"\n",(0,i.jsxs)(n.p,{children:["With a fresh installation of ",(0,i.jsx)(n.strong,{children:"Routr"}),", you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario."]}),"\n",(0,i.jsxs)(n.p,{children:["The first file we need to examine and change is ",(0,i.jsx)(n.code,{children:"config/peers.yml"}),'. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field ',(0,i.jsx)(n.code,{children:"spec.device"})," and change it to match the Agents domain(",(0,i.jsx)(n.code,{children:"sip.local"}),"). The file now looks similar to this:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"config/peers.yml"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk PBX\n spec:\n device: 'sip.local'\n credentials:\n username: ast\n secret: '1234'\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Head to the console and run the command ",(0,i.jsx)(n.code,{children:"rctl -- get peers"})," to confirm that the Peer exist. The result should be as follows:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_peers_cmd_output.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we focus our attention on ",(0,i.jsx)(n.code,{children:"domains.yml"})," and ",(0,i.jsx)(n.code,{children:"agents.yml"}),". With a fresh installation, we don't need to make any changes to these files. However, you could run the commands ",(0,i.jsx)(n.code,{children:"get domains"})," and ",(0,i.jsx)(n.code,{children:"get agents"})," to ensure that both, the Agent and the Domain, exist on the server. Your output should look similar to:"]}),"\n",(0,i.jsx)("img",{src:"/img/get_domains_and_agents.png",width:"600"}),"\n",(0,i.jsxs)(n.p,{children:["Use the information in ",(0,i.jsx)(n.code,{children:"agents.yml"})," to configure your SIP phone. The relevant information is found in ",(0,i.jsx)(n.code,{children:"spec.credentials"}),". Mine looks like this:"]}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_general.png",width:"500"}),"\n",(0,i.jsx)("img",{src:"/img/john_telephone_setup_advanced.png",width:"500"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Make the adjustments based on your prefer SIP phone."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You can verify that your device registered correctly with ",(0,i.jsx)(n.strong,{children:"Routr"})," by running the ",(0,i.jsx)(n.code,{children:"locate"})," command:"]}),"\n",(0,i.jsx)("img",{src:"/img/locate_john.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"configuring-asterisk",children:"Configuring Asterisk"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Using PJSIP"})}),"\n",(0,i.jsxs)(n.p,{children:["Backup your ",(0,i.jsx)(n.code,{children:"pjsip.conf"})," and ",(0,i.jsx)(n.code,{children:"pjsip_wizard.conf"}),". Update your pjsip.conf with the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[transport-tcp]\ntype=transport\nprotocol=tcp\nbind=0.0.0.0:6060\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then, in your pjsip_wizard.conf:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[routr]\ntype = wizard\nsends_auth = yes\nsends_registrations = yes\nremote_hosts = 192.168.1.2\noutbound_auth/username = ast\noutbound_auth/password = 1234\nregistration/retry_interval = 10\nregistration/expiration = 900\nendpoint/allow = ulaw\nendpoint/allow = alaw\nendpoint/allow = opus\nendpoint/context = default\ntransport = transport-tcp\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:'Using the "old" Chan SIP'})}),"\n",(0,i.jsxs)(n.p,{children:["First backup your ",(0,i.jsx)(n.code,{children:"sip.conf"}),". Then, replace your configuration and edit the file to reflect the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[general]\nudpbindaddr=0.0.0.0:6060\ncontext=default\nregister => ast:1234@192.168.1.2:5060/1001 ; This information must match the credentials in `config/peers.yml`\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Configuring the Dialplan"})}),"\n",(0,i.jsx)(n.p,{children:"We are going to use a very simple dialplan to play a sound file. Again, make a backup of your configuration and replace its content with this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[default]\nexten => 1001,1,Answer\nexten => 1001,n,Playback(tt-monkeys)\nexten => 1001,n,Hangup\n"})}),"\n",(0,i.jsx)(n.p,{children:"Restart your Asterisk and check the location service. A new device now appears."}),"\n",(0,i.jsx)("img",{src:"/img/locate_john_and_ast.png",width:"600"}),"\n",(0,i.jsx)(n.h2,{id:"calling-asterisk-from-johns-device",children:"Calling Asterisk from John's device"}),"\n",(0,i.jsxs)(n.p,{children:["We can now call ",(0,i.jsx)(n.code,{children:"ast@sip.local"})," and if everything went well listen to a group of really annoying monkeys :)."]}),"\n",(0,i.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,i.jsxs)(n.p,{children:["You can check out the ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"wiki"})," to see more examples. If you have any questions start an issue or contact us via:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Twitter: ",(0,i.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,i.jsxs)(n.li,{children:["Email: ",(0,i.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>a});var i=s(6540);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09d90b28.e87afdfe.js b/assets/js/09d90b28.e87afdfe.js new file mode 100644 index 000000000..6c6c6e00d --- /dev/null +++ b/assets/js/09d90b28.e87afdfe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8563],{1151:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>a,frontMatter:()=>i,metadata:()=>d,toc:()=>h});var t=s(4848),n=s(8453);const i={},o="Registry Service",d={id:"development/components/registry",title:"Registry Service",description:"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.",source:"@site/versioned_docs/version-2.0.0/development/components/registry.md",sourceDirName:"development/components",slug:"/development/components/registry",permalink:"/docs/2.0.0/development/components/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/registry.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"},next:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"}},c={},h=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Registry Service with Docker",id:"launching-the-registry-service-with-docker",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"registry-service",children:"Registry Service"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the ",(0,t.jsx)(r.code,{children:"spec.sendRegister"})," field set to true. The Registry service relies on the Requester service to send requests to the EdgePort."]}),"\n",(0,t.jsx)(r.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(r.p,{children:"To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"requesterAddr"})}),(0,t.jsx)(r.td,{children:"Address of service to send requests"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"apiAddr"})}),(0,t.jsx)(r.td,{children:"Address of API service"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registerInterval"})}),(0,t.jsxs)(r.td,{children:["Interval for sending registration requests (Defaults to ",(0,t.jsx)(r.code,{children:"60s"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache"})}),(0,t.jsx)(r.td,{children:"Cache configuration"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.provider"})}),(0,t.jsxs)(r.td,{children:["Accepts either ",(0,t.jsx)(r.code,{children:"memory"})," or ",(0,t.jsx)(r.code,{children:"redis"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.parameters"})}),(0,t.jsx)(r.td,{children:"Comma-separated key-value pairs"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"methods"})}),(0,t.jsx)(r.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts"})}),(0,t.jsx)(r.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.address"})}),(0,t.jsx)(r.td,{children:"Address of EdgePort"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.region"})}),(0,t.jsx)(r.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,t.jsx)(r.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"username"})}),(0,t.jsx)(r.td,{children:"Username (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"password"})}),(0,t.jsx)(r.td,{children:"Password (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"host"})}),(0,t.jsxs)(r.td,{children:["Redis host (Defaults to ",(0,t.jsx)(r.code,{children:"localhost"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"port"})}),(0,t.jsxs)(r.td,{children:["Redis port (Defaults to ",(0,t.jsx)(r.code,{children:"6379"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"secure"})}),(0,t.jsx)(r.td,{children:"Use secure connection for Redis"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"Here is an example of a configuration file:"}),"\n",(0,t.jsxs)(r.p,{children:["Filename: ",(0,t.jsx)(r.code,{children:"registry.yaml"})," or ",(0,t.jsx)(r.code,{children:"registry.json"})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(r.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(r.p,{children:"The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["Link to the ",(0,t.jsx)(r.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,t.jsx)(r.h2,{id:"launching-the-registry-service-with-docker",children:"Launching the Registry Service with Docker"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry Service is available as a Docker image from ",(0,t.jsx)(r.a,{href:"https://hub.docker.com/r/fonoster/routr-registry",children:"Docker Hub"}),". To launch the Registry Service with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address ",(0,t.jsx)(r.code,{children:"requester:51909"})," and the API service using the address ",(0,t.jsx)(r.code,{children:"apiserver:51907"}),"."]})]})}function a(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var t=s(6540);const n={},i=t.createContext(n);function o(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0d48220f.b9cb6ce9.js b/assets/js/0d48220f.b9cb6ce9.js new file mode 100644 index 000000000..7f249d2c9 --- /dev/null +++ b/assets/js/0d48220f.b9cb6ce9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9825],{5992:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var t=o(4848),r=o(8453);const s={},c="Introduction",i={id:"connect/introduction",title:"Introduction",description:"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.",source:"@site/versioned_docs/version-2.0.0/connect/introduction.md",sourceDirName:"connect",slug:"/connect/introduction",permalink:"/docs/2.0.0/connect/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/introduction.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"},next:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"}},d={},l=[];function u(e){const n={code:"code",h1:"h1",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of ",(0,t.jsx)(n.code,{children:"Agents"}),", ",(0,t.jsx)(n.code,{children:"Peers"}),", ",(0,t.jsx)(n.code,{children:"Trunks"}),", ",(0,t.jsx)(n.code,{children:"Numbers"}),", ",(0,t.jsx)(n.code,{children:"Credentials"}),", and ",(0,t.jsx)(n.code,{children:"ACL"}),". It is the most common way to deploy Routr."]}),"\n",(0,t.jsx)(n.p,{children:"In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr."}),"\n",(0,t.jsx)(n.p,{children:"Some of the use cases for the Connect Mode are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Power your office or home phone system"}),"\n",(0,t.jsx)(n.li,{children:"Create an Intercom network"}),"\n",(0,t.jsx)(n.li,{children:"Power a SIP network on a CPaaS"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to the PSTN"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to Microsoft Teams (coming soon)"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to AWS Chime (coming soon)"}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>c,x:()=>i});var t=o(6540);const r={},s=t.createContext(r);function c(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0f2bd920.1ab834b7.js b/assets/js/0f2bd920.ca3c1434.js similarity index 98% rename from assets/js/0f2bd920.1ab834b7.js rename to assets/js/0f2bd920.ca3c1434.js index 74bd96c8d..892ea6e4f 100644 --- a/assets/js/0f2bd920.1ab834b7.js +++ b/assets/js/0f2bd920.ca3c1434.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2506],{1270:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>x,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=n(4848),i=n(8453);const r={},l="listEndpoints",o={id:"api/location/list",title:"listEndpoints",description:"Gets a list of registered devices.",source:"@site/versioned_docs/version-1.x.x/api/location/list.md",sourceDirName:"api/location",slug:"/api/location/list",permalink:"/docs/1.x.x/api/location/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"},next:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"}},d={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listendpoints",children:"listEndpoints"}),"\n",(0,s.jsx)(t.p,{children:"Gets a list of registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices in\nthe response body."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/location\n{\n\n}\n\nHTTP/1.1 200 OK\n{ \n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data":[{ \n "addressOfRecord": "sip:1001@sip.local",\n "contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"\n }]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2506],{1741:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>x,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var s=n(4848),i=n(8453);const r={},l="listEndpoints",o={id:"api/location/list",title:"listEndpoints",description:"Gets a list of registered devices.",source:"@site/versioned_docs/version-1.x.x/api/location/list.md",sourceDirName:"api/location",slug:"/api/location/list",permalink:"/docs/1.x.x/api/location/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"},next:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"}},d={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listendpoints",children:"listEndpoints"}),"\n",(0,s.jsx)(t.p,{children:"Gets a list of registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices in\nthe response body."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/location\n{\n\n}\n\nHTTP/1.1 200 OK\n{ \n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data":[{ \n "addressOfRecord": "sip:1001@sip.local",\n "contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"\n }]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/118e913f.0fdec136.js b/assets/js/118e913f.0fdec136.js new file mode 100644 index 000000000..e74642f08 --- /dev/null +++ b/assets/js/118e913f.0fdec136.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1],{8408:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=r(4848),n=r(8453);const o={},i="Concepts",a={id:"overview/concepts",title:"Concepts",description:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.",source:"@site/docs/overview/concepts.md",sourceDirName:"overview",slug:"/overview/concepts",permalink:"/docs/2.11.5/overview/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/docs/2.11.5/overview/architecture"},next:{title:"Deploy with Docker",permalink:"/docs/2.11.5/overview/deploy-with-docker"}},c={},d=[{value:"EdgePort",id:"edgeport",level:2},{value:"Location service",id:"location-service",level:2},{value:"Middlewares",id:"middlewares",level:2},{value:"Processors",id:"processors",level:2},{value:"Alterations",id:"alterations",level:2},{value:"Registry service",id:"registry-service",level:2},{value:"Requester",id:"requester",level:2}];function l(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"concepts",children:"Concepts"}),"\n",(0,t.jsx)(s.p,{children:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture."}),"\n",(0,t.jsx)(s.p,{children:"The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections."}),"\n",(0,t.jsx)(s.h2,{id:"edgeport",children:"EdgePort"}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages."}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly."}),"\n",(0,t.jsx)(s.p,{children:"Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr."}),"\n",(0,t.jsx)(s.p,{children:"Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher"}),"\n",(0,t.jsx)("img",{src:"/img/edgeport.png",alt:"EdgePort diagram",width:"500"}),"\n",(0,t.jsxs)(s.p,{children:["One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as ",(0,t.jsx)(s.code,{children:"TCP"}),",",(0,t.jsx)(s.code,{children:"TLS"}),", ",(0,t.jsx)(s.code,{children:"WS"}),", or ",(0,t.jsx)(s.code,{children:"WSS"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality."}),"\n",(0,t.jsx)(s.p,{children:"A minimal EdgePort configuration looks as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"# Example EdgePort configuration\nkind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n processor:\n addr: dispatcher:51901\n methods:\n - REGISTER\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: udp\n port: 5060\n"})}),"\n",(0,t.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,t.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor."}),"\n",(0,t.jsx)(s.p,{children:"The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor."}),"\n",(0,t.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,t.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,t.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,t.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,t.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,t.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,t.jsx)(s.h2,{id:"location-service",children:"Location service"}),"\n",(0,t.jsx)(s.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,t.jsx)(s.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,t.jsx)(s.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,t.jsxs)(s.p,{children:["Two balancing algorithms are available. The first is ",(0,t.jsx)(s.code,{children:"round-robin"}),", and the second is ",(0,t.jsx)(s.code,{children:"least-sessions"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,t.jsx)(s.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Notice that the load balancing section sets the ",(0,t.jsx)(s.code,{children:"withSessionAffinity"})," to ",(0,t.jsx)(s.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,t.jsxs)(s.p,{children:["Every Asterisk server that registers using the ",(0,t.jsx)(s.code,{children:"asterisk"})," username will join the same group under the ",(0,t.jsx)(s.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,t.jsx)(s.h2,{id:"middlewares",children:"Middlewares"}),"\n",(0,t.jsx)(s.p,{children:"Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc."}),"\n",(0,t.jsx)(s.p,{children:"Some use cases for Middlewares include:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Authentication and Authorization"}),"\n",(0,t.jsx)(s.li,{children:"Rate limiting"}),"\n",(0,t.jsx)(s.li,{children:"Circuit breaking"}),"\n",(0,t.jsx)(s.li,{children:"Logging, Metrics, and Tracing"}),"\n",(0,t.jsx)(s.li,{children:"Request and response validation"}),"\n",(0,t.jsx)(s.li,{children:"Data transformation and normalization"}),"\n",(0,t.jsx)(s.li,{children:"CDRs generation"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor."}),"\n",(0,t.jsx)(s.h2,{id:"processors",children:"Processors"}),"\n",(0,t.jsxs)(s.p,{children:["Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the ",(0,t.jsx)(s.a,{href:"#alterations",children:"Alterations API"})," to modify SIP messages."]}),"\n",(0,t.jsx)(s.p,{children:'The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.'}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'const Processor = require("@routr/processor").default;\nconst { MessageRequest, Response } = require("@routr/processor");\n\nnew Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(\n (req: MessageRequest, res: Response) => {\n logger.verbose("got new request: ")\n logger.verbose(JSON.stringify(req, null, " "))\n res.sendOk()\n }\n)\n'})}),"\n",(0,t.jsx)(s.h2,{id:"alterations",children:"Alterations"}),"\n",(0,t.jsx)(s.p,{children:"Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes."}),"\n",(0,t.jsx)(s.p,{children:"The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-typescript",children:"const { Alterations } = require('@routr/processor')\nconst { pipe } = require(\"fp-ts/function\");\n\nfunction messageProcessing(req: MessageRequest, route: Route): MessageRequest {\n const requestOut = pipe(\n reqIn,\n //example of an Alteration method with two arities\n Alterations.addSelfVia(route),\n Alterations.addSelfRecordRoute(route),\n Alterations.addRouteToPeerEdgePort(route),\n Alterations.addRouteToNextHop(route),\n //example of an Alteration method with one arity\n Alterations.addXEdgePortRef,\n Alterations.decreaseMaxForwards\n )\n\n return requestOut\n}\n"})}),"\n",(0,t.jsx)(s.p,{children:"If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output."}),"\n",(0,t.jsx)(s.h2,{id:"registry-service",children:"Registry service"}),"\n",(0,t.jsx)(s.p,{children:"The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service."}),"\n",(0,t.jsx)(s.p,{children:"Available configurations include the following:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Property"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Required"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"requesterAddr"}),(0,t.jsx)(s.td,{children:"Address of service to send requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"apiAddr"}),(0,t.jsx)(s.td,{children:"Address of API service"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"registerInterval"}),(0,t.jsx)(s.td,{children:"Interval to send registration requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"cache"}),(0,t.jsx)(s.td,{children:"Cache configuration"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"methods"}),(0,t.jsx)(s.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts"}),(0,t.jsx)(s.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.address"}),(0,t.jsx)(s.td,{children:"Address of EdgePort"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.region"}),(0,t.jsx)(s.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Here is an example of a Trunk configuration that requires registration:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n registerInterval: 20\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(s.h2,{id:"requester",children:"Requester"}),"\n",(0,t.jsx)(s.p,{children:"The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service."})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>a});var t=r(6540);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/118e913f.22aac4d7.js b/assets/js/118e913f.22aac4d7.js deleted file mode 100644 index 1b1ec1515..000000000 --- a/assets/js/118e913f.22aac4d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1],{9279:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=r(4848),n=r(8453);const o={},i="Concepts",a={id:"overview/concepts",title:"Concepts",description:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.",source:"@site/docs/overview/concepts.md",sourceDirName:"overview",slug:"/overview/concepts",permalink:"/docs/2.0.0/overview/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"},next:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"}},c={},d=[{value:"EdgePort",id:"edgeport",level:2},{value:"Location service",id:"location-service",level:2},{value:"Middlewares",id:"middlewares",level:2},{value:"Processors",id:"processors",level:2},{value:"Alterations",id:"alterations",level:2},{value:"Registry service",id:"registry-service",level:2},{value:"Requester",id:"requester",level:2}];function l(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"concepts",children:"Concepts"}),"\n",(0,t.jsx)(s.p,{children:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture."}),"\n",(0,t.jsx)(s.p,{children:"The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections."}),"\n",(0,t.jsx)(s.h2,{id:"edgeport",children:"EdgePort"}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages."}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly."}),"\n",(0,t.jsx)(s.p,{children:"Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr."}),"\n",(0,t.jsx)(s.p,{children:"Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher"}),"\n",(0,t.jsx)("img",{src:"/img/edgeport.png",alt:"EdgePort diagram",width:"500"}),"\n",(0,t.jsxs)(s.p,{children:["One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as ",(0,t.jsx)(s.code,{children:"TCP"}),",",(0,t.jsx)(s.code,{children:"TLS"}),", ",(0,t.jsx)(s.code,{children:"WS"}),", or ",(0,t.jsx)(s.code,{children:"WSS"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality."}),"\n",(0,t.jsx)(s.p,{children:"A minimal EdgePort configuration looks as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"# Example EdgePort configuration\nkind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n processor:\n addr: dispatcher:51901\n methods:\n - REGISTER\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: udp\n port: 5060\n"})}),"\n",(0,t.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,t.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor."}),"\n",(0,t.jsx)(s.p,{children:"The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor."}),"\n",(0,t.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,t.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,t.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,t.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,t.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,t.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,t.jsx)(s.h2,{id:"location-service",children:"Location service"}),"\n",(0,t.jsx)(s.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,t.jsx)(s.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,t.jsx)(s.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,t.jsxs)(s.p,{children:["Two balancing algorithms are available. The first is ",(0,t.jsx)(s.code,{children:"round-robin"}),", and the second is ",(0,t.jsx)(s.code,{children:"least-sessions"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,t.jsx)(s.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Notice that the load balancing section sets the ",(0,t.jsx)(s.code,{children:"withSessionAffinity"})," to ",(0,t.jsx)(s.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,t.jsxs)(s.p,{children:["Every Asterisk server that registers using the ",(0,t.jsx)(s.code,{children:"asterisk"})," username will join the same group under the ",(0,t.jsx)(s.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,t.jsx)(s.h2,{id:"middlewares",children:"Middlewares"}),"\n",(0,t.jsx)(s.p,{children:"Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc."}),"\n",(0,t.jsx)(s.p,{children:"Some use cases for Middlewares include:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Authentication and Authorization"}),"\n",(0,t.jsx)(s.li,{children:"Rate limiting"}),"\n",(0,t.jsx)(s.li,{children:"Circuit breaking"}),"\n",(0,t.jsx)(s.li,{children:"Logging, Metrics, and Tracing"}),"\n",(0,t.jsx)(s.li,{children:"Request and response validation"}),"\n",(0,t.jsx)(s.li,{children:"Data transformation and normalization"}),"\n",(0,t.jsx)(s.li,{children:"CDRs generation"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor."}),"\n",(0,t.jsx)(s.h2,{id:"processors",children:"Processors"}),"\n",(0,t.jsxs)(s.p,{children:["Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the ",(0,t.jsx)(s.a,{href:"#alterations",children:"Alterations API"})," to modify SIP messages."]}),"\n",(0,t.jsx)(s.p,{children:'The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.'}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'const Processor = require("@routr/processor").default;\nconst { MessageRequest, Response } = require("@routr/processor");\n\nnew Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(\n (req: MessageRequest, res: Response) => {\n logger.verbose("got new request: ")\n logger.verbose(JSON.stringify(req, null, " "))\n res.sendOk()\n }\n)\n'})}),"\n",(0,t.jsx)(s.h2,{id:"alterations",children:"Alterations"}),"\n",(0,t.jsx)(s.p,{children:"Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes."}),"\n",(0,t.jsx)(s.p,{children:"The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-typescript",children:"const { Alterations } = require('@routr/processor')\nconst { pipe } = require(\"fp-ts/function\");\n\nfunction messageProcessing(req: MessageRequest, route: Route): MessageRequest {\n const requestOut = pipe(\n reqIn,\n //example of an Alteration method with two arities\n Alterations.addSelfVia(route),\n Alterations.addSelfRecordRoute(route),\n Alterations.addRouteToPeerEdgePort(route),\n Alterations.addRouteToNextHop(route),\n //example of an Alteration method with one arity\n Alterations.addXEdgePortRef,\n Alterations.decreaseMaxForwards\n )\n\n return requestOut\n}\n"})}),"\n",(0,t.jsx)(s.p,{children:"If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output."}),"\n",(0,t.jsx)(s.h2,{id:"registry-service",children:"Registry service"}),"\n",(0,t.jsx)(s.p,{children:"The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service."}),"\n",(0,t.jsx)(s.p,{children:"Available configurations include the following:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Property"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Required"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"requesterAddr"}),(0,t.jsx)(s.td,{children:"Address of service to send requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"apiAddr"}),(0,t.jsx)(s.td,{children:"Address of API service"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"registerInterval"}),(0,t.jsx)(s.td,{children:"Interval to send registration requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"cache"}),(0,t.jsx)(s.td,{children:"Cache configuration"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"methods"}),(0,t.jsx)(s.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts"}),(0,t.jsx)(s.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.address"}),(0,t.jsx)(s.td,{children:"Address of EdgePort"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.region"}),(0,t.jsx)(s.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Here is an example of a Trunk configuration that requires registration:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n registerInterval: 20\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(s.h2,{id:"requester",children:"Requester"}),"\n",(0,t.jsx)(s.p,{children:"The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service."})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>a});var t=r(6540);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/129db88c.13220621.js b/assets/js/129db88c.13220621.js deleted file mode 100644 index 3c802655a..000000000 --- a/assets/js/129db88c.13220621.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2692],{7480:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const s={},i="WebRTC Support",a={id:"connect/webrtc-support",title:"WebRTC Support",description:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.",source:"@site/docs/connect/webrtc-support.md",sourceDirName:"connect",slug:"/connect/webrtc-support",permalink:"/docs/2.0.0/connect/webrtc-support",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/webrtc-support.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"},next:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"}},c={},l=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"webrtc-support",children:"WebRTC Support"}),"\n",(0,o.jsx)(t.p,{children:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server."}),"\n",(0,o.jsx)(t.p,{children:"Let\u2019s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients."}),"\n",(0,o.jsx)(t.p,{children:"Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step."}),"\n",(0,o.jsxs)(t.p,{children:["To enable WebRTC interoperability, you will need to update your compose.yaml file to include the ",(0,o.jsx)(t.code,{children:"RTPENGINE_HOST"})," environment variable. Here is an example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n RTPENGINE_HOST: ${RTPE_HOST} \n ports:\n - 51908:51908\n - 5060:5060/udp\n\n-- snip --\n'})}),"\n",(0,o.jsxs)(t.p,{children:["If using Helm, you will need to add the following configuration to your ",(0,o.jsx)(t.code,{children:"values.yaml"})," file:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"rtprelay:\n enabled: true\n rtpeHost: /* rtpengine */ \n rtpPort: 22222\n"})}),"\n",(0,o.jsx)(t.p,{children:"Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/129db88c.be993d56.js b/assets/js/129db88c.be993d56.js new file mode 100644 index 000000000..94c9335d4 --- /dev/null +++ b/assets/js/129db88c.be993d56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2692],{2469:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const s={},i="WebRTC Support",a={id:"connect/webrtc-support",title:"WebRTC Support",description:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.",source:"@site/docs/connect/webrtc-support.md",sourceDirName:"connect",slug:"/connect/webrtc-support",permalink:"/docs/2.11.5/connect/webrtc-support",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/webrtc-support.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home or Office Setup",permalink:"/docs/2.11.5/connect/home-or-office-setup"},next:{title:"Securing the Server",permalink:"/docs/2.11.5/connect/securing-the-server"}},c={},l=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"webrtc-support",children:"WebRTC Support"}),"\n",(0,o.jsx)(t.p,{children:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server."}),"\n",(0,o.jsx)(t.p,{children:"Let\u2019s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients."}),"\n",(0,o.jsx)(t.p,{children:"Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step."}),"\n",(0,o.jsxs)(t.p,{children:["To enable WebRTC interoperability, you will need to update your compose.yaml file to include the ",(0,o.jsx)(t.code,{children:"RTPENGINE_HOST"})," environment variable. Here is an example:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n RTPENGINE_HOST: ${RTPE_HOST} \n ports:\n - 51908:51908\n - 5060:5060/udp\n\n-- snip --\n'})}),"\n",(0,o.jsxs)(t.p,{children:["If using Helm, you will need to add the following configuration to your ",(0,o.jsx)(t.code,{children:"values.yaml"})," file:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"rtprelay:\n enabled: true\n rtpeHost: /* rtpengine */ \n rtpPort: 22222\n"})}),"\n",(0,o.jsx)(t.p,{children:"Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/144994e6.18647e79.js b/assets/js/144994e6.18647e79.js new file mode 100644 index 000000000..af52718b6 --- /dev/null +++ b/assets/js/144994e6.18647e79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1171],{1689:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.11.5/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.11.5/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.11.5/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51903 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/144994e6.fd76df99.js b/assets/js/144994e6.fd76df99.js deleted file mode 100644 index c49b61efd..000000000 --- a/assets/js/144994e6.fd76df99.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1171],{8162:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51903 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/157aa7fa.83a6a8a5.js b/assets/js/157aa7fa.83a6a8a5.js new file mode 100644 index 000000000..fe81fd84f --- /dev/null +++ b/assets/js/157aa7fa.83a6a8a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1922],{64:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=t(4848),c=t(8453);const l={},s="CTL",i={id:"connect/command-line/ctl",title:"CTL",description:"Command-Line for Routr server.",source:"@site/versioned_docs/version-2.0.0/connect/command-line/ctl.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/ctl",permalink:"/docs/2.0.0/connect/command-line/ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/command-line/ctl.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"}},o={},d=[{value:"rctl acl create",id:"rctl-acl-create",level:2},{value:"rctl acl delete [REF]",id:"rctl-acl-delete-ref",level:2},{value:"rctl acl describe [REF]",id:"rctl-acl-describe-ref",level:2},{value:"rctl acl get [REF]",id:"rctl-acl-get-ref",level:2},{value:"rctl acl update REF",id:"rctl-acl-update-ref",level:2},{value:"rctl agents create",id:"rctl-agents-create",level:2},{value:"rctl agents delete [REF]",id:"rctl-agents-delete-ref",level:2},{value:"rctl agents describe [REF]",id:"rctl-agents-describe-ref",level:2},{value:"rctl agents get [REF]",id:"rctl-agents-get-ref",level:2},{value:"rctl agents update REF",id:"rctl-agents-update-ref",level:2},{value:"rctl autocomplete [SHELL]",id:"rctl-autocomplete-shell",level:2},{value:"rctl credentials create",id:"rctl-credentials-create",level:2},{value:"rctl credentials delete [REF]",id:"rctl-credentials-delete-ref",level:2},{value:"rctl credentials describe [REF]",id:"rctl-credentials-describe-ref",level:2},{value:"rctl credentials get [REF]",id:"rctl-credentials-get-ref",level:2},{value:"rctl credentials update REF",id:"rctl-credentials-update-ref",level:2},{value:"rctl domains create",id:"rctl-domains-create",level:2},{value:"rctl domains delete [REF]",id:"rctl-domains-delete-ref",level:2},{value:"rctl domains describe [REF]",id:"rctl-domains-describe-ref",level:2},{value:"rctl domains get [REF]",id:"rctl-domains-get-ref",level:2},{value:"rctl domains update REF",id:"rctl-domains-update-ref",level:2},{value:"rctl numbers create",id:"rctl-numbers-create",level:2},{value:"rctl numbers delete [REF]",id:"rctl-numbers-delete-ref",level:2},{value:"rctl numbers describe [REF]",id:"rctl-numbers-describe-ref",level:2},{value:"rctl numbers get [REF]",id:"rctl-numbers-get-ref",level:2},{value:"rctl numbers update REF",id:"rctl-numbers-update-ref",level:2},{value:"rctl peers create",id:"rctl-peers-create",level:2},{value:"rctl peers delete [REF]",id:"rctl-peers-delete-ref",level:2},{value:"rctl peers describe [REF]",id:"rctl-peers-describe-ref",level:2},{value:"rctl peers get [REF]",id:"rctl-peers-get-ref",level:2},{value:"rctl peers update REF",id:"rctl-peers-update-ref",level:2},{value:"rctl plugins",id:"rctl-plugins",level:2},{value:"rctl plugins:install PLUGIN...",id:"rctl-pluginsinstall-plugin",level:2},{value:"rctl plugins:inspect PLUGIN...",id:"rctl-pluginsinspect-plugin",level:2},{value:"rctl plugins:install PLUGIN...",id:"rctl-pluginsinstall-plugin-1",level:2},{value:"rctl plugins:link PLUGIN",id:"rctl-pluginslink-plugin",level:2},{value:"rctl plugins:uninstall PLUGIN...",id:"rctl-pluginsuninstall-plugin",level:2},{value:"rctl plugins:uninstall PLUGIN...",id:"rctl-pluginsuninstall-plugin-1",level:2},{value:"rctl plugins:uninstall PLUGIN...",id:"rctl-pluginsuninstall-plugin-2",level:2},{value:"rctl plugins update",id:"rctl-plugins-update",level:2},{value:"rctl trunks create",id:"rctl-trunks-create",level:2},{value:"rctl trunks delete [REF]",id:"rctl-trunks-delete-ref",level:2},{value:"rctl trunks describe [REF]",id:"rctl-trunks-describe-ref",level:2},{value:"rctl trunks get [REF]",id:"rctl-trunks-get-ref",level:2},{value:"rctl trunks update REF",id:"rctl-trunks-update-ref",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"ctl",children:"CTL"}),"\n",(0,r.jsx)(n.p,{children:"Command-Line for Routr server."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#usage",children:"Usage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#commands",children:"Commands"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install -g @routr/ctl\n$ rctl COMMAND\nrunning command...\n$ rctl (--version)\n@routr/ctl/2.1.11 linux-x64 node-v18.17.1\n$ rctl --help [COMMAND]\nUSAGE\n $ rctl COMMAND\n...\n"})}),"\n",(0,r.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-create",children:(0,r.jsx)(n.code,{children:"rctl acl create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new ACL\n\nEXAMPLES\n $ rctl acl create\n Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/create.ts",children:"dist/commands/acl/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl acl delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Access Control List"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Access Control List\n\nEXAMPLES\n $ rctl acl delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/delete.ts",children:"dist/commands/acl/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl acl describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the ACL\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an ACL\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/describe.ts",children:"dist/commands/acl/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-get-ref",children:(0,r.jsx)(n.code,{children:"rctl acl get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated ACLs or a single ACL if a ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to an ACL\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated ACLs or a single ACL if a ref is provided\n\nEXAMPLES\n $ rctl acl get\n Ref Name Deny List Allow List\n 9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/get.ts",children:"dist/commands/acl/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-update-ref",children:(0,r.jsx)(n.code,{children:"rctl acl update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an ACL\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing ACL\n\nEXAMPLES\n $ rctl acl update\n Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/update.ts",children:"dist/commands/acl/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-create",children:(0,r.jsx)(n.code,{children:"rctl agents create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Agent\n\nEXAMPLES\n $ rctl agents create\n Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/create.ts",children:"dist/commands/agents/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl agents delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Agent\n\nEXAMPLES\n $ rctl agents delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/delete.ts",children:"dist/commands/agents/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl agents describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the Agent\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an Agent\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/describe.ts",children:"dist/commands/agents/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-get-ref",children:(0,r.jsx)(n.code,{children:"rctl agents get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Agents or a single Agent if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF Optional Agents reference\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] The number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Agents or a single Agent if ref is provided\n\nEXAMPLES\n $ rctl agents get\n Ref Name Username Domain Privacy Enabled\n d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/get.ts",children:"dist/commands/agents/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-update-ref",children:(0,r.jsx)(n.code,{children:"rctl agents update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing Agent\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Agent\n\nEXAMPLES\n $ rctl agents update\n Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/update.ts",children:"dist/commands/agents/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-autocomplete-shell",children:(0,r.jsx)(n.code,{children:"rctl autocomplete [SHELL]"})}),"\n",(0,r.jsx)(n.p,{children:"display autocomplete installation instructions"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl autocomplete [SHELL] [-r]\n\nARGUMENTS\n SHELL shell type\n\nFLAGS\n -r, --refresh-cache Refresh cache (ignores displaying instructions)\n\nDESCRIPTION\n display autocomplete installation instructions\n\nEXAMPLES\n $ rctl autocomplete\n\n $ rctl autocomplete bash\n\n $ rctl autocomplete zsh\n\n $ rctl autocomplete --refresh-cache\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-autocomplete/blob/v1.4.6/src/commands/autocomplete/index.ts",children:"@oclif/plugin-autocomplete"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-create",children:(0,r.jsx)(n.code,{children:"rctl credentials create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set of Credentials\n\nEXAMPLES\n $ rctl credentials create\n Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/create.ts",children:"dist/commands/credentials/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a set of Credentials\n\nEXAMPLES\n $ rctl credentials delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/delete.ts",children:"dist/commands/credentials/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the set of Credentials\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a set of Credentials\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/describe.ts",children:"dist/commands/credentials/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-get-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Credentials or a single set if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to a set of Credentials\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Credentials or a single set if ref is provided\n\nEXAMPLES\n $ rctl credentials get\n Ref Name Deny List Allow List\n 80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/get.ts",children:"dist/commands/credentials/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-update-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing set of Credentials\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl credentials update\n Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/update.ts",children:"dist/commands/credentials/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-create",children:(0,r.jsx)(n.code,{children:"rctl domains create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set Domain\n\nEXAMPLES\n $ rctl domains create\n Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/create.ts",children:"dist/commands/domains/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl domains delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Domain\n\nEXAMPLES\n $ rctl domains delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/delete.ts",children:"dist/commands/domains/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl domains describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"show details of a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the Domain\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n show details of a Domain\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/describe.ts",children:"dist/commands/domains/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-get-ref",children:(0,r.jsx)(n.code,{children:"rctl domains get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Domains or a single Domain if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to a Domain\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Domains or a single Domain if ref is provided\n\nEXAMPLES\n $ rctl domains get\n Ref Name URI \n ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/get.ts",children:"dist/commands/domains/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-update-ref",children:(0,r.jsx)(n.code,{children:"rctl domains update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing Domain\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Domain\n\nEXAMPLES\n $ rctl domains update\n Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/update.ts",children:"dist/commands/domains/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-create",children:(0,r.jsx)(n.code,{children:"rctl numbers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Number\n\nEXAMPLES\n $ rctl numbers create\n Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/create.ts",children:"dist/commands/numbers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Number\n\nEXAMPLES\n $ rctl numbers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/delete.ts",children:"dist/commands/numbers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the Number\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Number\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/describe.ts",children:"dist/commands/numbers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Numbers or a single Number if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to a Number\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Numbers or a single Number if ref is provided\n\nEXAMPLES\n $ rctl numbers get\n Ref Name Telephony URL AOR Link Geo \n a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/get.ts",children:"dist/commands/numbers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing Number\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl numbers update\n Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/update.ts",children:"dist/commands/numbers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-create",children:(0,r.jsx)(n.code,{children:"rctl peers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Peer\n\nEXAMPLES\n $ rctl peers create\n Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/create.ts",children:"dist/commands/peers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl peers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Peer\n\nEXAMPLES\n $ rctl peers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/delete.ts",children:"dist/commands/peers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl peers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the Peer\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Peer\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/describe.ts",children:"dist/commands/peers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl peers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Peers or a single Peer if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to a Peer\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Peers or a single Peer if ref is provided\n\nEXAMPLES\n $ rctl peers get\n Ref Name Username AOR Balancing Algorithm Session Affinity \n 6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/get.ts",children:"dist/commands/peers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl peers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing Peer\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Peer\n\nEXAMPLES\n $ rctl peers update\n Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/update.ts",children:"dist/commands/peers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins",children:(0,r.jsx)(n.code,{children:"rctl plugins"})}),"\n",(0,r.jsx)(n.p,{children:"List installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins [--core]\n\nFLAGS\n --core Show core plugins.\n\nDESCRIPTION\n List installed plugins.\n\nEXAMPLES\n $ rctl plugins\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/index.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinspect-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:inspect PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Displays installation properties of a plugin."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:inspect PLUGIN...\n\nARGUMENTS\n PLUGIN [default: .] Plugin to inspect.\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nGLOBAL FLAGS\n --json Format output as json.\n\nDESCRIPTION\n Displays installation properties of a plugin.\n\nEXAMPLES\n $ rctl plugins:inspect myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/inspect.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/install.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginslink-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:link PLUGIN"})}),"\n",(0,r.jsx)(n.p,{children:"Links a plugin into the CLI for development."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:link PLUGIN\n\nARGUMENTS\n PATH [default: .] path to plugin\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Links a plugin into the CLI for development.\n Installation of a linked plugin will override a user-installed or core plugin.\n\n e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'\n command will override the user-installed or core plugin implementation. This is useful for development work.\n\n\nEXAMPLES\n $ rctl plugins:link myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/link.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/uninstall.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-2",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins-update",children:(0,r.jsx)(n.code,{children:"rctl plugins update"})}),"\n",(0,r.jsx)(n.p,{children:"Update installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins update [-h] [-v]\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Update installed plugins.\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/update.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-create",children:(0,r.jsx)(n.code,{children:"rctl trunks create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks create [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Trunk\n\nEXAMPLES\n $ rctl trunks create\n Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/create.ts",children:"dist/commands/trunks/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks delete [REF] [-i] [-c ] [-e ]\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Trunk\n\nEXAMPLES\n $ rctl trunks delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/delete.ts",children:"dist/commands/trunks/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks describe [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to the Trunk\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Trunk\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/describe.ts",children:"dist/commands/trunks/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-get-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Trunks or a single Trunk if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks get [REF] [-i] [-c ] [-e ] [-s ] [-x]\n\nARGUMENTS\n REF optional reference to a Trunk\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size= [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Trunks or a single Trunk if ref is provided\n\nEXAMPLES\n $ rctl trunks get\n Ref Name Inbound SIP URI \n 8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/get.ts",children:"dist/commands/trunks/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-update-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks update [REF] [-i] [-c ] [-e ]\n\nARGUMENTS\n REF reference to an existing Trunk\n\nFLAGS\n -c, --cacert= path to the CA certificate to verify the server\n -e, --endpoint= [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Trunk\n\nEXAMPLES\n $ rctl trunks update\n Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/update.ts",children:"dist/commands/trunks/update.ts"})]})})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var r=t(6540);const c={},l=r.createContext(c);function s(e){const n=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:s(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.04422b2e.js b/assets/js/17896441.04422b2e.js deleted file mode 100644 index 27bd84671..000000000 --- a/assets/js/17896441.04422b2e.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8401],{6766:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>qt});var s=n(6540),a=n(9024),o=n(9532),i=n(4848);const l=s.createContext(null);function c(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,i.jsx)(l.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(l);if(null===e)throw new o.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=r();return(0,i.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(8215),m=n(4581),h=n(1312),p=n(8774);function f(e){const{permalink:t,title:n,subLabel:s,isNext:a}=e;return(0,i.jsxs)(p.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}function x(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(f,{...t,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(f,{...n,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=r();return(0,i.jsx)(x,{previous:e.previous,next:e.next})}var g=n(4586),j=n(4070),v=n(7559),N=n(5597),C=n(2252);const A={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function k(e){const t=A[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function L(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(p.A,{to:n,onClick:s,children:(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function y(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:o}=(0,N.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:c}=(0,j.HW)(a),r=l??(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.A)(t,v.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(k,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(L,{versionLabel:c.label,to:r.path,onClick:()=>o(c.name)})})]})}function _(e){let{className:t}=e;const n=(0,C.r)();return n.banner?(0,i.jsx)(y,{className:t,versionMetadata:n}):null}function B(e){let{className:t}=e;const n=(0,C.r)();return n.badge?(0,i.jsx)("span",{className:(0,u.A)(t,v.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function T(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,i.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,i.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,i.jsx)(w,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,i.jsx)(T,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const H={iconEdit:"iconEdit_Z9Sw"};function M(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(H.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function I(e){let{editUrl:t}=e;return(0,i.jsxs)(p.A,{to:t,className:v.G.common.editThisPage,children:[(0,i.jsx)(M,{}),(0,i.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}const S={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:n,count:s}=e;return(0,i.jsxs)(p.A,{href:t,className:(0,u.A)(S.tag,s?S.tagWithCount:S.tagRegular),children:[n,s&&(0,i.jsx)("span",{children:s})]})}const V={tags:"tags_jXut",tag:"tag_QGVx"};function R(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,u.A)(V.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,i.jsx)("li",{className:V.tag,children:(0,i.jsx)(U,{label:t,permalink:n})},n)}))})]})}const z={lastUpdated:"lastUpdated_vwxv"};function O(e){return(0,i.jsx)("div",{className:(0,u.A)(v.G.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(R,{...e})})})}function P(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docFooterEditMetaRow,"row"),children:[(0,i.jsx)("div",{className:"col",children:t&&(0,i.jsx)(I,{editUrl:t})}),(0,i.jsx)("div",{className:(0,u.A)("col",z.lastUpdated),children:(n||s)&&(0,i.jsx)(E,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function G(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:o}=e,l=o.length>0,c=!!(t||n||a);return l||c?(0,i.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[l&&(0,i.jsx)(O,{tags:o}),c&&(0,i.jsx)(P,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var D=n(1422),W=n(6342);function $(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Z(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>q(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function J(e){const t=(0,s.useRef)(void 0),n=Y();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:o,maxHeadingLevel:i}),c=Z(l,{anchorTopOffset:n.current}),r=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===r)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function K(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,i.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,i.jsxs)("li",{children:[(0,i.jsx)(p.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,i.jsx)(K,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const Q=s.memo(K);function X(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:l,maxHeadingLevel:c,...r}=e;const d=(0,W.p)(),u=l??d.tableOfContents.minHeadingLevel,m=c??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>F({toc:$(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:u,maxHeadingLevel:m});return J((0,s.useMemo)((()=>{if(a&&o)return{linkClassName:a,linkActiveClassName:o,minHeadingLevel:u,maxHeadingLevel:m}}),[a,o,u,m])),(0,i.jsx)(Q,{toc:h,className:n,linkClassName:a,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:o,toggleCollapsed:l}=(0,D.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.A)(ne.tocCollapsible,!o&&ne.tocCollapsibleExpanded,n),children:[(0,i.jsx)(te,{collapsed:o,onClick:l}),(0,i.jsx)(D.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:o,children:(0,i.jsx)(X,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const ae={tocMobile:"tocMobile_ITEo"};function oe(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,ae.tocMobile)})}const ie={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},le="table-of-contents__link toc-highlight",ce="table-of-contents__link--active";function re(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,u.A)(ie.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(X,{...n,linkClassName:le,linkActiveClassName:ce})})}function de(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(re,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var ue=n(1107),me=n(8453),he=n(5260),pe=n(2303),fe=n(5293);function xe(){const{prism:e}=(0,W.p)(),{colorMode:t}=(0,fe.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var be=n(8426),ge=n.n(be);const je=/title=(?["'])(?.*?)\1/,ve=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Ce={...Ne,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},Ae=Object.keys(Ne);function ke(e,t){const n=e.map((e=>{const{start:n,end:s}=Ce[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function Le(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&ve.test(o)){const e=o.match(ve).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=ge()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const i=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return ke(["js","jsBlock"],t);case"jsx":case"tsx":return ke(["js","jsBlock","jsx"],t);case"html":return ke(["js","jsBlock","html"],t);case"python":case"py":case"bash":return ke(["bash"],t);case"markdown":case"md":return ke(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return ke(["tex"],t);case"lua":case"haskell":case"sql":return ke(["lua"],t);case"wasm":return ke(["wasm"],t);case"vb":case"vba":case"visual-basic":return ke(["vb","rem"],t);case"vbnet":return ke(["vbnet","rem"],t);case"batch":return ke(["rem"],t);case"basic":return ke(["rem","f90"],t);case"fsharp":return ke(["js","ml"],t);case"ocaml":case"sml":return ke(["ml"],t);case"fortran":return ke(["f90"],t);case"cobol":return ke(["cobol"],t);default:return ke(Ae,t)}}(s,a),l=n.split("\n"),c=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),r=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<l.length;){const e=l[h].match(i);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));r[t]?c[r[t]].range+=`${h},`:d[t]?c[d[t]].start=h:u[t]&&(c[u[t]].range+=`${c[u[t]].start}-${h-1},`),l.splice(h,1)}n=l.join("\n");const m={};return Object.entries(c).forEach((e=>{let[t,{range:n}]=e;ge()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const ye={codeBlockContainer:"codeBlockContainer_Ckt0"};function _e(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(xe());return(0,i.jsx)(t,{...n,style:s,className:(0,u.A)(n.className,ye.codeBlockContainer,v.G.common.codeBlock)})}const Be={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function we(e){let{children:t,className:n}=e;return(0,i.jsx)(_e,{as:"pre",tabIndex:0,className:(0,u.A)(Be.codeBlockStandalone,"thin-scrollbar",n),children:(0,i.jsx)("code",{className:Be.codeBlockLines,children:t})})}const Te={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Ee(e,t){const[n,a]=(0,s.useState)(),i=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{i()}),[i]),function(e,t,n){void 0===n&&(n=Te);const a=(0,o._q)(t),i=(0,o.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,i),()=>t.disconnect()}),[e,a,i])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),i())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var He=n(8181);const Me={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function Ie(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const l=a({line:t,className:(0,u.A)(n,s&&Me.codeLine)}),c=t.map(((e,t)=>(0,i.jsx)("span",{...o({token:e,key:t})},t)));return(0,i.jsxs)("span",{...l,children:[s?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("span",{className:Me.codeLineNumber}),(0,i.jsx)("span",{className:Me.codeLineContent,children:c})]}):c,(0,i.jsx)("br",{})]})}function Se(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function Ue(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const Ve={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function Re(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),l=(0,s.useRef)(void 0),c=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),i=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}s.remove(),i&&(o.removeAllRanges(),o.addRange(i)),a&&a.focus()}(t),o(!0),l.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),(0,i.jsx)("button",{type:"button","aria-label":a?(0,h.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,h.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,h.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",n,Ve.copyButton,a&&Ve.copyButtonCopied),onClick:c,children:(0,i.jsxs)("span",{className:Ve.copyButtonIcons,"aria-hidden":"true",children:[(0,i.jsx)(Se,{className:Ve.copyButtonIcon}),(0,i.jsx)(Ue,{className:Ve.copyButtonSuccessIcon})]})})}function ze(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const Oe={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Pe(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,h.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,i.jsx)("button",{type:"button",onClick:n,className:(0,u.A)("clean-btn",t,s&&Oe.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,i.jsx)(ze,{className:Oe.wordWrapButtonIcon,"aria-hidden":"true"})})}function Ge(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:r,magicComments:d}}=(0,W.p)(),m=function(e){return e?.toLowerCase()}(c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??r),h=xe(),p=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),i=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),l=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return Ee(o,l),(0,s.useEffect)((()=>{l()}),[e,l]),(0,s.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:i}}(),f=function(e){return e?.match(je)?.groups.title??""}(a)||o,{lineClassNames:x,code:b}=Le(t,{metastring:a,language:m,magicComments:d}),g=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,i.jsxs)(_e,{as:"div",className:(0,u.A)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`),children:[f&&(0,i.jsx)("div",{className:Be.codeBlockTitle,children:f}),(0,i.jsxs)("div",{className:Be.codeBlockContent,children:[(0,i.jsx)(He.f4,{theme:h,code:b,language:m??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,i.jsx)("pre",{tabIndex:0,ref:p.codeBlockRef,className:(0,u.A)(t,Be.codeBlock,"thin-scrollbar"),style:n,children:(0,i.jsx)("code",{className:(0,u.A)(Be.codeBlockLines,g&&Be.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,i.jsx)(Ie,{line:e,getLineProps:a,getTokenProps:o,classNames:x[t],showLineNumbers:g},t)))})})}}),(0,i.jsxs)("div",{className:Be.buttonGroup,children:[(p.isEnabled||p.isCodeScrollable)&&(0,i.jsx)(Pe,{className:Be.codeButton,onClick:()=>p.toggle(),isEnabled:p.isEnabled}),(0,i.jsx)(Re,{className:Be.codeButton,code:b})]})]})]})}function De(e){let{children:t,...n}=e;const a=(0,pe.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof o?Ge:we;return(0,i.jsx)(l,{...n,children:o},String(a))}function We(e){return(0,i.jsx)("code",{...e})}var $e=n(5066),Fe=n(3427);const qe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ze(e){return!!e&&("SUMMARY"===e.tagName||Ze(e.parentElement))}function Ye(e,t){return!!e&&(e===t||Ye(e.parentElement,t))}function Je(e){let{summary:t,children:n,...a}=e;(0,Fe.A)().collectAnchor(a.id);const o=(0,pe.A)(),l=(0,s.useRef)(null),{collapsed:c,setCollapsed:r}=(0,D.u)({initialState:!a.open}),[d,u]=(0,s.useState)(a.open),m=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...a,ref:l,open:d,"data-collapsed":c,className:(0,$e.A)(qe.details,o&&qe.isBrowser,a.className),onMouseDown:e=>{Ze(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ze(t)&&Ye(t,l.current)&&(e.preventDefault(),c?(r(!1),u(!0)):r(!0))},children:[m,(0,i.jsx)(D.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{r(e),u(!e)},children:(0,i.jsx)("div",{className:qe.collapsibleContent,children:n})})]})}const Ke={details:"details_b_Ee"},Qe="alert alert--info";function Xe(e){let{...t}=e;return(0,i.jsx)(Je,{...t,className:(0,u.A)(Qe,Ke.details,t.className)})}function et(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==n))});return(0,i.jsx)(Xe,{...e,summary:n,children:a})}function tt(e){return(0,i.jsx)(ue.A,{...e})}const nt={containsTaskList:"containsTaskList_mC6p"};function st(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&nt.containsTaskList)}const at={img:"img_ev3q"};function ot(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),o=n?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}const it={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function lt(e){let{type:t,className:n,children:s}=e;return(0,i.jsx)("div",{className:(0,u.A)(v.G.common.admonition,v.G.common.admonitionType(t),it.admonition,n),children:s})}function ct(e){let{icon:t,title:n}=e;return(0,i.jsxs)("div",{className:it.admonitionHeading,children:[(0,i.jsx)("span",{className:it.admonitionIcon,children:t}),n]})}function rt(e){let{children:t}=e;return t?(0,i.jsx)("div",{className:it.admonitionContent,children:t}):null}function dt(e){const{type:t,icon:n,title:s,children:a,className:o}=e;return(0,i.jsxs)(lt,{type:t,className:o,children:[(0,i.jsx)(ct,{title:s,icon:n}),(0,i.jsx)(rt,{children:a})]})}function ut(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const mt={icon:(0,i.jsx)(ut,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function ht(e){return(0,i.jsx)(dt,{...mt,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function pt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const ft={icon:(0,i.jsx)(pt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function xt(e){return(0,i.jsx)(dt,{...ft,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function bt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const gt={icon:(0,i.jsx)(bt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function jt(e){return(0,i.jsx)(dt,{...gt,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function vt(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const Nt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Ct(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const At={icon:(0,i.jsx)(Ct,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const kt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const Lt={...{note:ht,tip:xt,info:jt,warning:function(e){return(0,i.jsx)(dt,{...Nt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(dt,{...At,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(ht,{title:"secondary",...e}),important:e=>(0,i.jsx)(jt,{title:"important",...e}),success:e=>(0,i.jsx)(xt,{title:"success",...e}),caution:function(e){return(0,i.jsx)(dt,{...kt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function yt(e){const t=ot(e),n=(s=t.type,Lt[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),Lt.info));var s;return(0,i.jsx)(n,{...t})}const _t={Head:he.A,details:et,Details:et,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,i.jsx)(We,{...e}):(0,i.jsx)(De,{...e})},a:function(e){return(0,i.jsx)(p.A,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:st(e.className)})},li:function(e){return(0,Fe.A)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,u.A)(t,at.img))});var t},h1:e=>(0,i.jsx)(tt,{as:"h1",...e}),h2:e=>(0,i.jsx)(tt,{as:"h2",...e}),h3:e=>(0,i.jsx)(tt,{as:"h3",...e}),h4:e=>(0,i.jsx)(tt,{as:"h4",...e}),h5:e=>(0,i.jsx)(tt,{as:"h5",...e}),h6:e=>(0,i.jsx)(tt,{as:"h6",...e}),admonition:yt,mermaid:()=>null};function Bt(e){let{children:t}=e;return(0,i.jsx)(me.x,{components:_t,children:t})}function wt(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(ue.A,{as:"h1",children:n})}),(0,i.jsx)(Bt,{children:t})]})}var Tt=n(1754),Et=n(9169),Ht=n(6025);function Mt(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const It={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function St(){const e=(0,Ht.A)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(Mt,{className:It.breadcrumbHomeIcon})})})}const Ut={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Vt(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function Rt(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function zt(){const e=(0,Tt.OF)(),t=(0,Et.Dt)();return e?(0,i.jsx)("nav",{className:(0,u.A)(v.G.docs.docBreadcrumbs,Ut.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(St,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(Rt,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(Vt,{href:a,isLast:s,children:t.label})},n)}))]})}):null}function Ot(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function Pt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Gt(){return(0,i.jsx)(he.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Dt(e){let{className:t}=e;return(0,i.jsx)(yt,{type:"caution",title:(0,i.jsx)(Ot,{}),className:(0,u.A)(t,v.G.common.unlistedBanner),children:(0,i.jsx)(Pt,{})})}function Wt(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Gt,{}),(0,i.jsx)(Dt,{...e})]})}const $t={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ft(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(oe,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(de,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&$t.docItemCol),children:[s&&(0,i.jsx)(Wt,{}),(0,i.jsx)(_,{}),(0,i.jsxs)("div",{className:$t.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(zt,{}),(0,i.jsx)(B,{}),n.mobile,(0,i.jsx)(wt,{children:t}),(0,i.jsx)(G,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function qt(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.e3,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(Ft,{children:(0,i.jsx)(n,{})})]})})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/17896441.40137c41.js b/assets/js/17896441.40137c41.js new file mode 100644 index 000000000..fffa64288 --- /dev/null +++ b/assets/js/17896441.40137c41.js @@ -0,0 +1 @@ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8401],{5150:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>qt});var s=n(6540),a=n(9024),o=n(9532),i=n(4848);const l=s.createContext(null);function c(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,i.jsx)(l.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(l);if(null===e)throw new o.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=r();return(0,i.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(8215),m=n(4581),h=n(1312),p=n(8774);function f(e){const{permalink:t,title:n,subLabel:s,isNext:a}=e;return(0,i.jsxs)(p.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}function x(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(f,{...t,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(f,{...n,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=r();return(0,i.jsx)(x,{previous:e.previous,next:e.next})}var g=n(4586),j=n(4070),v=n(7559),N=n(5597),C=n(2252);const A={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function k(e){const t=A[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function y(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(p.A,{to:n,onClick:s,children:(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function L(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:o}=(0,N.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:c}=(0,j.HW)(a),r=l??(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.A)(t,v.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(k,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(y,{versionLabel:c.label,to:r.path,onClick:()=>o(c.name)})})]})}function _(e){let{className:t}=e;const n=(0,C.r)();return n.banner?(0,i.jsx)(L,{className:t,versionMetadata:n}):null}function B(e){let{className:t}=e;const n=(0,C.r)();return n.badge?(0,i.jsx)("span",{className:(0,u.A)(t,v.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}const w={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function T(e){let{permalink:t,label:n,count:s,description:a}=e;return(0,i.jsxs)(p.A,{href:t,title:a,className:(0,u.A)(w.tag,s?w.tagWithCount:w.tagRegular),children:[n,s&&(0,i.jsx)("span",{children:s})]})}const E={tags:"tags_jXut",tag:"tag_QGVx"};function H(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,u.A)(E.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:E.tag,children:(0,i.jsx)(T,{...e})},e.permalink)))})]})}const M={iconEdit:"iconEdit_Z9Sw"};function I(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(M.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function S(e){let{editUrl:t}=e;return(0,i.jsxs)(p.A,{to:t,className:v.G.common.editThisPage,children:[(0,i.jsx)(I,{}),(0,i.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}function U(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,g.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,g.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}function V(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=U({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function R(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function z(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,i.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(V,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(R,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const O={lastUpdated:"lastUpdated_JAkA"};function P(e){let{className:t,editUrl:n,lastUpdatedAt:s,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,u.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(S,{editUrl:n})}),(0,i.jsx)("div",{className:(0,u.A)("col",O.lastUpdated),children:(s||a)&&(0,i.jsx)(z,{lastUpdatedAt:s,lastUpdatedBy:a})})]})}function G(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,o=a.length>0,l=!!(t||n||s);return o||l?(0,i.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[o&&(0,i.jsx)("div",{className:(0,u.A)("row margin-top--sm",v.G.docs.docFooterTagsRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(H,{tags:a})})}),l&&(0,i.jsx)(P,{className:(0,u.A)("margin-top--sm",v.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var D=n(1422),W=n(6342);function $(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function F(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Z(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>q(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(q(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function J(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,W.p)();return(0,s.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function Y(e){const t=(0,s.useRef)(void 0),n=J();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:o,maxHeadingLevel:i}),c=Z(l,{anchorTopOffset:n.current}),r=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===r)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function K(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,i.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,i.jsxs)("li",{children:[(0,i.jsx)(p.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,i.jsx)(K,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const Q=s.memo(K);function X(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:l,maxHeadingLevel:c,...r}=e;const d=(0,W.p)(),u=l??d.tableOfContents.minHeadingLevel,m=c??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>F({toc:$(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:u,maxHeadingLevel:m});return Y((0,s.useMemo)((()=>{if(a&&o)return{linkClassName:a,linkActiveClassName:o,minHeadingLevel:u,maxHeadingLevel:m}}),[a,o,u,m])),(0,i.jsx)(Q,{toc:h,className:n,linkClassName:a,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function te(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const ne={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function se(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:o,toggleCollapsed:l}=(0,D.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.A)(ne.tocCollapsible,!o&&ne.tocCollapsibleExpanded,n),children:[(0,i.jsx)(te,{collapsed:o,onClick:l}),(0,i.jsx)(D.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:o,children:(0,i.jsx)(X,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const ae={tocMobile:"tocMobile_ITEo"};function oe(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,ae.tocMobile)})}const ie={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},le="table-of-contents__link toc-highlight",ce="table-of-contents__link--active";function re(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,u.A)(ie.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(X,{...n,linkClassName:le,linkActiveClassName:ce})})}function de(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(re,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var ue=n(1107),me=n(8453),he=n(5260),pe=n(2303),fe=n(5293);function xe(){const{prism:e}=(0,W.p)(),{colorMode:t}=(0,fe.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var be=n(8426),ge=n.n(be);const je=/title=(?<quote>["'])(?<title>.*?)\1/,ve=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Ce={...Ne,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},Ae=Object.keys(Ne);function ke(e,t){const n=e.map((e=>{const{start:n,end:s}=Ce[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function ye(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&ve.test(o)){const e=o.match(ve).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=ge()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const i=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return ke(["js","jsBlock"],t);case"jsx":case"tsx":return ke(["js","jsBlock","jsx"],t);case"html":return ke(["js","jsBlock","html"],t);case"python":case"py":case"bash":return ke(["bash"],t);case"markdown":case"md":return ke(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return ke(["tex"],t);case"lua":case"haskell":case"sql":return ke(["lua"],t);case"wasm":return ke(["wasm"],t);case"vb":case"vba":case"visual-basic":return ke(["vb","rem"],t);case"vbnet":return ke(["vbnet","rem"],t);case"batch":return ke(["rem"],t);case"basic":return ke(["rem","f90"],t);case"fsharp":return ke(["js","ml"],t);case"ocaml":case"sml":return ke(["ml"],t);case"fortran":return ke(["f90"],t);case"cobol":return ke(["cobol"],t);default:return ke(Ae,t)}}(s,a),l=n.split("\n"),c=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),r=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<l.length;){const e=l[h].match(i);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));r[t]?c[r[t]].range+=`${h},`:d[t]?c[d[t]].start=h:u[t]&&(c[u[t]].range+=`${c[u[t]].start}-${h-1},`),l.splice(h,1)}n=l.join("\n");const m={};return Object.entries(c).forEach((e=>{let[t,{range:n}]=e;ge()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const Le={codeBlockContainer:"codeBlockContainer_Ckt0"};function _e(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(xe());return(0,i.jsx)(t,{...n,style:s,className:(0,u.A)(n.className,Le.codeBlockContainer,v.G.common.codeBlock)})}const Be={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function we(e){let{children:t,className:n}=e;return(0,i.jsx)(_e,{as:"pre",tabIndex:0,className:(0,u.A)(Be.codeBlockStandalone,"thin-scrollbar",n),children:(0,i.jsx)("code",{className:Be.codeBlockLines,children:t})})}const Te={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Ee(e,t){const[n,a]=(0,s.useState)(),i=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{i()}),[i]),function(e,t,n){void 0===n&&(n=Te);const a=(0,o._q)(t),i=(0,o.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,i),()=>t.disconnect()}),[e,a,i])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),i())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var He=n(8181);const Me={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function Ie(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const l=a({line:t,className:(0,u.A)(n,s&&Me.codeLine)}),c=t.map(((e,t)=>(0,i.jsx)("span",{...o({token:e})},t)));return(0,i.jsxs)("span",{...l,children:[s?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("span",{className:Me.codeLineNumber}),(0,i.jsx)("span",{className:Me.codeLineContent,children:c})]}):c,(0,i.jsx)("br",{})]})}function Se(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function Ue(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const Ve={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function Re(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),l=(0,s.useRef)(void 0),c=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),i=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}s.remove(),i&&(o.removeAllRanges(),o.addRange(i)),a&&a.focus()}(t),o(!0),l.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),(0,i.jsx)("button",{type:"button","aria-label":a?(0,h.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,h.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,h.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",n,Ve.copyButton,a&&Ve.copyButtonCopied),onClick:c,children:(0,i.jsxs)("span",{className:Ve.copyButtonIcons,"aria-hidden":"true",children:[(0,i.jsx)(Se,{className:Ve.copyButtonIcon}),(0,i.jsx)(Ue,{className:Ve.copyButtonSuccessIcon})]})})}function ze(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const Oe={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function Pe(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,h.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,i.jsx)("button",{type:"button",onClick:n,className:(0,u.A)("clean-btn",t,s&&Oe.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,i.jsx)(ze,{className:Oe.wordWrapButtonIcon,"aria-hidden":"true"})})}function Ge(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:r,magicComments:d}}=(0,W.p)(),m=function(e){return e?.toLowerCase()}(c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??r),h=xe(),p=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),i=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),l=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return Ee(o,l),(0,s.useEffect)((()=>{l()}),[e,l]),(0,s.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:i}}(),f=function(e){return e?.match(je)?.groups.title??""}(a)||o,{lineClassNames:x,code:b}=ye(t,{metastring:a,language:m,magicComments:d}),g=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,i.jsxs)(_e,{as:"div",className:(0,u.A)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`),children:[f&&(0,i.jsx)("div",{className:Be.codeBlockTitle,children:f}),(0,i.jsxs)("div",{className:Be.codeBlockContent,children:[(0,i.jsx)(He.f4,{theme:h,code:b,language:m??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,i.jsx)("pre",{tabIndex:0,ref:p.codeBlockRef,className:(0,u.A)(t,Be.codeBlock,"thin-scrollbar"),style:n,children:(0,i.jsx)("code",{className:(0,u.A)(Be.codeBlockLines,g&&Be.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,i.jsx)(Ie,{line:e,getLineProps:a,getTokenProps:o,classNames:x[t],showLineNumbers:g},t)))})})}}),(0,i.jsxs)("div",{className:Be.buttonGroup,children:[(p.isEnabled||p.isCodeScrollable)&&(0,i.jsx)(Pe,{className:Be.codeButton,onClick:()=>p.toggle(),isEnabled:p.isEnabled}),(0,i.jsx)(Re,{className:Be.codeButton,code:b})]})]})]})}function De(e){let{children:t,...n}=e;const a=(0,pe.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof o?Ge:we;return(0,i.jsx)(l,{...n,children:o},String(a))}function We(e){return(0,i.jsx)("code",{...e})}var $e=n(5066),Fe=n(3427);const qe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ze(e){return!!e&&("SUMMARY"===e.tagName||Ze(e.parentElement))}function Je(e,t){return!!e&&(e===t||Je(e.parentElement,t))}function Ye(e){let{summary:t,children:n,...a}=e;(0,Fe.A)().collectAnchor(a.id);const o=(0,pe.A)(),l=(0,s.useRef)(null),{collapsed:c,setCollapsed:r}=(0,D.u)({initialState:!a.open}),[d,u]=(0,s.useState)(a.open),m=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...a,ref:l,open:d,"data-collapsed":c,className:(0,$e.A)(qe.details,o&&qe.isBrowser,a.className),onMouseDown:e=>{Ze(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ze(t)&&Je(t,l.current)&&(e.preventDefault(),c?(r(!1),u(!0)):r(!0))},children:[m,(0,i.jsx)(D.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{r(e),u(!e)},children:(0,i.jsx)("div",{className:qe.collapsibleContent,children:n})})]})}const Ke={details:"details_b_Ee"},Qe="alert alert--info";function Xe(e){let{...t}=e;return(0,i.jsx)(Ye,{...t,className:(0,u.A)(Qe,Ke.details,t.className)})}function et(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==n))});return(0,i.jsx)(Xe,{...e,summary:n,children:a})}function tt(e){return(0,i.jsx)(ue.A,{...e})}const nt={containsTaskList:"containsTaskList_mC6p"};function st(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&nt.containsTaskList)}const at={img:"img_ev3q"};function ot(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),o=n?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}const it={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function lt(e){let{type:t,className:n,children:s}=e;return(0,i.jsx)("div",{className:(0,u.A)(v.G.common.admonition,v.G.common.admonitionType(t),it.admonition,n),children:s})}function ct(e){let{icon:t,title:n}=e;return(0,i.jsxs)("div",{className:it.admonitionHeading,children:[(0,i.jsx)("span",{className:it.admonitionIcon,children:t}),n]})}function rt(e){let{children:t}=e;return t?(0,i.jsx)("div",{className:it.admonitionContent,children:t}):null}function dt(e){const{type:t,icon:n,title:s,children:a,className:o}=e;return(0,i.jsxs)(lt,{type:t,className:o,children:[s||n?(0,i.jsx)(ct,{title:s,icon:n}):null,(0,i.jsx)(rt,{children:a})]})}function ut(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const mt={icon:(0,i.jsx)(ut,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function ht(e){return(0,i.jsx)(dt,{...mt,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function pt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const ft={icon:(0,i.jsx)(pt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function xt(e){return(0,i.jsx)(dt,{...ft,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function bt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const gt={icon:(0,i.jsx)(bt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function jt(e){return(0,i.jsx)(dt,{...gt,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function vt(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const Nt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Ct(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const At={icon:(0,i.jsx)(Ct,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const kt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const yt={...{note:ht,tip:xt,info:jt,warning:function(e){return(0,i.jsx)(dt,{...Nt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(dt,{...At,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(ht,{title:"secondary",...e}),important:e=>(0,i.jsx)(jt,{title:"important",...e}),success:e=>(0,i.jsx)(xt,{title:"success",...e}),caution:function(e){return(0,i.jsx)(dt,{...kt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function Lt(e){const t=ot(e),n=(s=t.type,yt[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),yt.info));var s;return(0,i.jsx)(n,{...t})}const _t={Head:he.A,details:et,Details:et,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,i.jsx)(We,{...e}):(0,i.jsx)(De,{...e})},a:function(e){return(0,i.jsx)(p.A,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:st(e.className)})},li:function(e){return(0,Fe.A)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,u.A)(t,at.img))});var t},h1:e=>(0,i.jsx)(tt,{as:"h1",...e}),h2:e=>(0,i.jsx)(tt,{as:"h2",...e}),h3:e=>(0,i.jsx)(tt,{as:"h3",...e}),h4:e=>(0,i.jsx)(tt,{as:"h4",...e}),h5:e=>(0,i.jsx)(tt,{as:"h5",...e}),h6:e=>(0,i.jsx)(tt,{as:"h6",...e}),admonition:Lt,mermaid:()=>null};function Bt(e){let{children:t}=e;return(0,i.jsx)(me.x,{components:_t,children:t})}function wt(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(ue.A,{as:"h1",children:n})}),(0,i.jsx)(Bt,{children:t})]})}var Tt=n(1754),Et=n(9169),Ht=n(6025);function Mt(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const It={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function St(){const e=(0,Ht.Ay)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(Mt,{className:It.breadcrumbHomeIcon})})})}const Ut={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Vt(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function Rt(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function zt(){const e=(0,Tt.OF)(),t=(0,Et.Dt)();return e?(0,i.jsx)("nav",{className:(0,u.A)(v.G.docs.docBreadcrumbs,Ut.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(St,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)(Rt,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(Vt,{href:a,isLast:s,children:t.label})},n)}))]})}):null}function Ot(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function Pt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Gt(){return(0,i.jsx)(he.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Dt(e){let{className:t}=e;return(0,i.jsx)(Lt,{type:"caution",title:(0,i.jsx)(Ot,{}),className:(0,u.A)(t,v.G.common.unlistedBanner),children:(0,i.jsx)(Pt,{})})}function Wt(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Gt,{}),(0,i.jsx)(Dt,{...e})]})}const $t={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function Ft(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(oe,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(de,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&$t.docItemCol),children:[s&&(0,i.jsx)(Wt,{}),(0,i.jsx)(_,{}),(0,i.jsxs)("div",{className:$t.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(zt,{}),(0,i.jsx)(B,{}),n.mobile,(0,i.jsx)(wt,{children:t}),(0,i.jsx)(G,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function qt(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.e3,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(Ft,{children:(0,i.jsx)(n,{})})]})})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/19dd4331.92fe643f.js b/assets/js/19dd4331.27596e02.js similarity index 97% rename from assets/js/19dd4331.92fe643f.js rename to assets/js/19dd4331.27596e02.js index bb23db4dd..413eaff0b 100644 --- a/assets/js/19dd4331.92fe643f.js +++ b/assets/js/19dd4331.27596e02.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4126],{5624:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=t(4848),r=t(8453);const i={},o="updateAgent",a={id:"api/agents/update",title:"updateAgent",description:"Updates an existing Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/update.md",sourceDirName:"api/agents",slug:"/api/agents/update",permalink:"/docs/1.x.x/api/agents/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"},next:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"}},c={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updateagent",children:"updateAgent"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/agents/ag3f77f6\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4126],{3723:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=t(4848),r=t(8453);const i={},o="updateAgent",a={id:"api/agents/update",title:"updateAgent",description:"Updates an existing Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/update.md",sourceDirName:"api/agents",slug:"/api/agents/update",permalink:"/docs/1.x.x/api/agents/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"},next:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"}},c={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updateagent",children:"updateAgent"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/agents/ag3f77f6\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n "name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a1a9e3d.1234f680.js b/assets/js/1a1a9e3d.1234f680.js new file mode 100644 index 000000000..e9641d6a4 --- /dev/null +++ b/assets/js/1a1a9e3d.1234f680.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8512],{215:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Intercom System with Routr and Kubernetes",u={id:"tutorials/intercom-system-with-routr-and-kubernetes",title:"Intercom System with Routr and Kubernetes",description:"Coming soon.",source:"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",sourceDirName:"tutorials",slug:"/tutorials/intercom-system-with-routr-and-kubernetes",permalink:"/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",tags:[],version:"current",frontMatter:{}},c={},a=[];function m(t){const e={h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"intercom-system-with-routr-and-kubernetes",children:"Intercom System with Routr and Kubernetes"}),"\n",(0,r.jsx)(e.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(m,{...t})}):m(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>u});var r=n(6540);const o={},s=r.createContext(o);function i(t){const e=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),r.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a1a9e3d.25a9d97e.js b/assets/js/1a1a9e3d.25a9d97e.js deleted file mode 100644 index 502a91d6e..000000000 --- a/assets/js/1a1a9e3d.25a9d97e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8512],{332:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Intercom System with Routr and Kubernetes",u={id:"tutorials/intercom-system-with-routr-and-kubernetes",title:"Intercom System with Routr and Kubernetes",description:"Coming soon.",source:"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",sourceDirName:"tutorials",slug:"/tutorials/intercom-system-with-routr-and-kubernetes",permalink:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",tags:[],version:"current",frontMatter:{}},c={},a=[];function m(t){const e={h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"intercom-system-with-routr-and-kubernetes",children:"Intercom System with Routr and Kubernetes"}),"\n",(0,r.jsx)(e.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(m,{...t})}):m(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>u});var r=n(6540);const o={},s=r.createContext(o);function i(t){const e=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),r.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.9432810d.js b/assets/js/1a4e3797.9432810d.js deleted file mode 100644 index 06badd98a..000000000 --- a/assets/js/1a4e3797.9432810d.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.9432810d.js.LICENSE.txt */ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(o=s.slice()).length,u=0;u<a;u++)o[u].apply(this,c);return!0},t.prototype.addListener=function(e,s){var a;if(!r(s))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(s.listener)?s.listener:s),this._events[e]?n(this._events[e])?this._events[e].push(s):this._events[e]=[this._events[e],s]:this._events[e]=s,n(this._events[e])&&!this._events[e].warned&&(a=i(this._maxListeners)?t.defaultMaxListeners:this._maxListeners)&&a>0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var n=r(6571),i=r(3371),s=r(7691);function a(e,t,r,i){return new n(e,t,r,i)}a.version=r(6938),a.AlgoliaSearchHelper=n,a.SearchParameters=i,a.SearchResults=s,e.exports=a},6732:(e,t,r)=>{"use strict";var n=r(2733);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(3014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},1673:(e,t,r)=>{"use strict";var n=r(9110),i=r(317),s=r(1383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},3371:(e,t,r)=>{"use strict";var n=r(9110),i=r(849),s=r(4843),a=r(4728),c=r(317),u=r(1383),o=r(7507),h=r(2208),f=r(1673);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=o(r),u=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m<f;){var d=l&&Array.isArray(l.data)?l.data:[];l=i(d,(function(e){return e.isRefined})),m++}}if(l){var p=Object.keys(h.data).map((function(e){return[e,h.data[e]]})).filter((function(e){return function(e,t,r,n,i,s){if(i&&(0!==e.indexOf(i)||i===e))return!1;return!i&&-1===e.indexOf(n)||i&&e.split(n).length-i.split(n).length==1||-1===e.indexOf(n)&&-1===r.indexOf(n)||0===r.indexOf(e)||0===e.indexOf(t+n)&&(s||0===e.indexOf(r))}(e[0],l.path||r,s,t,r,n)}));l.data=a(p.map((function(e){var r=e[0];return function(e,t,r,n,i){var s=t.split(r);return{name:s[s.length-1].trim(),path:t,escapedValue:c(t),count:e,isRefined:n===t||0===n.indexOf(t+r),exhaustive:i,data:null}}(e[1],r,t,u(s),h.exhaustive)})),e[0],e[1])}return o}}(m,h,f,l,o),v=t;return f&&(v=t.slice(f.split(h).length)),v.reduce(p,{name:e.hierarchicalFacets[r].name,count:null,isRefined:!0,path:null,escapedValue:null,exhaustive:d,data:null})}};var n=r(2909),i=r(849),s=r(7577),a=r(8601),c=n.escapeFacetValue,u=n.unescapeFacetValue},7691:(e,t,r)=>{"use strict";var n=r(8965),i=r(9110),s=r(2909),a=r(849),c=r(3917),u=r(7577),o=r(4728),h=r(8601),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var s=t[0];this._rawResults=t;var u=this;Object.keys(s).forEach((function(e){u[e]=s[e]}));var h=o({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){u[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),v=d(e.facets),g=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],o=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=g[t],u.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=v[t],u.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=g[t];var d=s.facets&&s.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!u.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=v[t];u.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,u=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,a=t.sortRemainingBy;return"hidden"===a?r:(s="alpha"===a?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=u(s.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),u=a(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},6571:(e,t,r)=>{"use strict";var n=r(2733),i=r(6732),s=r(2909).escapeFacetValue,a=r(3014),c=r(4728),u=r(317),o=r(1383),h=r(9228),f=r(3371),l=r(7691),m=r(6938);function d(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var i=r||{};i.index=t,this.state=f.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._searchResultsOptions=n}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}a(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):a?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t<this._lastQueryIdReceived)){this._currentNbQueries-=t-this._lastQueryIdReceived,this._lastQueryIdReceived=t,0===this._currentNbQueries&&this.emit("searchQueueEmpty");var i=r.results.slice();e.forEach((function(e){var t=e.state,r=e.queriesCount,s=e.helper,a=i.splice(0,r);t.index?(s.lastResults=new l(t,a,n._searchResultsOptions),s.emit("result",{results:s.lastResults,state:t})):s.emit("result",{results:null,state:t})}))}},d.prototype._dispatchAlgoliaError=function(e,t){e<this._lastQueryIdReceived||(this._currentNbQueries-=e-this._lastQueryIdReceived,this._lastQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbQueries&&this.emit("searchQueueEmpty"))},d.prototype.containsRefinement=function(e,t,r,n){return e||0!==t.length||0!==r.length||0!==n.length},d.prototype._hasDisjunctiveRefinements=function(e){return this.state.disjunctiveRefinements[e]&&this.state.disjunctiveRefinements[e].length>0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r<e.length;r++)if(t(e[r]))return e[r]}},3917:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r<e.length;r++)if(t(e[r]))return r;return-1}},7577:(e,t,r)=>{"use strict";var n=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n<i;n++){var s=arguments[n];t(s)&&r(e,s)}return e}},317:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e<t||s&&r||!i)return-1}return 0}e.exports=function(e,r,n){if(!Array.isArray(e))return[];Array.isArray(n)||(n=[]);var i=e.map((function(e,t){return{criteria:r.map((function(t){return e[t]})),index:t,value:e}}));return i.sort((function(e,r){for(var i=-1;++i<e.criteria.length;){var s=t(e.criteria[i],r.criteria[i]);if(s)return i>=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var n=r(4728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var u=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),a.length>0&&(u.numericFilters=a),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),u=s._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),a.length>0&&(o.facetFilters=a),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(u=f.split(h).length-1,s=f):(u=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=o.attributes[u]}else u=s.split(h).length-1,a=o.attributes[u];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),u))}};e.exports=s},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},6938:e=>{"use strict";e.exports="3.16.3"},3643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){e(r,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))}))}return r}function n(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function a(e){var t,r="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},s=function(){return JSON.parse(n().getItem(r)||"{}")},a=function(e){n().setItem(r,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,r=s(),n=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==i(e,2)[1].timestamp})));if(a(n),t){var c=Object.fromEntries(Object.entries(n).filter((function(e){var r=i(e,2)[1],n=(new Date).getTime();return!(r.timestamp+t<n)})));a(c)}};return{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var i=0;return e.replace(/%s/g,(function(){return encodeURIComponent(r[i++])}))}var l={WithinQueryParameters:0,WithinHeaders:1};function m(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((function(e){-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:u,method:o,url:_(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function x(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function _(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var A=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},N=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,u=n(s,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:D}}).searchForFacetValues(a,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},D=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},I=1,k=2,q=3;function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return I>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.22.1","-").concat(e)}),u()]}),userAgent:x("4.22.1").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return A(r(r(r({},s),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:N,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:D,findAnswers:Q}})}}}}))}return V.version="4.22.1",V}()},2672:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>T});var n=r(6540);function i(e){var t,r,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(r=i(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}const s=function(){for(var e,t,r=0,n="",s=arguments.length;r<s;r++)(e=arguments[r])&&(t=i(e))&&(n&&(n+=" "),n+=t);return n};var a=r(4103),c=r.n(a),u=r(3643),o=r.n(u),h=r(8193),f=r(5260),l=r(8774),m=r(4070),d=r(4586);const p=["zero","one","two","few","many","other"];function v(e){return p.filter((t=>e.includes(t)))}const g={locale:"en",pluralForms:v(["one","other"]),select:e=>1===e?"one":"other"};function y(){const{i18n:{currentLocale:e}}=(0,d.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:v(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),g}}),[e])}function R(){const e=y();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}var F=r(4255),b=r(9532),j=r(9024),P=r(481),x=r(1312),_=r(8126),E=r(1062),O=r(9201),w=r(1107);const A={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var N=r(4848);function H(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,N.jsx)("div",{className:s("col","col--3","padding-left--none",A.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,N.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:A.searchVersionInput,children:i.versions.map(((e,t)=>(0,N.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function S(){const{i18n:{currentLocale:e}}=(0,d.A)(),{algolia:{appId:t,apiKey:r,indexName:i}}=(0,_.c)(),a=(0,E.C)(),u=function(){const{selectMessage:e}=R();return t=>e(t,(0,x.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),p=function(){const e=(0,m.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,g]=(0,F.b)(),y={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[j,S]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return y;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),y),T=o()(t,r),Q=c()(T,i,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});Q.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void S({type:"reset"});const c=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>c(r[e].value)));return{title:i.pop(),url:a(t),summary:n.content?`${c(n.content.value)}...`:"",breadcrumbs:i}}));S({type:"update",value:{items:u,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[C,D]=(0,n.useState)(null),I=(0,n.useRef)(0),k=(0,n.useRef)(h.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&I.current>r&&S({type:"advance"}),I.current=r}),{threshold:1})),q=()=>v?(0,x.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,x.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),V=(0,b._q)((function(t){void 0===t&&(t=0),Q.addDisjunctiveFacetRefinement("docusaurus_tag","default"),Q.addDisjunctiveFacetRefinement("language",e),Object.entries(p.searchVersions).forEach((e=>{let[t,r]=e;Q.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),Q.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!C)return;const e=k.current;return e?(e.observe(C),()=>e.unobserve(C)):()=>!0}),[C]),(0,n.useEffect)((()=>{S({type:"reset"}),v&&(S({type:"loading"}),setTimeout((()=>{V()}),300))}),[v,p.searchVersions,V]),(0,n.useEffect)((()=>{j.lastPage&&0!==j.lastPage&&V(j.lastPage)}),[V,j.lastPage]),(0,N.jsxs)(O.A,{children:[(0,N.jsxs)(f.A,{children:[(0,N.jsx)("title",{children:(0,P.s)(q())}),(0,N.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,N.jsxs)("div",{className:"container margin-vert--lg",children:[(0,N.jsx)(w.A,{as:"h1",children:q()}),(0,N.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,N.jsx)("div",{className:s("col",A.searchQueryColumn,{"col--9":p.versioningEnabled,"col--12":!p.versioningEnabled}),children:(0,N.jsx)("input",{type:"search",name:"q",className:A.searchQueryInput,placeholder:(0,x.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,x.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>g(e.target.value),value:v,autoComplete:"off",autoFocus:!0})}),p.versioningEnabled&&(0,N.jsx)(H,{docsSearchVersionsHelpers:p})]}),(0,N.jsxs)("div",{className:"row",children:[(0,N.jsx)("div",{className:s("col","col--8",A.searchResultsColumn),children:!!j.totalResults&&u(j.totalResults)}),(0,N.jsx)("div",{className:s("col","col--4","text--right",A.searchLogoColumn),children:(0,N.jsx)(l.A,{to:"https://www.algolia.com/","aria-label":(0,x.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,N.jsx)("svg",{viewBox:"0 0 168 24",className:A.algoliaLogo,children:(0,N.jsxs)("g",{fill:"none",children:[(0,N.jsx)("path",{className:A.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,N.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,N.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),j.items.length>0?(0,N.jsx)("main",{children:j.items.map(((e,t)=>{let{title:r,url:n,summary:i,breadcrumbs:a}=e;return(0,N.jsxs)("article",{className:A.searchResultItem,children:[(0,N.jsx)(w.A,{as:"h2",className:A.searchResultItemHeading,children:(0,N.jsx)(l.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,N.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,N.jsx)("ul",{className:s("breadcrumbs",A.searchResultItemPath),children:a.map(((e,t)=>(0,N.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),i&&(0,N.jsx)("p",{className:A.searchResultItemSummary,dangerouslySetInnerHTML:{__html:i}})]},t)}))}):[v&&!j.loading&&(0,N.jsx)("p",{children:(0,N.jsx)(x.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!j.loading&&(0,N.jsx)("div",{className:A.loadingSpinner},"spinner")],j.hasMore&&(0,N.jsx)("div",{className:A.loader,ref:D,children:(0,N.jsx)(x.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function T(){return(0,N.jsx)(j.e3,{className:"search-page-wrapper",children:(0,N.jsx)(S,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.9432810d.js.LICENSE.txt b/assets/js/1a4e3797.9432810d.js.LICENSE.txt deleted file mode 100644 index 9caab8b19..000000000 --- a/assets/js/1a4e3797.9432810d.js.LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -/*! algoliasearch-lite.umd.js | 4.22.1 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1a4e3797.eb7bfe21.js b/assets/js/1a4e3797.eb7bfe21.js new file mode 100644 index 000000000..f24cca445 --- /dev/null +++ b/assets/js/1a4e3797.eb7bfe21.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.eb7bfe21.js.LICENSE.txt */ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2138],{2733:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o<a;o++)u[o].apply(this,c);return!0},t.prototype.addListener=function(e,s){var a;if(!r(s))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(s.listener)?s.listener:s),this._events[e]?n(this._events[e])?this._events[e].push(s):this._events[e]=[this._events[e],s]:this._events[e]=s,n(this._events[e])&&!this._events[e].warned&&(a=i(this._maxListeners)?t.defaultMaxListeners:this._maxListeners)&&a>0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},4103:(e,t,r)=>{"use strict";var n=r(6571),i=r(9127),s=r(2223),a=r(3371),c=r(7691);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(6938),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},6732:(e,t,r)=>{"use strict";var n=r(2733);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(3014)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},9127:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e});return delete r.$$id,r}))}},e.exports=t},2223:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},1673:(e,t,r)=>{"use strict";var n=r(9110),i=r(317),s=r(1383),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},3371:(e,t,r)=>{"use strict";var n=r(9110),i=r(849),s=r(4843),a=r(4728),c=r(317),o=r(1383),u=r(7507),h=r(2208),f=r(1673);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6673:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m<f;){var d=l&&Array.isArray(l.data)?l.data:[];l=i(d,(function(e){return e.isRefined})),m++}}if(l){var p=Object.keys(h.data).map((function(e){return[e,h.data[e]]})).filter((function(e){return function(e,t,r,n,i,s){if(i&&(0!==e.indexOf(i)||i===e))return!1;return!i&&-1===e.indexOf(n)||i&&e.split(n).length-i.split(n).length==1||-1===e.indexOf(n)&&-1===r.indexOf(n)||0===r.indexOf(e)||0===e.indexOf(t+n)&&(s||0===e.indexOf(r))}(e[0],l.path||r,s,t,r,n)}));l.data=a(p.map((function(e){var r=e[0];return function(e,t,r,n,i){var s=t.split(r);return{name:s[s.length-1].trim(),path:t,escapedValue:c(t),count:e,isRefined:n===t||0===n.indexOf(t+r),exhaustive:i,data:null}}(e[1],r,t,o(s),h.exhaustive)})),e[0],e[1])}return u}}(m,h,f,l,u),g=t;return f&&(g=t.slice(f.split(h).length)),g.reduce(p,{name:e.hierarchicalFacets[r].name,count:null,isRefined:!0,path:null,escapedValue:null,exhaustive:d,data:null})}};var n=r(2909),i=r(849),s=r(7577),a=r(8601),c=n.escapeFacetValue,o=n.unescapeFacetValue},7691:(e,t,r)=>{"use strict";var n=r(8965),i=r(9110),s=r(2909),a=r(849),c=r(3917),o=r(7577),u=r(4728),h=r(8601),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(6673);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=v[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=g[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=g[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var n,s=i({},t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=i.indexOf(t)>-1;a||void 0===s[t]?a||n.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,g.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=g},6571:(e,t,r)=>{"use strict";var n=r(2733),i=r(6732),s=r(2909).escapeFacetValue,a=r(3014),c=r(4728),o=r(317),u=r(1383),h=r(9127),f=r(2223),l=r(9228),m=r(3371),d=r(7691),p=r(7749),g=r(6938);function v(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,n),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},v.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t<this._lastQueryIdReceived)){this._currentNbQueries-=t-this._lastQueryIdReceived,this._lastQueryIdReceived=t,0===this._currentNbQueries&&this.emit("searchQueueEmpty");var i=r.results.slice();e.forEach((function(e){var t=e.state,r=e.queriesCount,s=e.helper,a=i.splice(0,r);t.index?(s.lastResults=new d(t,a,n._searchResultsOptions),s.emit("result",{results:s.lastResults,state:t})):s.emit("result",{results:null,state:t})}))}},v.prototype._dispatchRecommendResponse=function(e,t,r,n){if(!(e<this._lastRecommendQueryIdReceived)){this._currentNbRecommendQueries-=e-this._lastRecommendQueryIdReceived,this._lastRecommendQueryIdReceived=e,0===this._currentNbRecommendQueries&&this.emit("recommendQueueEmpty");var i=this._recommendCache,s={};r.filter((function(e){return void 0===i[e]})).forEach((function(e,t){s[e]||(s[e]=[]),s[e].push(t)})),Object.keys(s).forEach((function(e){var t=s[e],r=n.results[t[0]];1!==t.length?i[e]=Object.assign({},r,{hits:p(t.map((function(e){return n.results[e].hits})))}):i[e]=r}));var a={};r.forEach((function(e){a[e]=i[e]})),t.forEach((function(e){var t=e.state,r=e.helper;e.index?(r.lastRecommendResults=new f(t,a),r.emit("recommend:result",{recommend:{results:r.lastRecommendResults,state:t}})):r.emit("recommend:result",{results:null,state:t})}))}},v.prototype._dispatchAlgoliaError=function(e,t){e<this._lastQueryIdReceived||(this._currentNbQueries-=e-this._lastQueryIdReceived,this._lastQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbQueries&&this.emit("searchQueueEmpty"))},v.prototype._dispatchRecommendError=function(e,t){e<this._lastRecommendQueryIdReceived||(this._currentNbRecommendQueries-=e-this._lastRecommendQueryIdReceived,this._lastRecommendQueryIdReceived=e,this.emit("error",{error:t}),0===this._currentNbRecommendQueries&&this.emit("recommendQueueEmpty"))},v.prototype.containsRefinement=function(e,t,r,n){return e||0!==t.length||0!==r.length||0!==n.length},v.prototype._hasDisjunctiveRefinements=function(e){return this.state.disjunctiveRefinements[e]&&this.state.disjunctiveRefinements[e].length>0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},8965:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},9110:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},2909:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},849:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r<e.length;r++)if(t(e[r]))return e[r]}},3917:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r<e.length;r++)if(t(e[r]))return r;return-1}},8657:e=>{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},7577:(e,t,r)=>{"use strict";var n=r(849);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3014:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},4843:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},4728:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n<i;n++){var s=arguments[n];t(s)&&r(e,s)}return e}},317:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1383:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}},8601:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e<t||s&&r||!i)return-1}return 0}e.exports=function(e,r,n){if(!Array.isArray(e))return[];Array.isArray(n)||(n=[]);var i=e.map((function(e,t){return{criteria:r.map((function(t){return e[t]})),index:t,value:e}}));return i.sort((function(e,r){for(var i=-1;++i<e.criteria.length;){var s=t(e.criteria[i],r.criteria[i]);if(s)return i>=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},7507:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},9228:(e,t,r)=>{"use strict";var n=r(4728);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},2208:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},7749:(e,t,r)=>{"use strict";var n=r(849),i=r(8657);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},6938:e=>{"use strict";e.exports="3.22.1"},3643:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){e(r,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))}))}return r}function n(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function a(e){var t,r="algoliasearch-client-js-".concat(e.key),n=function(){return void 0===t&&(t=e.localStorage||window.localStorage),t},s=function(){return JSON.parse(n().getItem(r)||"{}")},a=function(e){n().setItem(r,JSON.stringify(e))},c=function(){var t=e.timeToLive?1e3*e.timeToLive:null,r=s(),n=Object.fromEntries(Object.entries(r).filter((function(e){return void 0!==i(e,2)[1].timestamp})));if(a(n),t){var c=Object.fromEntries(Object.entries(n).filter((function(e){var r=i(e,2)[1],n=(new Date).getTime();return!(r.timestamp+t<n)})));a(c)}};return{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var i=0;return e.replace(/%s/g,(function(){return encodeURIComponent(r[i++])}))}var l={WithinQueryParameters:0,WithinHeaders:1};function m(e,t){var r=e||{},n=r.data||{};return Object.keys(r).forEach((function(e){-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,g=2,v=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===v&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function _(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?v:g))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function P(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},N=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},T=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},H=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return N(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.23.3","-").concat(e)}),o()]}),userAgent:P("4.23.3").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:T,searchForFacetValues:H,multipleQueries:T,multipleSearchForFacetValues:H,customRequest:A,initIndex:function(e){return function(t){return N(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}},getRecommendations:L}}))}return V.version="4.23.3",V}()},2672:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>H});var n=r(6540);function i(e){var t,r,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(r=i(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}const s=function(){for(var e,t,r=0,n="",s=arguments.length;r<s;r++)(e=arguments[r])&&(t=i(e))&&(n&&(n+=" "),n+=t);return n};var a=r(4103),c=r.n(a),o=r(3643),u=r.n(o),h=r(8193),f=r(5260),l=r(8774),m=r(4070),d=r(4586);const p=["zero","one","two","few","many","other"];function g(e){return p.filter((t=>e.includes(t)))}const v={locale:"en",pluralForms:g(["one","other"]),select:e=>1===e?"one":"other"};function y(){const{i18n:{currentLocale:e}}=(0,d.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:g(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),v}}),[e])}function R(){const e=y();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}var F=r(4255),b=r(9532),j=r(9024),_=r(481),P=r(1312),x=r(8126),E=r(1062),O=r(9201),w=r(1107);const S={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};var A=r(4848);function N(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,A.jsx)("div",{className:s("col","col--3","padding-left--none",S.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,A.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:S.searchVersionInput,children:i.versions.map(((e,t)=>(0,A.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function T(){const{i18n:{currentLocale:e}}=(0,d.A)(),{algolia:{appId:t,apiKey:r,indexName:i,contextualSearch:a}}=(0,x.c)(),o=(0,E.C)(),p=function(){const{selectMessage:e}=R();return t=>e(t,(0,P.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),g=function(){const e=(0,m.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,y]=(0,F.b)(),j={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[T,H]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return j;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),j),Q=a?["language","docusaurus_tag"]:[],C=u()(t,r),I=c()(C,i,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:Q});I.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void H({type:"reset"});const a=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),c=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>a(r[e].value)));return{title:i.pop(),url:o(t),summary:n.content?`${a(n.content.value)}...`:"",breadcrumbs:i}}));H({type:"update",value:{items:c,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[D,k]=(0,n.useState)(null),q=(0,n.useRef)(0),L=(0,n.useRef)(h.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&q.current>r&&H({type:"advance"}),q.current=r}),{threshold:1})),V=()=>v?(0,P.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,P.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),B=(0,b._q)((function(t){void 0===t&&(t=0),a&&(I.addDisjunctiveFacetRefinement("docusaurus_tag","default"),I.addDisjunctiveFacetRefinement("language",e),Object.entries(g.searchVersions).forEach((e=>{let[t,r]=e;I.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)}))),I.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!D)return;const e=L.current;return e?(e.observe(D),()=>e.unobserve(D)):()=>!0}),[D]),(0,n.useEffect)((()=>{H({type:"reset"}),v&&(H({type:"loading"}),setTimeout((()=>{B()}),300))}),[v,g.searchVersions,B]),(0,n.useEffect)((()=>{T.lastPage&&0!==T.lastPage&&B(T.lastPage)}),[B,T.lastPage]),(0,A.jsxs)(O.A,{children:[(0,A.jsxs)(f.A,{children:[(0,A.jsx)("title",{children:(0,_.s)(V())}),(0,A.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,A.jsxs)("div",{className:"container margin-vert--lg",children:[(0,A.jsx)(w.A,{as:"h1",children:V()}),(0,A.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,A.jsx)("div",{className:s("col",S.searchQueryColumn,{"col--9":g.versioningEnabled,"col--12":!g.versioningEnabled}),children:(0,A.jsx)("input",{type:"search",name:"q",className:S.searchQueryInput,placeholder:(0,P.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,P.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>y(e.target.value),value:v,autoComplete:"off",autoFocus:!0})}),a&&g.versioningEnabled&&(0,A.jsx)(N,{docsSearchVersionsHelpers:g})]}),(0,A.jsxs)("div",{className:"row",children:[(0,A.jsx)("div",{className:s("col","col--8",S.searchResultsColumn),children:!!T.totalResults&&p(T.totalResults)}),(0,A.jsx)("div",{className:s("col","col--4","text--right",S.searchLogoColumn),children:(0,A.jsx)(l.A,{to:"https://www.algolia.com/","aria-label":(0,P.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,A.jsx)("svg",{viewBox:"0 0 168 24",className:S.algoliaLogo,children:(0,A.jsxs)("g",{fill:"none",children:[(0,A.jsx)("path",{className:S.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,A.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,A.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),T.items.length>0?(0,A.jsx)("main",{children:T.items.map(((e,t)=>{let{title:r,url:n,summary:i,breadcrumbs:a}=e;return(0,A.jsxs)("article",{className:S.searchResultItem,children:[(0,A.jsx)(w.A,{as:"h2",className:S.searchResultItemHeading,children:(0,A.jsx)(l.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,A.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,A.jsx)("ul",{className:s("breadcrumbs",S.searchResultItemPath),children:a.map(((e,t)=>(0,A.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),i&&(0,A.jsx)("p",{className:S.searchResultItemSummary,dangerouslySetInnerHTML:{__html:i}})]},t)}))}):[v&&!T.loading&&(0,A.jsx)("p",{children:(0,A.jsx)(P.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!T.loading&&(0,A.jsx)("div",{className:S.loadingSpinner},"spinner")],T.hasMore&&(0,A.jsx)("div",{className:S.loader,ref:k,children:(0,A.jsx)(P.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function H(){return(0,A.jsx)(j.e3,{className:"search-page-wrapper",children:(0,A.jsx)(T,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.eb7bfe21.js.LICENSE.txt b/assets/js/1a4e3797.eb7bfe21.js.LICENSE.txt new file mode 100644 index 000000000..92dc1757f --- /dev/null +++ b/assets/js/1a4e3797.eb7bfe21.js.LICENSE.txt @@ -0,0 +1 @@ +/*! algoliasearch-lite.umd.js | 4.23.3 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1a5391ac.f630e9df.js b/assets/js/1a5391ac.f630e9df.js new file mode 100644 index 000000000..6d90e400d --- /dev/null +++ b/assets/js/1a5391ac.f630e9df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9795],{3113:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=s(4848),r=s(8453);const i={},d="APIServer",c={id:"development/components/apiserver",title:"APIServer",description:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.",source:"@site/versioned_docs/version-2.0.0/development/components/apiserver.md",sourceDirName:"development/components",slug:"/development/components/apiserver",permalink:"/docs/2.0.0/development/components/apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/apiserver.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"},next:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"}},o={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the APIServer",id:"launching-the-apiserver",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"apiserver",children:"APIServer"}),"\n",(0,t.jsx)(n.p,{children:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC."}),"\n",(0,t.jsxs)(n.p,{children:["The APIServer has two implementations: the ",(0,t.jsx)(n.code,{children:"pgdata"})," for persistent data storage in a PostgreSQL database and the ",(0,t.jsx)(n.code,{children:"simpledata"})," for storing data in files. The ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation is intended for testing and small deployments."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has several advantages over the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation. The first advantage is that the ",(0,t.jsx)(n.code,{children:"pgdata"})," allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the ",(0,t.jsx)(n.code,{children:"extended"})," attribute, enabling you to store additional data in the database in JSON format\u2014more on this in later sections."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Data Migration"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation uses ",(0,t.jsx)(n.a,{href:"https://www.prisma.io/",children:"Prisma"})," to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DATABASE_URL"})," - The URL of the PostgreSQL database. Example: ",(0,t.jsx)(n.code,{children:"postgresql://postgres:postgres@localhost:5432/routr"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EXTERNAL_SERVER_BIND_ADDR"})," - The address where the APIServer will listen for HTTP requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51908"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TLS_ON"})," - Enables TLS for the gRPC server. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"VERIFY_CLIENT_CERT"})," - Enables client certificate verification. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CACERT"})," - The path to the CA certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/ca.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SERVER_CERT"})," - The path to the server certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/server.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164"})," - Enables E164 validation for Numbers. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164_WITH_MOBILE_PREFIX"})," - Enables E164 validation for Numbers with mobile prefixes. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For details about connecting to the ",(0,t.jsx)(n.code,{children:"pgdata"})," to manage the data, see the ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"CTL"})," and ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"SDK"})," documentation."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"simpledata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PATH_TO_RESOURCES"})," - The path to the directory where the data will be stored. Example: ",(0,t.jsx)(n.code,{children:"/etc/routr/resources"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components."}),"\n",(0,t.jsx)(n.p,{children:"In your resources directory, you will find the following files:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"agents.yaml"})," - A list of Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"domains.yaml"})," - A list of Domains to which Agents belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"trunks.yaml"})," - Represents the list of Trunks"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"numbers.yaml"})," - A list of Numbers to which Trunks belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"peers.yaml"})," - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"credentials.yaml"})," - A list of Credentials for Peers and Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"acl.yaml"})," - The list of ACLs"]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["You may also provide a ",(0,t.jsx)(n.code,{children:".json"})," file instead of a ",(0,t.jsx)(n.code,{children:".yaml"})," file."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The Agents configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.domainRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.privacy"})}),(0,t.jsxs)(n.td,{children:["The privacy settings of the Agent (",(0,t.jsx)(n.code,{children:"Private"})," or ",(0,t.jsx)(n.code,{children:"None"}),")"]}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.enabled"})}),(0,t.jsx)(n.td,{children:"The enabled status of the Agent (reserved for future use)"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an Agents configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"agents.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n privacy: Private\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Agent ",(0,t.jsx)(n.code,{children:"agent-01"})," has the username ",(0,t.jsx)(n.code,{children:"1001"}),", belongs to the Domain ",(0,t.jsx)(n.code,{children:"domain-01"}),", and uses the Credentials ",(0,t.jsx)(n.code,{children:"credentials-01"}),". Both the Domain and the Credentials are required for the Agent to work."]}),"\n",(0,t.jsx)(n.p,{children:"The Domains configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.domainUri"})}),(0,t.jsx)(n.td,{children:"The domain URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies"})}),(0,t.jsx)(n.td,{children:"The list of egress policies"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].rule"})}),(0,t.jsx)(n.td,{children:"The regular expression to match the number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].numberRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Domains configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"domains.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Domain ",(0,t.jsx)(n.code,{children:"domain-01"})," has the Domain URI ",(0,t.jsx)(n.code,{children:"sip.local"})," and the egress policy ",(0,t.jsx)(n.code,{children:".*"})," that matches all numbers. The egress policy is associated with the Number ",(0,t.jsx)(n.code,{children:"number-01"}),". The Number ",(0,t.jsx)(n.code,{children:"number-01"})," is required for the Domain to work."]}),"\n",(0,t.jsx)(n.p,{children:"Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.city"})}),(0,t.jsx)(n.td,{children:"The city where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.country"})}),(0,t.jsx)(n.td,{children:"The country where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.countryISOCode"})}),(0,t.jsx)(n.td,{children:"The ISO code of the country"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.trunkRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.telUrl"})}),(0,t.jsx)(n.td,{children:"The tel URL of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.aorLink"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"})}),(0,t.jsx)(n.td,{children:"The session affinity header of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders"})}),(0,t.jsx)(n.td,{children:"The extra headers of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders[*].name"})}),(0,t.jsx)(n.td,{children:"The name of the extra header"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Tthe ' tel: ' scheme is required when setting the ",(0,t.jsx)(n.code,{children:"spec.location.telUrl"})," property. For example, ",(0,t.jsx)(n.code,{children:"tel:+17066041487"}),". Here, ",(0,t.jsx)(n.code,{children:"tel:"})," indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider."]}),"\n",(0,t.jsxs)(n.p,{children:["Another important property is the ",(0,t.jsx)(n.code,{children:"spec.location.aorLink"}),". The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"}),' tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the ',(0,t.jsx)(n.code,{children:"X-Room-Id"})," header to identify the session. The Location Service will use the header's value to identify the session."]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Numbers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"numbers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(706)604-1487"\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+17066041487\n aorLink: sip:conference@sip.local\n sessionAffinityHeader: X-Room-Id\n extraHeaders:\n - name: X-Room-Id\n value: jsa-shqm-iyo\n'})}),"\n",(0,t.jsx)(n.p,{children:"Numbers must be associated with a Trunk to work."}),"\n",(0,t.jsx)(n.p,{children:"The Trunks configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.region"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.uri"})}),(0,t.jsx)(n.td,{children:"The inbound URI of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.accessControlListRef"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.sendRegister"})}),(0,t.jsx)(n.td,{children:"Enables outbound registration"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris"})}),(0,t.jsx)(n.td,{children:"The list of outbound URIs"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].uri"})}),(0,t.jsx)(n.td,{children:"The outbound URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].priority"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].weight"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].enabled"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].transport"})}),(0,t.jsx)(n.td,{children:"The transport of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].user"})}),(0,t.jsx)(n.td,{children:"The user of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].host"})}),(0,t.jsx)(n.td,{children:"The host of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].port"})}),(0,t.jsx)(n.td,{children:"The port of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Trunks configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"trunks.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Trunk\n ref: trunk-01\n metadata:\n name: Test Trunk\n region: us-east1\n spec:\n inbound:\n uri: trunk01.acme.com\n accessControlListRef: acl-01\n outbound:\n sendRegister: true\n credentialsRef: credentials-04\n uris:\n - uri:\n user: pbx-1\n host: sip.provider.net\n port: 7060\n transport: udp\n enabled: true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.inbound"})," section, the ",(0,t.jsx)(n.code,{children:"uri"})," property helps Routr to identify the Trunk. Calls from the PSTN using the ",(0,t.jsx)(n.code,{children:"uri"})," will be routed to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," property restricts the access to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," is optional."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.outbound"})," section, the ",(0,t.jsx)(n.code,{children:"sendRegister"})," property enables registration outbound registrations while the ",(0,t.jsx)(n.code,{children:"credentialsRef"})," property for authentication with your trunk provider."]}),"\n",(0,t.jsx)(n.p,{children:"In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.aor"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})}),(0,t.jsx)(n.td,{children:"Enables session affinity"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})}),(0,t.jsx)(n.td,{children:"The load balancing algorithm"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})," property enables session affinity, and the ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})," property sets the load-balancing algorithm. The available algorithms are ",(0,t.jsx)(n.code,{children:"least-sessions"})," and ",(0,t.jsx)(n.code,{children:"round-robin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Remember that for the ",(0,t.jsx)(n.code,{children:"least-sessions"})," algorithm to work, your SIP backend includes the special header ",(0,t.jsx)(n.code,{children:"X-Session-Count"})," with the number of active sessions as part of the registration request."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Peers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"peers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Peer\n ref: peer-01\n metadata:\n name: Asterisk (Media Server)\n spec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-03\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsx)(n.p,{children:"Credentials in Routr help Agents and Peers authenticate with Routr."}),"\n",(0,t.jsx)(n.p,{children:"The Credentials configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.username"})}),(0,t.jsx)(n.td,{children:"The username of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.password"})}),(0,t.jsx)(n.td,{children:"The password of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Credentials configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"credentials.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Credentials\n ref: credentials-01\n metadata:\n name: Agent Credentials\n spec:\n credentials:\n username: "1001"\n password: "1234"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains."}),"\n",(0,t.jsx)(n.p,{children:"The ACLs configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny"})}),(0,t.jsx)(n.td,{children:"The list of deny rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny[*]"})}),(0,t.jsx)(n.td,{children:"The deny rule"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow"})}),(0,t.jsx)(n.td,{children:"The list of allow rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow[*]"})}),(0,t.jsx)(n.td,{children:"The allow rule"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an ACLs configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"acl.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: AccessControlList\n ref: acl-01\n metadata:\n name: Europe ACL\n spec:\n accessControlList:\n deny:\n - 0.0.0.0/1\n allow:\n - 192.168.1.3/31\n - 127.0.0.1/8\n - 10.111.221.22/31\n"})}),"\n",(0,t.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(n.p,{children:"Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc."}),"\n",(0,t.jsx)(n.p,{children:"The following protobuf defines the Agent service interface:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.connect.agents.v2beta1;\n\n// The Agents service definition\nservice Agents {\n // Creates a new Agent\n rpc Create (CreateAgentRequest) returns (Agent) {}\n // Updates an existing Agent\n rpc Update (UpdateAgentRequest) returns (Agent) {}\n // Gets an existing Agent\n rpc Get (GetAgentRequest) returns (Agent) {}\n // Deletes an existing Agent\n rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}\n // Lists all Agents\n rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}\n // Find Agents by field name and value\n rpc FindBy (FindByRequest) returns (FindByResponse) {}\n}\n\nenum Privacy {\n PRIVATE = 0;\n NONE = 1;\n}\n\n// The message for the Agent resource\nmessage Agent {\n // The API version of the Agent\n string api_version = 1;\n // The unique identifier of the Agent\n string ref = 2;\n // The name of the Agent\n string name = 3;\n // The username of the Agent\n string username = 4;\n // The password of the Agent\n Privacy privacy = 5;\n // The enabled status of the Agent\n bool enabled = 6;\n // The created_at timestamp of the Agent\n int32 created_at = 7;\n // The updated_at timestamp of the Agent\n int32 updated_at = 8;\n // The domain of the Agent\n fonoster.routr.connect.domains.v2beta1.Domain domain = 9;\n // The credentials of the Agent\n fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 11; \n}\n\n// The request message for the Agents.Create method\nmessage CreateAgentRequest {\n // The name of the Agent\n string name = 1;\n // The username of the Agent\n string username = 2;\n // The password of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7; \n}\n\n// The request message for the Agents.Update method\nmessage UpdateAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n // The name of the Agent\n string name = 2;\n // The privacy settings of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7;\n}\n\n// The request message for the Agents.Get method\nmessage GetAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.Delete method\nmessage DeleteAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.FindBy method\nmessage FindByRequest {\n // The field name to search\n string field_name = 1;\n // The value to search\n string field_value = 2;\n}\n\n// The response message for the Agents.FindBy method\nmessage FindByResponse {\n // The list of Agents\n repeated Agent items = 1;\n} \n\n// The request message for the Agents.List method\nmessage ListAgentsRequest {\n // The maximum number of items in the list\n int32 page_size = 1;\n\n // The next_page_token value returned from the previous request, if any\n string page_token = 2;\n}\n\n// The response message for the Agents.List method\nmessage ListAgentsResponse {\n // List of Agents\n repeated Agent items = 1;\n\n // Token to retrieve the next page of results or empty if there are no more results in the list\n string next_page_token = 2;\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["To see the complete protobuf spec, please visit the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"protobuf directory."})]}),"\n",(0,t.jsx)(n.h2,{id:"launching-the-apiserver",children:"Launching the APIServer"}),"\n",(0,t.jsxs)(n.p,{children:["Both implementations are available as Docker images from Docker Hub as ",(0,t.jsx)(n.code,{children:"fonoster/routr-pgdata"})," and ",(0,t.jsx)(n.code,{children:"fonoster/routr-simpledata"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run -it \\\n -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \\\n -p 51907:51907 \\\n -p 51908:51908 \\\n fonoster/routr-pgdata\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The port ",(0,t.jsx)(n.code,{children:"51907"})," is used for internal communication, and the port ",(0,t.jsx)(n.code,{children:"51908"})," is used for external communication. The CTL and SDK use the external port to manage the data."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -v /path/to/resources:/etc/routr/resources \\\n -p 51907:51907 \\\n fonoster/routr-simpledata\n"})}),"\n",(0,t.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,t.jsxs)(n.p,{children:["One easy way to interact with the APIServer for testing and development is to use ",(0,t.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Agents service within the APIServer:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto agents.proto -d '{...}' \\\n localhost:51907 \\\n fonoster.routr.connect.agents.v2beta1.Agents/Get\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Please remember that the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation does not accept write operations."]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>c});var t=s(6540);const r={},i=t.createContext(r);function d(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ad9bfe0.169bd2e0.js b/assets/js/1ad9bfe0.169bd2e0.js new file mode 100644 index 000000000..0cf8ca1cb --- /dev/null +++ b/assets/js/1ad9bfe0.169bd2e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3383],{9760:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var n=o(4848),r=o(8453);const c={},s="Orchestration with Docker",i={id:"development/orchestration-with-docker",title:"Orchestration with Docker",description:"Coming soon.",source:"@site/docs/development/orchestration-with-docker.md",sourceDirName:"development",slug:"/development/orchestration-with-docker",permalink:"/docs/2.11.5/development/orchestration-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-docker.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function h(t){const e={h1:"h1",p:"p",...(0,r.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"orchestration-with-docker",children:"Orchestration with Docker"}),"\n",(0,n.jsx)(e.p,{children:"Coming soon."})]})}function u(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>s,x:()=>i});var n=o(6540);const r={},c=n.createContext(r);function s(t){const e=n.useContext(c);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),n.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ad9bfe0.ba73e09d.js b/assets/js/1ad9bfe0.ba73e09d.js deleted file mode 100644 index fe5065bef..000000000 --- a/assets/js/1ad9bfe0.ba73e09d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3383],{6807:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var n=o(4848),r=o(8453);const c={},s="Orchestration with Docker",i={id:"development/orchestration-with-docker",title:"Orchestration with Docker",description:"Coming soon.",source:"@site/docs/development/orchestration-with-docker.md",sourceDirName:"development",slug:"/development/orchestration-with-docker",permalink:"/docs/2.0.0/development/orchestration-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-docker.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function h(t){const e={h1:"h1",p:"p",...(0,r.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"orchestration-with-docker",children:"Orchestration with Docker"}),"\n",(0,n.jsx)(e.p,{children:"Coming soon."})]})}function u(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>s,x:()=>i});var n=o(6540);const r={},c=n.createContext(r);function s(t){const e=n.useContext(c);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),n.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b166456.afa392b3.js b/assets/js/1b166456.4275854e.js similarity index 97% rename from assets/js/1b166456.afa392b3.js rename to assets/js/1b166456.4275854e.js index bf05d0a67..5eed1992f 100644 --- a/assets/js/1b166456.afa392b3.js +++ b/assets/js/1b166456.4275854e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[208],{9778:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(4848),r=s(8453);const o={},i="getServerInfo",a={id:"api/sys/info",title:"getServerInfo",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/sys/info.md",sourceDirName:"api/sys",slug:"/api/sys/info",permalink:"/docs/1.x.x/api/sys/info",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/info.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"},next:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},c={},d=[];function l(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"getserverinfo",children:"getServerInfo"}),"\n",(0,t.jsx)(n.p,{children:"This method returns information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/system/info"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method returns relevant information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/system/info\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":{\n "version":"v1.0",\n "apiVersion":"v1beta1",\n "apiPath":"/api/v1beta1",\n "env":[\n {\n "var":"EXTERN_ADDR",\n "value":"172.220.246.46"\n },\n {\n "var":"LOCALNETS",\n "value": "192.168.1.149/31"\n },\n {\n "var":"REGISTRAR_INTF",\n "value": "External"\n }\n ]\n }\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[208],{7499:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(4848),r=s(8453);const o={},i="getServerInfo",a={id:"api/sys/info",title:"getServerInfo",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/sys/info.md",sourceDirName:"api/sys",slug:"/api/sys/info",permalink:"/docs/1.x.x/api/sys/info",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/info.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"},next:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},c={},d=[];function l(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"getserverinfo",children:"getServerInfo"}),"\n",(0,t.jsx)(n.p,{children:"This method returns information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/system/info"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method returns relevant information about the server."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/system/info\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":{\n "version":"v1.0",\n "apiVersion":"v1beta1",\n "apiPath":"/api/v1beta1",\n "env":[\n {\n "var":"EXTERN_ADDR",\n "value":"172.220.246.46"\n },\n {\n "var":"LOCALNETS",\n "value": "192.168.1.149/31"\n },\n {\n "var":"REGISTRAR_INTF",\n "value": "External"\n }\n ]\n }\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1b36d84b.233d8a82.js b/assets/js/1b36d84b.233d8a82.js new file mode 100644 index 000000000..ed4ac040a --- /dev/null +++ b/assets/js/1b36d84b.233d8a82.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[751],{4754:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>a});var n=o(4848),r=o(8453);const s={},c="Orchestration with Docker",i={id:"development/orchestration-with-docker",title:"Orchestration with Docker",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/development/orchestration-with-docker.md",sourceDirName:"development",slug:"/development/orchestration-with-docker",permalink:"/docs/2.0.0/development/orchestration-with-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/orchestration-with-docker.md",tags:[],version:"2.0.0",frontMatter:{}},d={},a=[];function h(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"orchestration-with-docker",children:"Orchestration with Docker"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>c,x:()=>i});var n=o(6540);const r={},s=n.createContext(r);function c(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1caae7f3.a5685f41.js b/assets/js/1caae7f3.a5685f41.js new file mode 100644 index 000000000..7af92c77f --- /dev/null +++ b/assets/js/1caae7f3.a5685f41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5188],{2214:(t,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=o(4848),e=o(8453);const s={},i="Load-balancing Asterisk with Routr",a={id:"tutorials/load-balancing-asterisk-with-routr",title:"Load-balancing Asterisk with Routr",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/tutorials/load-balancing-asterisk-with-routr.md",sourceDirName:"tutorials",slug:"/tutorials/load-balancing-asterisk-with-routr",permalink:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/tutorials/load-balancing-asterisk-with-routr.md",tags:[],version:"2.0.0",frontMatter:{}},c={},u=[];function l(t){const n={h1:"h1",p:"p",...(0,e.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"load-balancing-asterisk-with-routr",children:"Load-balancing Asterisk with Routr"}),"\n",(0,r.jsx)(n.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:n}={...(0,e.R)(),...t.components};return n?(0,r.jsx)(n,{...t,children:(0,r.jsx)(l,{...t})}):l(t)}},8453:(t,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var r=o(6540);const e={},s=r.createContext(e);function i(t){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(e):t.components||e:i(t.components),r.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/1cd31f12.a5a94d63.js b/assets/js/1cd31f12.c59917a2.js similarity index 98% rename from assets/js/1cd31f12.a5a94d63.js rename to assets/js/1cd31f12.c59917a2.js index 4bfc95b5e..8d7edb02a 100644 --- a/assets/js/1cd31f12.a5a94d63.js +++ b/assets/js/1cd31f12.c59917a2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5056],{5622:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="deleteAgent",l={id:"api/agents/delete",title:"deleteAgent",description:"Removes an Agent resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/agents/delete.md",sourceDirName:"api/agents",slug:"/api/agents/delete",permalink:"/docs/1.x.x/api/agents/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"},next:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deleteagent",children:"deleteAgent"}),"\n",(0,s.jsx)(t.p,{children:"Removes an Agent resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>l});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5056],{1597:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="deleteAgent",l={id:"api/agents/delete",title:"deleteAgent",description:"Removes an Agent resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/agents/delete.md",sourceDirName:"api/agents",slug:"/api/agents/delete",permalink:"/docs/1.x.x/api/agents/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"},next:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deleteagent",children:"deleteAgent"}),"\n",(0,s.jsx)(t.p,{children:"Removes an Agent resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>l});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1da39e10.c8be82ed.js b/assets/js/1da39e10.c8be82ed.js new file mode 100644 index 000000000..44f069de0 --- /dev/null +++ b/assets/js/1da39e10.c8be82ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6593],{3473:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>v,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var n=o(4848),r=o(8453);const i={},s="Overview",a={id:"development/alterations/overview",title:"Overview",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/development/alterations/overview.md",sourceDirName:"development/alterations",slug:"/development/alterations/overview",permalink:"/docs/2.0.0/development/alterations/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/alterations/overview.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"},next:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"}},c={},d=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function v(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var n=o(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ea220c7.919e9360.js b/assets/js/1ea220c7.65bd37b3.js similarity index 97% rename from assets/js/1ea220c7.919e9360.js rename to assets/js/1ea220c7.65bd37b3.js index e26bbaa39..ec4d21d7b 100644 --- a/assets/js/1ea220c7.919e9360.js +++ b/assets/js/1ea220c7.65bd37b3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6792],{1009:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const o={},u="Running on Kubernetes",i={id:"guides/running-on-kubernetes",title:"Running on Kubernetes",description:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.",source:"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",sourceDirName:"guides",slug:"/guides/running-on-kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"},next:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"}},c={},d=[{value:"Run in Kubernetes",id:"run-in-kubernetes",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-on-kubernetes",children:"Running on Kubernetes"}),"\n",(0,t.jsx)(n.p,{children:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes."}),"\n",(0,t.jsx)(n.h2,{id:"run-in-kubernetes",children:"Run in Kubernetes"}),"\n",(0,t.jsxs)(n.p,{children:["To run Routr in Kubernetes, you must set your EXTERN_ADDR in ",(0,t.jsx)(n.code,{children:".k8s/routr.yml"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This variable must be set to the public address(if running Routr locally, use your host address)"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Additionally, you must create the following Kubernetes resources:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create -f k8s/configmaps.yml\nkubectl create -f k8s/redis.yml\nkubectl create -f k8s/routr.yml\n"})})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>u,x:()=>i});var t=r(6540);const s={},o=t.createContext(s);function u(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:u(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6792],{9952:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const o={},u="Running on Kubernetes",i={id:"guides/running-on-kubernetes",title:"Running on Kubernetes",description:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.",source:"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",sourceDirName:"guides",slug:"/guides/running-on-kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"},next:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"}},c={},d=[{value:"Run in Kubernetes",id:"run-in-kubernetes",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-on-kubernetes",children:"Running on Kubernetes"}),"\n",(0,t.jsx)(n.p,{children:"This document is a short guide about running the dockerized version of Routr Server on Kubernetes."}),"\n",(0,t.jsx)(n.h2,{id:"run-in-kubernetes",children:"Run in Kubernetes"}),"\n",(0,t.jsxs)(n.p,{children:["To run Routr in Kubernetes, you must set your EXTERN_ADDR in ",(0,t.jsx)(n.code,{children:".k8s/routr.yml"}),"."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This variable must be set to the public address(if running Routr locally, use your host address)"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Additionally, you must create the following Kubernetes resources:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create -f k8s/configmaps.yml\nkubectl create -f k8s/redis.yml\nkubectl create -f k8s/routr.yml\n"})})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>u,x:()=>i});var t=r(6540);const s={},o=t.createContext(s);function u(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:u(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ffdd7de.43072233.js b/assets/js/1ffdd7de.43072233.js deleted file mode 100644 index 4f796393f..000000000 --- a/assets/js/1ffdd7de.43072233.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7782],{3437:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=r(4848),s=r(8453);const i={},n="FAQs",a={id:"faqs",title:"FAQs",description:"What is Routr?",source:"@site/docs/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/docs/2.0.0/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"},next:{title:"Changelog",permalink:"/docs/2.0.0/changelog"}},c={},u=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:2},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:2},{value:"Is Routr a Media Server?",id:"is-routr-a-media-server",level:2},{value:"Which language is the team using to build Routr?",id:"which-language-is-the-team-using-to-build-routr",level:2},{value:"What license does Routr use?",id:"what-license-does-routr-use",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"faqs",children:"FAQs"}),"\n",(0,o.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,o.jsx)(t.h2,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,o.jsx)(t.p,{children:"The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache."}),"\n",(0,o.jsx)(t.p,{children:"In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes."}),"\n",(0,o.jsx)(t.h2,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,o.jsx)(t.p,{children:"Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently."}),"\n",(0,o.jsx)(t.p,{children:"For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one."}),"\n",(0,o.jsx)(t.h2,{id:"is-routr-a-media-server",children:"Is Routr a Media Server?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk."}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"This is useful when you need load balancing"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"which-language-is-the-team-using-to-build-routr",children:"Which language is the team using to build Routr?"}),"\n",(0,o.jsx)(t.p,{children:"The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS."}),"\n",(0,o.jsx)(t.h2,{id:"what-license-does-routr-use",children:"What license does Routr use?"}),"\n",(0,o.jsxs)(t.p,{children:["We release Routr under the ",(0,o.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/LICENSE",children:"MIT license"}),"."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>n,x:()=>a});var o=r(6540);const s={},i=o.createContext(s);function n(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ffdd7de.a6f4c3c4.js b/assets/js/1ffdd7de.a6f4c3c4.js new file mode 100644 index 000000000..a3179697d --- /dev/null +++ b/assets/js/1ffdd7de.a6f4c3c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7782],{5888:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=r(4848),s=r(8453);const i={},n="FAQs",a={id:"faqs",title:"FAQs",description:"What is Routr?",source:"@site/docs/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/docs/2.11.5/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributing Guide",permalink:"/docs/2.11.5/contributing"},next:{title:"Changelog",permalink:"/docs/2.11.5/changelog"}},c={},u=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:2},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:2},{value:"Is Routr a Media Server?",id:"is-routr-a-media-server",level:2},{value:"Which language is the team using to build Routr?",id:"which-language-is-the-team-using-to-build-routr",level:2},{value:"What license does Routr use?",id:"what-license-does-routr-use",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"faqs",children:"FAQs"}),"\n",(0,o.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,o.jsx)(t.h2,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,o.jsx)(t.p,{children:"The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache."}),"\n",(0,o.jsx)(t.p,{children:"In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes."}),"\n",(0,o.jsx)(t.h2,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,o.jsx)(t.p,{children:"Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently."}),"\n",(0,o.jsx)(t.p,{children:"For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one."}),"\n",(0,o.jsx)(t.h2,{id:"is-routr-a-media-server",children:"Is Routr a Media Server?"}),"\n",(0,o.jsx)(t.p,{children:"Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk."}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"This is useful when you need load balancing"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"which-language-is-the-team-using-to-build-routr",children:"Which language is the team using to build Routr?"}),"\n",(0,o.jsx)(t.p,{children:"The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS."}),"\n",(0,o.jsx)(t.h2,{id:"what-license-does-routr-use",children:"What license does Routr use?"}),"\n",(0,o.jsxs)(t.p,{children:["We release Routr under the ",(0,o.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/LICENSE",children:"MIT license"}),"."]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>n,x:()=>a});var o=r(6540);const s={},i=o.createContext(s);function n(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/210b7c69.543dacd7.js b/assets/js/210b7c69.543dacd7.js new file mode 100644 index 000000000..7517a1c45 --- /dev/null +++ b/assets/js/210b7c69.543dacd7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1703],{5054:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="SimpleAuth Service",a={id:"development/components/simpleauth",title:"SimpleAuth Service",description:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.",source:"@site/docs/development/components/simpleauth.md",sourceDirName:"development/components",slug:"/development/components/simpleauth",permalink:"/docs/2.11.5/development/components/simpleauth",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/simpleauth.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"APIServer",permalink:"/docs/2.11.5/development/components/apiserver"},next:{title:"Overview",permalink:"/docs/2.11.5/development/alterations/overview"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the SimpleAuth with Docker",id:"launching-the-simpleauth-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"simpleauth-service",children:"SimpleAuth Service"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth provides the following environment variables for configuration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the service will listen for gRPC requests. Default: ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ALLOWLIST"})," - A comma-separated list of Users allowed to bypass authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"METHODS"})," - A comma-separated list of SIP methods that require authentication (e.g., ",(0,s.jsx)(n.code,{children:"INVITE, REGISTER, MESSAGE"}),"). Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"PATH_TO_AUTH"})," - The path to a file containing the credentials for the users"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of the authentication file:"}),"\n",(0,s.jsxs)(n.p,{children:["Filename ",(0,s.jsx)(n.code,{children:"auth.json"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n { \n "username": "1001", \n "secret": "1234" \n },\n { \n "username": "john",\n "secret": "1234" \n }\n]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:"The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid."}),"\n",(0,s.jsx)(n.p,{children:"The following is the protobuf definition for the SimpleAuth service:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'\n```protobuf\nsyntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-simpleauth-with-docker",children:"Launching the SimpleAuth with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The SimpleAuth is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-simpleauth",children:"Docker Hub"}),". To launch the SimpleAuth with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -p 51903:51903 \\\n -e ALLOWLIST=anonymous,1001 \\\n -e METHODS=INVITE,REGISTER,MESSAGE \\\n -e PATH_TO_AUTH=/path/to/auth.json \\\n -v /path/to/auth.json:/path/to/auth.json \\\n fonoster/routr-simpleauth\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with SimpleAuth for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the SimpleAuth."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/210b7c69.f12cb937.js b/assets/js/210b7c69.f12cb937.js deleted file mode 100644 index 4d99389dc..000000000 --- a/assets/js/210b7c69.f12cb937.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1703],{9633:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="SimpleAuth Service",a={id:"development/components/simpleauth",title:"SimpleAuth Service",description:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.",source:"@site/docs/development/components/simpleauth.md",sourceDirName:"development/components",slug:"/development/components/simpleauth",permalink:"/docs/2.0.0/development/components/simpleauth",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/simpleauth.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"},next:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the SimpleAuth with Docker",id:"launching-the-simpleauth-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"simpleauth-service",children:"SimpleAuth Service"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth provides the following environment variables for configuration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the service will listen for gRPC requests. Default: ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ALLOWLIST"})," - A comma-separated list of Users allowed to bypass authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"METHODS"})," - A comma-separated list of SIP methods that require authentication (e.g., ",(0,s.jsx)(n.code,{children:"INVITE, REGISTER, MESSAGE"}),"). Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"PATH_TO_AUTH"})," - The path to a file containing the credentials for the users"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of the authentication file:"}),"\n",(0,s.jsxs)(n.p,{children:["Filename ",(0,s.jsx)(n.code,{children:"auth.json"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n { \n "username": "1001", \n "secret": "1234" \n },\n { \n "username": "john",\n "secret": "1234" \n }\n]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:"The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid."}),"\n",(0,s.jsx)(n.p,{children:"The following is the protobuf definition for the SimpleAuth service:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'\n```protobuf\nsyntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-simpleauth-with-docker",children:"Launching the SimpleAuth with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The SimpleAuth is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-simpleauth",children:"Docker Hub"}),". To launch the SimpleAuth with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -p 51903:51903 \\\n -e ALLOWLIST=anonymous,1001 \\\n -e METHODS=INVITE,REGISTER,MESSAGE \\\n -e PATH_TO_AUTH=/path/to/auth.json \\\n -v /path/to/auth.json:/path/to/auth.json \\\n fonoster/routr-simpleauth\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with SimpleAuth for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the SimpleAuth."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21169ea0.00bc1f21.js b/assets/js/21169ea0.00bc1f21.js new file mode 100644 index 000000000..9d2b690bd --- /dev/null +++ b/assets/js/21169ea0.00bc1f21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9504],{4640:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(4848),r=n(8453);const s={},i="Orchestration with Kubernetes",c={id:"development/orchestration-with-kubernetes",title:"Orchestration with Kubernetes",description:"Coming soon.",source:"@site/docs/development/orchestration-with-kubernetes.md",sourceDirName:"development",slug:"/development/orchestration-with-kubernetes",permalink:"/docs/2.11.5/development/orchestration-with-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-kubernetes.md",tags:[],version:"current",frontMatter:{}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"orchestration-with-kubernetes",children:"Orchestration with Kubernetes"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21169ea0.41ddd5b2.js b/assets/js/21169ea0.41ddd5b2.js deleted file mode 100644 index 5e84fe411..000000000 --- a/assets/js/21169ea0.41ddd5b2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9504],{7235:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(4848),r=n(8453);const s={},i="Orchestration with Kubernetes",c={id:"development/orchestration-with-kubernetes",title:"Orchestration with Kubernetes",description:"Coming soon.",source:"@site/docs/development/orchestration-with-kubernetes.md",sourceDirName:"development",slug:"/development/orchestration-with-kubernetes",permalink:"/docs/2.0.0/development/orchestration-with-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/orchestration-with-kubernetes.md",tags:[],version:"current",frontMatter:{}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"orchestration-with-kubernetes",children:"Orchestration with Kubernetes"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/23efd64d.69bca8aa.js b/assets/js/23efd64d.8db9d4fc.js similarity index 96% rename from assets/js/23efd64d.69bca8aa.js rename to assets/js/23efd64d.8db9d4fc.js index 27fe33b57..b517fb4eb 100644 --- a/assets/js/23efd64d.69bca8aa.js +++ b/assets/js/23efd64d.8db9d4fc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7225],{2575:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>g,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const i={},s="Running with Docker",c={id:"guides/running-with-docker-or-compose",title:"Running with Docker",description:"Please refer to Docker Hub for a detail guide on how to use Routr's docker image.",source:"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",sourceDirName:"guides",slug:"/guides/running-with-docker-or-compose",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"},next:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"}},u={},d=[];function a(e){const n={a:"a",h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-with-docker",children:"Running with Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Please refer to ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/repository/docker/fonoster/routr",children:"Docker Hub"})," for a detail guide on how to use Routr's docker image."]})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var t=o(6540);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7225],{6152:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>g,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const i={},s="Running with Docker",c={id:"guides/running-with-docker-or-compose",title:"Running with Docker",description:"Please refer to Docker Hub for a detail guide on how to use Routr's docker image.",source:"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",sourceDirName:"guides",slug:"/guides/running-with-docker-or-compose",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running on Kubernetes",permalink:"/docs/1.x.x/guides/running-on-kubernetes"},next:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"}},u={},d=[];function a(e){const n={a:"a",h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"running-with-docker",children:"Running with Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Please refer to ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/repository/docker/fonoster/routr",children:"Docker Hub"})," for a detail guide on how to use Routr's docker image."]})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>c});var t=o(6540);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26da1a01.3be03227.js b/assets/js/26da1a01.3be03227.js deleted file mode 100644 index 7d3205cca..000000000 --- a/assets/js/26da1a01.3be03227.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2401],{1080:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=o(4848),s=o(8453);const r={},i="Building a SCAIP Processor",c={id:"development/building-a-scaip-processor",title:"Building a SCAIP Processor",description:"Comin soon.",source:"@site/docs/development/building-a-scaip-processor.md",sourceDirName:"development",slug:"/development/building-a-scaip-processor",permalink:"/docs/2.0.0/development/building-a-scaip-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-scaip-processor.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function u(e){const n={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"building-a-scaip-processor",children:"Building a SCAIP Processor"}),"\n",(0,t.jsx)(n.p,{children:"Comin soon."})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const s={},r=t.createContext(s);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26da1a01.46b9023b.js b/assets/js/26da1a01.46b9023b.js new file mode 100644 index 000000000..5b6ee83cc --- /dev/null +++ b/assets/js/26da1a01.46b9023b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2401],{4769:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=o(4848),s=o(8453);const r={},i="Building a SCAIP Processor",c={id:"development/building-a-scaip-processor",title:"Building a SCAIP Processor",description:"Comin soon.",source:"@site/docs/development/building-a-scaip-processor.md",sourceDirName:"development",slug:"/development/building-a-scaip-processor",permalink:"/docs/2.11.5/development/building-a-scaip-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-scaip-processor.md",tags:[],version:"current",frontMatter:{}},d={},a=[];function u(e){const n={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"building-a-scaip-processor",children:"Building a SCAIP Processor"}),"\n",(0,t.jsx)(n.p,{children:"Comin soon."})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const s={},r=t.createContext(s);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/295fe310.b9248d1a.js b/assets/js/295fe310.b9248d1a.js new file mode 100644 index 000000000..6b894b74d --- /dev/null +++ b/assets/js/295fe310.b9248d1a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[242],{1393:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>u,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Intercom System with Routr and Kubernetes",u={id:"tutorials/intercom-system-with-routr-and-kubernetes",title:"Intercom System with Routr and Kubernetes",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/tutorials/intercom-system-with-routr-and-kubernetes.md",sourceDirName:"tutorials",slug:"/tutorials/intercom-system-with-routr-and-kubernetes",permalink:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/tutorials/intercom-system-with-routr-and-kubernetes.md",tags:[],version:"2.0.0",frontMatter:{}},c={},a=[];function d(t){const e={h1:"h1",p:"p",...(0,o.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.h1,{id:"intercom-system-with-routr-and-kubernetes",children:"Intercom System with Routr and Kubernetes"}),"\n",(0,r.jsx)(e.p,{children:"Coming soon."})]})}function m(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(d,{...t})}):d(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>u});var r=n(6540);const o={},s=r.createContext(o);function i(t){const e=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),r.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a36568f.d948f060.js b/assets/js/2a36568f.d948f060.js deleted file mode 100644 index 69f95a821..000000000 --- a/assets/js/2a36568f.d948f060.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2964],{7173:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=o(4848),c=o(8453);const r={},s="Home or Office Setup",i={id:"connect/home-or-office-setup",title:"Home or Office Setup",description:"Coming soon.",source:"@site/docs/connect/home-or-office-setup.md",sourceDirName:"connect",slug:"/connect/home-or-office-setup",permalink:"/docs/2.0.0/connect/home-or-office-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/home-or-office-setup.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"},next:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"}},u={},p=[];function f(e){const t={h1:"h1",p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"home-or-office-setup",children:"Home or Office Setup"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function d(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>i});var n=o(6540);const c={},r=n.createContext(c);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a36568f.df40b923.js b/assets/js/2a36568f.df40b923.js new file mode 100644 index 000000000..744ed46af --- /dev/null +++ b/assets/js/2a36568f.df40b923.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2964],{2860:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=o(4848),c=o(8453);const r={},s="Home or Office Setup",i={id:"connect/home-or-office-setup",title:"Home or Office Setup",description:"Coming soon.",source:"@site/docs/connect/home-or-office-setup.md",sourceDirName:"connect",slug:"/connect/home-or-office-setup",permalink:"/docs/2.11.5/connect/home-or-office-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/home-or-office-setup.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SDK",permalink:"/docs/2.11.5/connect/nodesdk/sdk"},next:{title:"WebRTC Support",permalink:"/docs/2.11.5/connect/webrtc-support"}},u={},p=[];function f(e){const t={h1:"h1",p:"p",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"home-or-office-setup",children:"Home or Office Setup"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function d(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(f,{...e})}):f(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>i});var n=o(6540);const c={},r=n.createContext(c);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/321dfeeb.607289a8.js b/assets/js/321dfeeb.2c12f614.js similarity index 98% rename from assets/js/321dfeeb.607289a8.js rename to assets/js/321dfeeb.2c12f614.js index efe3b32f0..e890a23ef 100644 --- a/assets/js/321dfeeb.607289a8.js +++ b/assets/js/321dfeeb.2c12f614.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[537],{9683:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),i=n(8453);const r={},o=void 0,a={id:"api/overview",title:"overview",description:"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.",source:"@site/versioned_docs/version-1.x.x/api/overview.md",sourceDirName:"api",slug:"/api/overview",permalink:"/docs/1.x.x/api/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"},next:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"}},c={},d=[{value:"Authentication",id:"authentication",level:2},{value:"Error Responses",id:"error-responses",level:2}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Routr API version is currently ",(0,s.jsx)(t.code,{children:"v1beta1"}),". We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document."]}),"\n",(0,s.jsx)(t.p,{children:"The endpoint for the API is:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/api/{apiversion}"})}),"\n",(0,s.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,s.jsxs)(t.p,{children:["A JWT token is used to authenticate the server. To obtain the token, use the ",(0,s.jsx)(t.code,{children:"/api/{apiversion}/token"})," endpoint with basic authentication. Use the information from the ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/users",children:"User"})," resource."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:["You must append the ",(0,s.jsx)(t.code,{children:"token"})," to all requests as a query parameter."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample call"})}),"\n",(0,s.jsx)(t.p,{children:"To obtain the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token\n\n# Resulted in\n{\n "status":200,\n "message":"Successful request",\n "data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"To use the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...\n\n# Resulted in\n{ \n "status":200,\n "message":"Successful request",\n "data":[ \n { \n "addressOfRecord":"sip:1001@sip.local",\n "contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"\n }\n ]\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"error-responses",children:"Error Responses"}),"\n",(0,s.jsx)(t.p,{children:"The following are general errors we might have to account for:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Code"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Content"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"400 BAD_REQUEST"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "400", message : "Bad Request" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"401 UNAUTHORIZED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "401", message : "You are unauthorized to make this request." }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"405 NOT_SUPPORTED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "405", message : "Operation not supported by data source provider" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"409 CONFLICT"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "409", message : "An attempt was made to create an object that already exists" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"4091 UNFULFILLED_DEPENDENCY_RESPONSE"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "4091", message : "Found one or more unfulfilled dependencies" }'})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[537],{7142:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var s=n(4848),i=n(8453);const r={},o=void 0,a={id:"api/overview",title:"overview",description:"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.",source:"@site/versioned_docs/version-1.x.x/api/overview.md",sourceDirName:"api",slug:"/api/overview",permalink:"/docs/1.x.x/api/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the signaling path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path"},next:{title:"createAgent",permalink:"/docs/1.x.x/api/agents/create"}},c={},d=[{value:"Authentication",id:"authentication",level:2},{value:"Error Responses",id:"error-responses",level:2}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Routr API version is currently ",(0,s.jsx)(t.code,{children:"v1beta1"}),". We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document."]}),"\n",(0,s.jsx)(t.p,{children:"The endpoint for the API is:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/api/{apiversion}"})}),"\n",(0,s.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,s.jsxs)(t.p,{children:["A JWT token is used to authenticate the server. To obtain the token, use the ",(0,s.jsx)(t.code,{children:"/api/{apiversion}/token"})," endpoint with basic authentication. Use the information from the ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/users",children:"User"})," resource."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsxs)(t.p,{children:["You must append the ",(0,s.jsx)(t.code,{children:"token"})," to all requests as a query parameter."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample call"})}),"\n",(0,s.jsx)(t.p,{children:"To obtain the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token\n\n# Resulted in\n{\n "status":200,\n "message":"Successful request",\n "data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"To use the token"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:'curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...\n\n# Resulted in\n{ \n "status":200,\n "message":"Successful request",\n "data":[ \n { \n "addressOfRecord":"sip:1001@sip.local",\n "contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"\n }\n ]\n}\n'})}),"\n",(0,s.jsx)(t.h2,{id:"error-responses",children:"Error Responses"}),"\n",(0,s.jsx)(t.p,{children:"The following are general errors we might have to account for:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Code"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Content"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"400 BAD_REQUEST"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "400", message : "Bad Request" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"401 UNAUTHORIZED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "401", message : "You are unauthorized to make this request." }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"405 NOT_SUPPORTED"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "405", message : "Operation not supported by data source provider" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"409 CONFLICT"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "409", message : "An attempt was made to create an object that already exists" }'})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"4091 UNFULFILLED_DEPENDENCY_RESPONSE"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.code,{children:'{ status: "4091", message : "Found one or more unfulfilled dependencies" }'})})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3325c53c.2eb5404e.js b/assets/js/3325c53c.2eb5404e.js deleted file mode 100644 index 743149a7f..000000000 --- a/assets/js/3325c53c.2eb5404e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6944],{7496:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=n(4848),s=n(8453);const o={},i="Installation",l={id:"introduction/installation",title:"Installation",description:"Instant Server Installation with Snaps",source:"@site/versioned_docs/version-1.x.x/introduction/installation.md",sourceDirName:"introduction",slug:"/introduction/installation",permalink:"/docs/1.x.x/introduction/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/installation.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"},next:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"}},a={},d=[{value:"Instant Server Installation with Snaps",id:"instant-server-installation-with-snaps",level:2},{value:"DigitalOcean droplet",id:"digitalocean-droplet",level:2},{value:"Docker",id:"docker",level:2},{value:"Kubernetes",id:"kubernetes",level:2},{value:"Google Cloud Shell",id:"google-cloud-shell",level:2},{value:"Custom",id:"custom",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.h2,{id:"instant-server-installation-with-snaps",children:"Instant Server Installation with Snaps"}),"\n",(0,r.jsx)(t.p,{children:"Install Routr in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo snap install routr-server\n"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://snapcraft.io/routr-server",children:(0,r.jsx)(t.img,{src:"https://snapcraft.io/static/images/badges/en/snap-store-black.svg",alt:"Get it from the Snap Store"})})}),"\n",(0,r.jsx)(t.p,{children:"Routr Snap is recommended for Linux deployments"}),"\n",(0,r.jsx)(t.p,{children:"Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions."}),"\n",(0,r.jsx)(t.h2,{id:"digitalocean-droplet",children:"DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:"Build and Deploy to a DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.digitalocean/README.md",children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/51996/58146107-50512580-7c1a-11e9-8ec9-e032ba387c2a.png",alt:"do-btn-blue"})})}),"\n",(0,r.jsx)(t.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"/docs/1.x.x/guides/running-with-docker-or-compose",children:"Deploy with docker compose"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:(0,r.jsx)(t.img,{src:"https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png",alt:"Docker logo"})})}),"\n",(0,r.jsxs)(t.p,{children:["OR Use the automated build image of our ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:"most recent release"})]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:latest\n"})}),"\n",(0,r.jsxs)(t.p,{children:["OR select a specific release (",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases",children:"details of releases available"}),"):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:vX.X.X\n"})}),"\n",(0,r.jsx)(t.h2,{id:"kubernetes",children:"Kubernetes"}),"\n",(0,r.jsxs)(t.p,{children:["Deploy to Kubernetes in ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.k8s/README.md",children:"few easy steps"})]}),"\n",(0,r.jsx)(t.h2,{id:"google-cloud-shell",children:"Google Cloud Shell"}),"\n",(0,r.jsx)(t.p,{children:"Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/fonoster/routr-walkthrough-tutorial&tutorial=tutorial.md",children:(0,r.jsx)(t.img,{src:"https://gstatic.com/cloudssh/images/open-btn.svg",alt:"Open in Cloud Shell"})})}),"\n",(0,r.jsx)(t.h2,{id:"custom",children:"Custom"}),"\n",(0,r.jsx)(t.p,{children:"There are no special requirements to install and run the server. Just follow this easy steps:"}),"\n",(0,r.jsx)(t.p,{children:"\u278a Download the server for your platform"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Platform"}),(0,r.jsx)(t.th,{children:"Download"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Linux"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_linux-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"macOS"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_osx-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Windows"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.tar.gz",children:"tar.gz"}),", ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.zip",children:"zip"})]})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"\u278b Then extract it:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"tar xvfz routr-*.tar.gz\ncd routr-*\n"})}),"\n",(0,r.jsxs)(t.p,{children:["\u278c Run the server using the ",(0,r.jsx)(t.code,{children:"routr"})," command"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./routr\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var r=n(6540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3325c53c.e7144622.js b/assets/js/3325c53c.e7144622.js new file mode 100644 index 000000000..9095c83ee --- /dev/null +++ b/assets/js/3325c53c.e7144622.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6944],{579:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var r=n(4848),s=n(8453);const o={},i="Installation",l={id:"introduction/installation",title:"Installation",description:"Instant Server Installation with Snaps",source:"@site/versioned_docs/version-1.x.x/introduction/installation.md",sourceDirName:"introduction",slug:"/introduction/installation",permalink:"/docs/1.x.x/introduction/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/installation.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"},next:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"}},a={},d=[{value:"Instant Server Installation with Snaps",id:"instant-server-installation-with-snaps",level:2},{value:"DigitalOcean droplet",id:"digitalocean-droplet",level:2},{value:"Docker",id:"docker",level:2},{value:"Kubernetes",id:"kubernetes",level:2},{value:"Google Cloud Shell",id:"google-cloud-shell",level:2},{value:"Custom",id:"custom",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.h2,{id:"instant-server-installation-with-snaps",children:"Instant Server Installation with Snaps"}),"\n",(0,r.jsx)(t.p,{children:"Install Routr in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo snap install routr-server\n"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://snapcraft.io/routr-server",children:(0,r.jsx)(t.img,{src:"https://snapcraft.io/static/images/badges/en/snap-store-black.svg",alt:"Get it from the Snap Store"})})}),"\n",(0,r.jsx)(t.p,{children:"Routr Snap is recommended for Linux deployments"}),"\n",(0,r.jsx)(t.p,{children:"Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions."}),"\n",(0,r.jsx)(t.h2,{id:"digitalocean-droplet",children:"DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:"Build and Deploy to a DigitalOcean droplet"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.digitalocean/README.md",children:(0,r.jsx)(t.img,{src:"https://user-images.githubusercontent.com/51996/58146107-50512580-7c1a-11e9-8ec9-e032ba387c2a.png",alt:"do-btn-blue"})})}),"\n",(0,r.jsx)(t.h2,{id:"docker",children:"Docker"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"/docs/1.x.x/guides/running-with-docker-or-compose",children:"Deploy with docker compose"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:(0,r.jsx)(t.img,{src:"https://d207aa93qlcgug.cloudfront.net/1.95.5.qa/img/nav/docker-logo-loggedout.png",alt:"Docker logo"})})}),"\n",(0,r.jsxs)(t.p,{children:["OR Use the automated build image of our ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr/",children:"most recent release"})]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:latest\n"})}),"\n",(0,r.jsxs)(t.p,{children:["OR select a specific release (",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases",children:"details of releases available"}),"):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"docker pull fonoster/routr:vX.X.X\n"})}),"\n",(0,r.jsx)(t.h2,{id:"kubernetes",children:"Kubernetes"}),"\n",(0,r.jsxs)(t.p,{children:["Deploy to Kubernetes in ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/tree/master/.k8s/README.md",children:"few easy steps"})]}),"\n",(0,r.jsx)(t.h2,{id:"google-cloud-shell",children:"Google Cloud Shell"}),"\n",(0,r.jsx)(t.p,{children:"Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/fonoster/routr-walkthrough-tutorial&tutorial=tutorial.md",children:(0,r.jsx)(t.img,{src:"https://gstatic.com/cloudssh/images/open-btn.svg",alt:"Open in Cloud Shell"})})}),"\n",(0,r.jsx)(t.h2,{id:"custom",children:"Custom"}),"\n",(0,r.jsx)(t.p,{children:"There are no special requirements to install and run the server. Just follow this easy steps:"}),"\n",(0,r.jsx)(t.p,{children:"\u278a Download the server for your platform"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Platform"}),(0,r.jsx)(t.th,{children:"Download"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Linux"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_linux-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"macOS"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_osx-x64_bin.tar.gz",children:"tar.gz"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Windows"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.tar.gz",children:"tar.gz"}),", ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/releases/download/1.2.7/routr-1.2.7_windows-x64_bin.zip",children:"zip"})]})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"\u278b Then extract it:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"tar xvfz routr-*.tar.gz\ncd routr-*\n"})}),"\n",(0,r.jsxs)(t.p,{children:["\u278c Run the server using the ",(0,r.jsx)(t.code,{children:"routr"})," command"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./routr\n"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var r=n(6540);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/335fd65a.fc634c6a.js b/assets/js/335fd65a.fc634c6a.js new file mode 100644 index 000000000..270325a74 --- /dev/null +++ b/assets/js/335fd65a.fc634c6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3452],{6e3:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="SimpleAuth Service",a={id:"development/components/simpleauth",title:"SimpleAuth Service",description:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.",source:"@site/versioned_docs/version-2.0.0/development/components/simpleauth.md",sourceDirName:"development/components",slug:"/development/components/simpleauth",permalink:"/docs/2.0.0/development/components/simpleauth",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/simpleauth.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"},next:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the SimpleAuth with Docker",id:"launching-the-simpleauth-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"simpleauth-service",children:"SimpleAuth Service"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"The SimpleAuth provides the following environment variables for configuration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the service will listen for gRPC requests. Default: ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ALLOWLIST"})," - A comma-separated list of Users allowed to bypass authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"METHODS"})," - A comma-separated list of SIP methods that require authentication (e.g., ",(0,s.jsx)(n.code,{children:"INVITE, REGISTER, MESSAGE"}),"). Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"PATH_TO_AUTH"})," - The path to a file containing the credentials for the users"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Example of the authentication file:"}),"\n",(0,s.jsxs)(n.p,{children:["Filename ",(0,s.jsx)(n.code,{children:"auth.json"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'[\n { \n "username": "1001", \n "secret": "1234" \n },\n { \n "username": "john",\n "secret": "1234" \n }\n]\n'})}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:"The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid."}),"\n",(0,s.jsx)(n.p,{children:"The following is the protobuf definition for the SimpleAuth service:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'\n```protobuf\nsyntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-simpleauth-with-docker",children:"Launching the SimpleAuth with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The SimpleAuth is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-simpleauth",children:"Docker Hub"}),". To launch the SimpleAuth with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -p 51903:51903 \\\n -e ALLOWLIST=anonymous,1001 \\\n -e METHODS=INVITE,REGISTER,MESSAGE \\\n -e PATH_TO_AUTH=/path/to/auth.json \\\n -v /path/to/auth.json:/path/to/auth.json \\\n fonoster/routr-simpleauth\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with SimpleAuth for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the SimpleAuth."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33664cb1.cc1e07c5.js b/assets/js/33664cb1.cc1e07c5.js new file mode 100644 index 000000000..6f39db7f1 --- /dev/null +++ b/assets/js/33664cb1.cc1e07c5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9953],{7904:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=s(4848),r=s(8453);const o={},d="EdgePort",i={id:"development/components/edgeport",title:"EdgePort",description:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.",source:"@site/docs/development/components/edgeport.md",sourceDirName:"development/components",slug:"/development/components/edgeport",permalink:"/docs/2.11.5/development/components/edgeport",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/edgeport.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.11.5/development/components/overview"},next:{title:"Message Dispatcher",permalink:"/docs/2.11.5/development/components/dispatcher"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the EdgePort with Docker",id:"launching-the-edgeport-with-docker",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"edgeport",children:"EdgePort"}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop."}),"\n",(0,n.jsx)(t.p,{children:"The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502SIP request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC request \u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC response\u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502SIP response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,n.jsx)(t.p,{children:"While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware."}),"\n",(0,n.jsx)(t.p,{children:"For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher."}),"\n",(0,n.jsx)(t.p,{children:"If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster."}),"\n",(0,n.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,n.jsx)(t.p,{children:"To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"ref"})}),(0,n.jsx)(t.td,{children:"Reference to the EdgePort"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"metadata.region"})}),(0,n.jsx)(t.td,{children:"Region where the EdgePort is located (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.unknownMethodAction"})}),(0,n.jsx)(t.td,{children:"What to do if an incoming request type is not allowed (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport"})}),(0,n.jsx)(t.td,{children:"Enabled Transport Protocols"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].protocol"})}),(0,n.jsx)(t.td,{children:"Transport protocol"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].port"})}),(0,n.jsx)(t.td,{children:"Port to listen on"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.methods"})}),(0,n.jsx)(t.td,{children:"Acceptable SIP Methods"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor"})}),(0,n.jsx)(t.td,{children:"Adjacent service for message routing"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor.addr"})}),(0,n.jsx)(t.td,{children:"Address of the adjacent service"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.localnets"})}),(0,n.jsx)(t.td,{children:"Networks considered to be in the same local network"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.externalAddrs"})}),(0,n.jsx)(t.td,{children:"EdgePort external ip addresses"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext"})}),(0,n.jsx)(t.td,{children:"Security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client"})}),(0,n.jsx)(t.td,{children:"Client security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.protocols"})}),(0,n.jsx)(t.td,{children:"TLS protocols used by the client (e.g., SSLv3, TLSv1.2)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.authType"})}),(0,n.jsx)(t.td,{children:"Client authentication type (e.g., Disabled, DisabledAll, Required, Wanted)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStore"})}),(0,n.jsx)(t.td,{children:"Path to the key store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStore"})}),(0,n.jsx)(t.td,{children:"Path to the trust store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the key store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the trust store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStoreType"})}),(0,n.jsx)(t.td,{children:"Type of the key store (e.g., pkcs12)"}),(0,n.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["The security context is required if the EdgePort is configured to use a secure protocol such as ",(0,n.jsx)(t.code,{children:"TLS"})," or ",(0,n.jsx)(t.code,{children:"WSS"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["Please see JAINSIP docs for details on the security context ",(0,n.jsx)(t.a,{href:"https://javadoc.io/doc/javax.sip/jain-sip-ri/1.2.220/gov/nist/javax/sip/SipStackImpl.html",children:"properties."})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Here is an example of a configuration file:"}),"\n",(0,n.jsxs)(t.p,{children:["Filename: ",(0,n.jsx)(t.code,{children:"dispatcher.yaml"})," or ",(0,n.jsx)(t.code,{children:"dispatcher.json"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'kind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n unknownMethodAction: Discard\n processor:\n addr: dispatcher:51901 \n securityContext:\n client:\n protocols:\n - SSLv3\n - TLSv1.2\n authType: DisabledAll\n keyStorePassword: changeme\n trustStorePassword: changeme\n keyStore: "/etc/routr/certs/signaling.p12"\n trustStore: "/etc/routr/certs/signaling.p12"\n keyStoreType: pkcs12\n externalAddrs:\n - 10.111.220.2\n - sip01.edgeport.net\n localnets:\n - 127.0.0.1/8\n - 10.111.221.2/24\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n - protocol: tls\n port: 5061\n - protocol: ws \n port: 5062\n - protocol: wss\n port: 5063\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort requires the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," field to function properly in NATed environments like Docker. When provided, the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Environment Variables"})}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"PROCESSOR_ADDR"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"spec.processor.addr"})," property"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"HOSTNAME"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"ref"})," property. If running in K8s, ",(0,n.jsx)(t.code,{children:"ref"})," will be set to the pod's hostname."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"IGNORE_LOOPBACK_FROM_LOCALNETS"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will ignore the loopback address from the ",(0,n.jsx)(t.code,{children:"localnets"})," property. In Docker deployments, this is set to ",(0,n.jsx)(t.code,{children:"true"})," by default."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"CONSOLE_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the NATS publisher."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_SUBJECT"})," - Overwrites the default subject the NATS publisher uses. The default subject is ",(0,n.jsx)(t.code,{children:"routr"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_URL"})," - This is required if ",(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," is set to ",(0,n.jsx)(t.code,{children:"true"}),". It should contain the NATS server URL. For example: ",(0,n.jsx)(t.code,{children:"nats://nats:4222"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,n.jsx)(t.p,{children:"While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Link to the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,n.jsx)(t.h2,{id:"launching-the-edgeport-with-docker",children:"Launching the EdgePort with Docker"}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort is available as a Docker image from ",(0,n.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-edgeport",children:"Docker Hub"}),". To launch the EdgePort with Docker, you can use the following command:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port ",(0,n.jsx)(t.code,{children:"5060"})," for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port ",(0,n.jsx)(t.code,{children:"5061"})," for TLS traffic, you must add the following flag to the ",(0,n.jsx)(t.code,{children:"docker run"})," command: ",(0,n.jsx)(t.code,{children:"-p 5061:5061"}),"."]})]})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>i});var n=s(6540);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33664cb1.e1df95ca.js b/assets/js/33664cb1.e1df95ca.js deleted file mode 100644 index f846c0a5b..000000000 --- a/assets/js/33664cb1.e1df95ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9953],{4987:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=s(4848),r=s(8453);const o={},d="EdgePort",i={id:"development/components/edgeport",title:"EdgePort",description:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.",source:"@site/docs/development/components/edgeport.md",sourceDirName:"development/components",slug:"/development/components/edgeport",permalink:"/docs/2.0.0/development/components/edgeport",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/edgeport.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"},next:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the EdgePort with Docker",id:"launching-the-edgeport-with-docker",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"edgeport",children:"EdgePort"}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop."}),"\n",(0,n.jsx)(t.p,{children:"The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502SIP request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC request \u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC response\u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502SIP response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,n.jsx)(t.p,{children:"While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware."}),"\n",(0,n.jsx)(t.p,{children:"For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher."}),"\n",(0,n.jsx)(t.p,{children:"If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster."}),"\n",(0,n.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,n.jsx)(t.p,{children:"To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"ref"})}),(0,n.jsx)(t.td,{children:"Reference to the EdgePort"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"metadata.region"})}),(0,n.jsx)(t.td,{children:"Region where the EdgePort is located (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.unknownMethodAction"})}),(0,n.jsx)(t.td,{children:"What to do if an incoming request type is not allowed (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport"})}),(0,n.jsx)(t.td,{children:"Enabled Transport Protocols"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].protocol"})}),(0,n.jsx)(t.td,{children:"Transport protocol"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].port"})}),(0,n.jsx)(t.td,{children:"Port to listen on"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.methods"})}),(0,n.jsx)(t.td,{children:"Acceptable SIP Methods"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor"})}),(0,n.jsx)(t.td,{children:"Adjacent service for message routing"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor.addr"})}),(0,n.jsx)(t.td,{children:"Address of the adjacent service"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.localnets"})}),(0,n.jsx)(t.td,{children:"Networks considered to be in the same local network"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.externalAddrs"})}),(0,n.jsx)(t.td,{children:"EdgePort external ip addresses"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext"})}),(0,n.jsx)(t.td,{children:"Security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client"})}),(0,n.jsx)(t.td,{children:"Client security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.protocols"})}),(0,n.jsx)(t.td,{children:"TLS protocols used by the client (e.g., SSLv3, TLSv1.2)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.authType"})}),(0,n.jsx)(t.td,{children:"Client authentication type (e.g., Disabled, DisabledAll, Required, Wanted)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStore"})}),(0,n.jsx)(t.td,{children:"Path to the key store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStore"})}),(0,n.jsx)(t.td,{children:"Path to the trust store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the key store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the trust store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStoreType"})}),(0,n.jsx)(t.td,{children:"Type of the key store (e.g., pkcs12)"}),(0,n.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["The security context is required if the EdgePort is configured to use a secure protocol such as ",(0,n.jsx)(t.code,{children:"TLS"})," or ",(0,n.jsx)(t.code,{children:"WSS"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["Please see JAINSIP docs for details on the security context ",(0,n.jsx)(t.a,{href:"https://javadoc.io/doc/javax.sip/jain-sip-ri/1.2.220/gov/nist/javax/sip/SipStackImpl.html",children:"properties."})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Here is an example of a configuration file:"}),"\n",(0,n.jsxs)(t.p,{children:["Filename: ",(0,n.jsx)(t.code,{children:"dispatcher.yaml"})," or ",(0,n.jsx)(t.code,{children:"dispatcher.json"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'kind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n unknownMethodAction: Discard\n processor:\n addr: dispatcher:51901 \n securityContext:\n client:\n protocols:\n - SSLv3\n - TLSv1.2\n authType: DisabledAll\n keyStorePassword: changeme\n trustStorePassword: changeme\n keyStore: "/etc/routr/certs/signaling.p12"\n trustStore: "/etc/routr/certs/signaling.p12"\n keyStoreType: pkcs12\n externalAddrs:\n - 10.111.220.2\n - sip01.edgeport.net\n localnets:\n - 127.0.0.1/8\n - 10.111.221.2/24\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n - protocol: tls\n port: 5061\n - protocol: ws \n port: 5062\n - protocol: wss\n port: 5063\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort requires the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," field to function properly in NATed environments like Docker. When provided, the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Environment Variables"})}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"PROCESSOR_ADDR"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"spec.processor.addr"})," property"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"HOSTNAME"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"ref"})," property. If running in K8s, ",(0,n.jsx)(t.code,{children:"ref"})," will be set to the pod's hostname."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"IGNORE_LOOPBACK_FROM_LOCALNETS"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will ignore the loopback address from the ",(0,n.jsx)(t.code,{children:"localnets"})," property. In Docker deployments, this is set to ",(0,n.jsx)(t.code,{children:"true"})," by default."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"CONSOLE_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the NATS publisher."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_SUBJECT"})," - Overwrites the default subject the NATS publisher uses. The default subject is ",(0,n.jsx)(t.code,{children:"routr"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_URL"})," - This is required if ",(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," is set to ",(0,n.jsx)(t.code,{children:"true"}),". It should contain the NATS server URL. For example: ",(0,n.jsx)(t.code,{children:"nats://nats:4222"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,n.jsx)(t.p,{children:"While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Link to the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,n.jsx)(t.h2,{id:"launching-the-edgeport-with-docker",children:"Launching the EdgePort with Docker"}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort is available as a Docker image from ",(0,n.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-edgeport",children:"Docker Hub"}),". To launch the EdgePort with Docker, you can use the following command:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port ",(0,n.jsx)(t.code,{children:"5060"})," for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port ",(0,n.jsx)(t.code,{children:"5061"})," for TLS traffic, you must add the following flag to the ",(0,n.jsx)(t.code,{children:"docker run"})," command: ",(0,n.jsx)(t.code,{children:"-p 5061:5061"}),"."]})]})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>i});var n=s(6540);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35bee977.4e13b84b.js b/assets/js/35bee977.4e13b84b.js deleted file mode 100644 index a7426ee60..000000000 --- a/assets/js/35bee977.4e13b84b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1304],{5644:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var s=i(4848),o=i(8453);const t={sidebar_position:2},r="Concepts",a={id:"concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},l={},c=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,s.jsx)(n.p,{children:"The following are some key concepts, including some of the essential routing strategies implemented in Routr."}),"\n",(0,s.jsx)(n.h2,{id:"intra-domain-routing",children:"Intra-Domain Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Intra-Domain Routing(IDR)"})," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."]}),"\n",(0,s.jsxs)(n.p,{children:["For a small company with less than 50 users, you may define a domain ",(0,s.jsx)(n.code,{children:"sip.domain.com"}),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."]}),"\n",(0,s.jsxs)(n.p,{children:["A multinational company like ",(0,s.jsx)(n.em,{children:"Walmart"})," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,s.jsx)(n.code,{children:"sip.0001.walmart.com"})," and ",(0,s.jsx)(n.code,{children:"sip.0002.walmart.com"}),", and... you get the idea."]}),"\n",(0,s.jsx)(n.h3,{id:"double-agents",children:"Double Agents"}),"\n",(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(n.p,{children:["Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,s.jsx)(n.code,{children:"spec.domain[*]"})," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."]}),"\n",(0,s.jsx)(n.h3,{id:"single-domain-example",children:"Single Domain Example"}),"\n",(0,s.jsx)(n.p,{children:"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsx)(n.p,{children:'Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["To configure your sip devices use the information found in ",(0,s.jsx)(n.code,{children:"config/agents.yml"}),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"The following rules apply to Intra-Domain Routing:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Agents can only call other Agents in the same Domain"}),"\n",(0,s.jsx)(n.li,{children:"Agents must belong to a Domain"}),"\n",(0,s.jsxs)(n.li,{children:["Agents Are not allowed to send a Digest username different than the username in the ",(0,s.jsx)(n.code,{children:"From-Header"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"domain-ingress-routing",children:"Domain Ingress Routing"}),"\n",(0,s.jsxs)(n.p,{children:["In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,s.jsx)(n.em,{children:"Domain Ingress Routing(DIR)"})," and it is done using a Gateway resource. The yaml file ",(0,s.jsx)(n.code,{children:"config/gateways.yml"})," contains the Gateways. The following example shows a typical Gateway configuration."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n"})}),"\n",(0,s.jsx)(n.p,{children:"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."}),"\n",(0,s.jsx)(n.p,{children:"Please examine the following example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n"})}),"\n",(0,s.jsx)(n.p,{children:'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"spec.location"})," block of a ",(0,s.jsx)(n.code,{children:"Number"})," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,s.jsx)(n.code,{children:"aorLink"})," refers to an Address of Record(Agent or Peer) that is available in the ",(0,s.jsx)(n.code,{children:"location service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"domain-egress-routing",children:"Domain Egress Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Domain Egress Routing(DER)"})," is the way that ",(0,s.jsx)(n.strong,{children:"Routr"})," deals with a call request to a ",(0,s.jsx)(n.em,{children:"callee"})," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,s.jsx)(n.em,{children:"callers'"})," Domain. The EgressPolicy consists of a ",(0,s.jsx)(n.code,{children:"rule"}),", and a ",(0,s.jsx)(n.code,{children:"numberRef"})," defined in the ",(0,s.jsx)(n.code,{children:"spec.context"})," section of ",(0,s.jsx)(n.code,{children:"Domains"})," resources."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"rule"})," and ",(0,s.jsx)(n.code,{children:"numberRef"})," is defined as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rule"})," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"numberRef"})," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["Agents can only perform outbound calls using the ",(0,s.jsx)(n.code,{children:"Egress Policy"})," of their Domains."]}),"\n",(0,s.jsx)(n.h2,{id:"peers-routing",children:"Peers Routing"}),"\n",(0,s.jsx)(n.p,{children:"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."}),"\n",(0,s.jsxs)(n.p,{children:["Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,s.jsx)(n.em,{children:"Location Service"})," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."]}),"\n",(0,s.jsxs)(n.p,{children:["The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,s.jsx)(n.code,{children:"spec.location"})," settings in the ",(0,s.jsx)(n.code,{children:"numbers.yml"})," configuration file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"Agents are not allowed to call Peers."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["A future version of the ",(0,s.jsx)(n.code,{children:"Peer resource"})," might feature a ",(0,s.jsx)(n.code,{children:"spec.acceptFrom.*"})," field to allow calls from Domains or specific Agents."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35bee977.e2deba05.js b/assets/js/35bee977.e2deba05.js new file mode 100644 index 000000000..65858d963 --- /dev/null +++ b/assets/js/35bee977.e2deba05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1304],{229:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var s=i(4848),o=i(8453);const t={sidebar_position:2},r="Concepts",a={id:"concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},l={},c=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,s.jsx)(n.p,{children:"The following are some key concepts, including some of the essential routing strategies implemented in Routr."}),"\n",(0,s.jsx)(n.h2,{id:"intra-domain-routing",children:"Intra-Domain Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Intra-Domain Routing(IDR)"})," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."]}),"\n",(0,s.jsxs)(n.p,{children:["For a small company with less than 50 users, you may define a domain ",(0,s.jsx)(n.code,{children:"sip.domain.com"}),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."]}),"\n",(0,s.jsxs)(n.p,{children:["A multinational company like ",(0,s.jsx)(n.em,{children:"Walmart"})," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,s.jsx)(n.code,{children:"sip.0001.walmart.com"})," and ",(0,s.jsx)(n.code,{children:"sip.0002.walmart.com"}),", and... you get the idea."]}),"\n",(0,s.jsx)(n.h3,{id:"double-agents",children:"Double Agents"}),"\n",(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(n.p,{children:["Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,s.jsx)(n.code,{children:"spec.domain[*]"})," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."]}),"\n",(0,s.jsx)(n.h3,{id:"single-domain-example",children:"Single Domain Example"}),"\n",(0,s.jsx)(n.p,{children:"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsx)(n.p,{children:'Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["To configure your sip devices use the information found in ",(0,s.jsx)(n.code,{children:"config/agents.yml"}),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"The following rules apply to Intra-Domain Routing:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Agents can only call other Agents in the same Domain"}),"\n",(0,s.jsx)(n.li,{children:"Agents must belong to a Domain"}),"\n",(0,s.jsxs)(n.li,{children:["Agents Are not allowed to send a Digest username different than the username in the ",(0,s.jsx)(n.code,{children:"From-Header"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"domain-ingress-routing",children:"Domain Ingress Routing"}),"\n",(0,s.jsxs)(n.p,{children:["In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,s.jsx)(n.em,{children:"Domain Ingress Routing(DIR)"})," and it is done using a Gateway resource. The yaml file ",(0,s.jsx)(n.code,{children:"config/gateways.yml"})," contains the Gateways. The following example shows a typical Gateway configuration."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n"})}),"\n",(0,s.jsx)(n.p,{children:"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."}),"\n",(0,s.jsx)(n.p,{children:"Please examine the following example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n"})}),"\n",(0,s.jsx)(n.p,{children:'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"spec.location"})," block of a ",(0,s.jsx)(n.code,{children:"Number"})," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,s.jsx)(n.code,{children:"aorLink"})," refers to an Address of Record(Agent or Peer) that is available in the ",(0,s.jsx)(n.code,{children:"location service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"domain-egress-routing",children:"Domain Egress Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Domain Egress Routing(DER)"})," is the way that ",(0,s.jsx)(n.strong,{children:"Routr"})," deals with a call request to a ",(0,s.jsx)(n.em,{children:"callee"})," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,s.jsx)(n.em,{children:"callers'"})," Domain. The EgressPolicy consists of a ",(0,s.jsx)(n.code,{children:"rule"}),", and a ",(0,s.jsx)(n.code,{children:"numberRef"})," defined in the ",(0,s.jsx)(n.code,{children:"spec.context"})," section of ",(0,s.jsx)(n.code,{children:"Domains"})," resources."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"rule"})," and ",(0,s.jsx)(n.code,{children:"numberRef"})," is defined as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rule"})," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"numberRef"})," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["Agents can only perform outbound calls using the ",(0,s.jsx)(n.code,{children:"Egress Policy"})," of their Domains."]}),"\n",(0,s.jsx)(n.h2,{id:"peers-routing",children:"Peers Routing"}),"\n",(0,s.jsx)(n.p,{children:"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."}),"\n",(0,s.jsxs)(n.p,{children:["Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,s.jsx)(n.em,{children:"Location Service"})," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."]}),"\n",(0,s.jsxs)(n.p,{children:["The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,s.jsx)(n.code,{children:"spec.location"})," settings in the ",(0,s.jsx)(n.code,{children:"numbers.yml"})," configuration file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"Agents are not allowed to call Peers."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["A future version of the ",(0,s.jsx)(n.code,{children:"Peer resource"})," might feature a ",(0,s.jsx)(n.code,{children:"spec.acceptFrom.*"})," field to allow calls from Domains or specific Agents."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/39d73575.1b5c629a.js b/assets/js/39d73575.1b5c629a.js new file mode 100644 index 000000000..d0fb8c6a5 --- /dev/null +++ b/assets/js/39d73575.1b5c629a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1780],{5352:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=o(4848),r=o(8453);const s={},i="Alteration Methods",a={id:"development/alterations/methods",title:"Alteration Methods",description:"Coming soon.",source:"@site/docs/development/alterations/methods.md",sourceDirName:"development/alterations",slug:"/development/alterations/methods",permalink:"/docs/2.11.5/development/alterations/methods",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/methods.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.11.5/development/alterations/overview"},next:{title:"Building a Processor",permalink:"/docs/2.11.5/development/building-a-processor"}},d={},c=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"alteration-methods",children:"Alteration Methods"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>a});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/39d73575.2275c69d.js b/assets/js/39d73575.2275c69d.js deleted file mode 100644 index cc777bfc3..000000000 --- a/assets/js/39d73575.2275c69d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1780],{2655:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var n=o(4848),r=o(8453);const s={},i="Alteration Methods",a={id:"development/alterations/methods",title:"Alteration Methods",description:"Coming soon.",source:"@site/docs/development/alterations/methods.md",sourceDirName:"development/alterations",slug:"/development/alterations/methods",permalink:"/docs/2.0.0/development/alterations/methods",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/methods.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"},next:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"}},d={},c=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"alteration-methods",children:"Alteration Methods"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>a});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a673d53.2766e28e.js b/assets/js/3a673d53.a733cb64.js similarity index 98% rename from assets/js/3a673d53.2766e28e.js rename to assets/js/3a673d53.a733cb64.js index 5e9043434..bb4e32adf 100644 --- a/assets/js/3a673d53.2766e28e.js +++ b/assets/js/3a673d53.a733cb64.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[831],{3202:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=o(4848),r=o(8453);const i={},a="Roadmap",s={id:"introduction/roadmap",title:"Roadmap",description:"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.",source:"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",sourceDirName:"introduction",slug:"/introduction/roadmap",permalink:"/docs/1.x.x/introduction/roadmap",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/roadmap.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/1.x.x/introduction/community"},next:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"}},c={},u=[{value:"Accounting, Authentication, and Authorization",id:"accounting-authentication-and-authorization",level:2},{value:"IM and Presence",id:"im-and-presence",level:2},{value:"Per-domain Certificate",id:"per-domain-certificate",level:2},{value:"Support the Ecosystem",id:"support-the-ecosystem",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"roadmap",children:"Roadmap"}),"\n",(0,n.jsxs)(t.p,{children:["The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr server"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"accounting-authentication-and-authorization",children:"Accounting, Authentication, and Authorization"}),"\n",(0,n.jsx)(t.p,{children:"Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events."}),"\n",(0,n.jsx)(t.h2,{id:"im-and-presence",children:"IM and Presence"}),"\n",(0,n.jsx)(t.p,{children:"We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr."}),"\n",(0,n.jsx)(t.h2,{id:"per-domain-certificate",children:"Per-domain Certificate"}),"\n",(0,n.jsx)(t.p,{children:"Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate."}),"\n",(0,n.jsx)(t.h2,{id:"support-the-ecosystem",children:"Support the Ecosystem"}),"\n",(0,n.jsxs)(t.p,{children:["We want to release a stable version of the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web UI"})," soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr."]})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[831],{8719:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=o(4848),r=o(8453);const i={},a="Roadmap",s={id:"introduction/roadmap",title:"Roadmap",description:"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.",source:"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",sourceDirName:"introduction",slug:"/introduction/roadmap",permalink:"/docs/1.x.x/introduction/roadmap",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/roadmap.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/1.x.x/introduction/community"},next:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"}},c={},u=[{value:"Accounting, Authentication, and Authorization",id:"accounting-authentication-and-authorization",level:2},{value:"IM and Presence",id:"im-and-presence",level:2},{value:"Per-domain Certificate",id:"per-domain-certificate",level:2},{value:"Support the Ecosystem",id:"support-the-ecosystem",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"roadmap",children:"Roadmap"}),"\n",(0,n.jsxs)(t.p,{children:["The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr server"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"accounting-authentication-and-authorization",children:"Accounting, Authentication, and Authorization"}),"\n",(0,n.jsx)(t.p,{children:"Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events."}),"\n",(0,n.jsx)(t.h2,{id:"im-and-presence",children:"IM and Presence"}),"\n",(0,n.jsx)(t.p,{children:"We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr."}),"\n",(0,n.jsx)(t.h2,{id:"per-domain-certificate",children:"Per-domain Certificate"}),"\n",(0,n.jsx)(t.p,{children:"Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate."}),"\n",(0,n.jsx)(t.h2,{id:"support-the-ecosystem",children:"Support the Ecosystem"}),"\n",(0,n.jsxs)(t.p,{children:["We want to release a stable version of the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web UI"})," soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr."]})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c0cfdd0.c1beae7e.js b/assets/js/3c0cfdd0.c1beae7e.js deleted file mode 100644 index 75b05f4e4..000000000 --- a/assets/js/3c0cfdd0.c1beae7e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4480],{6456:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var s=t(4848),o=t(8453);const r={sidebar_position:2},c="Installing in Kubernetes",i={id:"connect/quick-start/kubernetes",title:"Installing in Kubernetes",description:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.",source:"@site/docs/connect/quick-start/kubernetes.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/kubernetes.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"}},a={},l=[];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"installing-in-kubernetes",children:"Installing in Kubernetes"}),"\n",(0,s.jsx)(n.p,{children:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can use Minikube or Docker Desktop to create a local Kubernetes cluster."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"First, add the Helm repository:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm repo add routr https://routr.io/charts\nhelm repo update\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, create a namespace for Routr:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, install Routr with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm install sipnet routr/routr-connect --namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should see a list of pods and their status. If the status is Running, then you are ready to go."}),"\n",(0,s.jsxs)(n.p,{children:["For more details, please refer to the chart's ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md",children:"README"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"Command-Line Tools"})," section for detauls on how to interact with Routr Connect via the CLI."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3c0cfdd0.cb1b021a.js b/assets/js/3c0cfdd0.cb1b021a.js new file mode 100644 index 000000000..ac908f40d --- /dev/null +++ b/assets/js/3c0cfdd0.cb1b021a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4480],{6597:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var s=t(4848),o=t(8453);const r={sidebar_position:2},c="Installing in Kubernetes",i={id:"connect/quick-start/kubernetes",title:"Installing in Kubernetes",description:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.",source:"@site/docs/connect/quick-start/kubernetes.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/kubernetes",permalink:"/docs/2.11.5/connect/quick-start/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/kubernetes.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Docker installation",permalink:"/docs/2.11.5/connect/quick-start/docker"},next:{title:"Overview",permalink:"/docs/2.11.5/connect/command-line/overview"}},a={},l=[];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"installing-in-kubernetes",children:"Installing in Kubernetes"}),"\n",(0,s.jsx)(n.p,{children:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can use Minikube or Docker Desktop to create a local Kubernetes cluster."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"First, add the Helm repository:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm repo add routr https://routr.io/charts\nhelm repo update\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, create a namespace for Routr:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, install Routr with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm install sipnet routr/routr-connect --namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should see a list of pods and their status. If the status is Running, then you are ready to go."}),"\n",(0,s.jsxs)(n.p,{children:["For more details, please refer to the chart's ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md",children:"README"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"/docs/2.11.5/connect/command-line/overview",children:"Command-Line Tools"})," section for detauls on how to interact with Routr Connect via the CLI."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var s=t(6540);const o={},r=s.createContext(o);function c(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3d1fe28c.ba1f32b6.js b/assets/js/3d1fe28c.ba1f32b6.js new file mode 100644 index 000000000..b367604ee --- /dev/null +++ b/assets/js/3d1fe28c.ba1f32b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2918],{5448:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=n(4848),r=n(8453);const o={},d="Building a Middleware",s={id:"development/building-a-middleware",title:"Building a Middleware",description:"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.",source:"@site/versioned_docs/version-2.0.0/development/building-a-middleware.md",sourceDirName:"development",slug:"/development/building-a-middleware",permalink:"/docs/2.0.0/development/building-a-middleware",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/building-a-middleware.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"},next:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"}},a={},l=[];function c(e){const t={a:"a",h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"building-a-middleware",children:"Building a Middleware"}),"\n",(0,i.jsxs)(t.p,{children:["Building a Middleware is the same as ",(0,i.jsx)(t.a,{href:"/docs/2.0.0/development/building-a-processor",children:"building a Processor"}),". Both share the same protobuf definition. Please refer to the ",(0,i.jsx)(t.a,{href:"/docs/2.0.0/overview/concepts",children:"Concepts Overview"})," for more information on the differences between a Processor and a Middleware."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var i=n(6540);const r={},o=i.createContext(r);function d(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e7ceef0.c6e6babd.js b/assets/js/3e7ceef0.81e4d69c.js similarity index 99% rename from assets/js/3e7ceef0.c6e6babd.js rename to assets/js/3e7ceef0.81e4d69c.js index 2f0611182..bf0ef9f4f 100644 --- a/assets/js/3e7ceef0.c6e6babd.js +++ b/assets/js/3e7ceef0.81e4d69c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5613],{7156:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>c,toc:()=>o});var t=s(4848),d=s(8453);const n={},i="General",c={id:"configuration/general",title:"General",description:"The general configuration affects your entire Routr instance. The general configuration",source:"@site/versioned_docs/version-1.x.x/configuration/general.md",sourceDirName:"configuration",slug:"/configuration/general",permalink:"/docs/1.x.x/configuration/general",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/general.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"},next:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"}},l={},o=[{value:"General Configuration Parameters",id:"general-configuration-parameters",level:2},{value:"Transport Configuration",id:"transport-configuration",level:2},{value:"Datasource Providers",id:"datasource-providers",level:2},{value:"Redis Data Provider",id:"redis-data-provider",level:3},{value:"Files Data Provider",id:"files-data-provider",level:3},{value:"Configuring the server behind a NAT",id:"configuring-the-server-behind-a-nat",level:2},{value:"Access Control List",id:"access-control-list",level:2},{value:"Basic Example",id:"basic-example",level:2}];function a(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"general",children:"General"}),"\n",(0,t.jsxs)(r.p,{children:["The general configuration affects your entire Routr instance. The general configuration\ncan be provided using the file ",(0,t.jsx)(r.code,{children:"config/config.yml"})," located at the root of your Routr installation."]}),"\n",(0,t.jsx)(r.h2,{id:"general-configuration-parameters",children:"General Configuration Parameters"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"apiVersion"}),(0,t.jsx)(r.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"metadata.userAgent"}),(0,t.jsxs)(r.td,{children:["Sets sip header ",(0,t.jsx)(r.code,{children:"User-Agent"})," to the desired value"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.provider"}),(0,t.jsxs)(r.td,{children:["Defines data provider. Defaults to ",(0,t.jsx)(r.code,{children:"files_data_provider"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.parameters"}),(0,t.jsx)(r.td,{children:"Data Source Parameters. Ex.: 'host=localhost,port=6379'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.bindAddr"}),(0,t.jsx)(r.td,{children:"Default stack IP address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.externAddr"}),(0,t.jsx)(r.td,{children:"IP address to advertise"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.localnets"}),(0,t.jsx)(r.td,{children:"Local networks. Use in combination with spec.externAddr"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.recordRoute"}),(0,t.jsx)(r.td,{children:"Stay within the signaling path"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].bindAddr"}),(0,t.jsxs)(r.td,{children:["Overwrites ",(0,t.jsx)(r.code,{children:"spec.bindAddr"})," for transport entry"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].port"}),(0,t.jsx)(r.td,{children:"Transport port"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].protocol"}),(0,t.jsxs)(r.td,{children:["Valid values are: ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", ",(0,t.jsx)(r.code,{children:"wss"})]}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.registrarIntf"}),(0,t.jsxs)(r.td,{children:[(0,t.jsx)(r.code,{children:"Internal"}),' causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ',(0,t.jsx)(r.code,{children:"External"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.deny.[*]"}),(0,t.jsx)(r.td,{children:"Deny incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.allow.[*]"}),(0,t.jsx)(r.td,{children:"Allow incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.bindAddr"}),(0,t.jsx)(r.td,{children:"Restful service listening address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.port"}),(0,t.jsx)(r.td,{children:"Restful service port. Defaults to 4567"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.minThreads"}),(0,t.jsx)(r.td,{children:"Minimum thread allocation. Defaults to 8"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.maxThreads"}),(0,t.jsx)(r.td,{children:"Maximum thread allocation. Defaults to 200"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.timeOutMillis"}),(0,t.jsx)(r.td,{children:"Will reject requests that last more than this value. Defaults to 5000(5 seconds)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.unsecured"}),(0,t.jsxs)(r.td,{children:["Disabled https for restful calls. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStorePassword"}),(0,t.jsx)(r.td,{children:"Password for trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.trustStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStoreType"}),(0,t.jsx)(r.td,{children:"KeyStore type"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.authType"}),(0,t.jsxs)(r.td,{children:["Type of client authentication. Defaults to ",(0,t.jsx)(r.code,{children:"DisabledAll"}),". See ",(0,t.jsx)(r.a,{href:"https://goo.gl/1vKbXW",children:"https://goo.gl/1vKbXW"})," for more options"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.protocols.[*]"}),(0,t.jsxs)(r.td,{children:["Accepted TLS protocols. Defaults to [",(0,t.jsx)(r.code,{children:"TLSv1.2"}),"]"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.debugging"}),(0,t.jsxs)(r.td,{children:["Turns ON or OFF ssl debugging. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.enabled"}),(0,t.jsxs)(r.td,{children:["If enabled, it will send all media thru the RTPEngine. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.proto"}),(0,t.jsxs)(r.td,{children:["Reserved to allow for NG commands via ",(0,t.jsx)(r.code,{children:"http"}),", ",(0,t.jsx)(r.code,{children:"https"}),", and ",(0,t.jsx)(r.code,{children:"udp"}),". Currently only ",(0,t.jsx)(r.code,{children:"http"})," is supported"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.host"}),(0,t.jsx)(r.td,{children:"Address for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.port"}),(0,t.jsx)(r.td,{children:"Port for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_convertTelToE164"}),(0,t.jsxs)(r.td,{children:["If enabled, it will convert the number on ingress calls to ",(0,t.jsx)(r.code,{children:"E164"})," format before routing the call. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_uniqueGatewayPerHostPort"}),(0,t.jsxs)(r.td,{children:["If enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["Variables prefixed with ",(0,t.jsx)(r.code,{children:"ex_"})," are experimental features and may be removed or renamed in the future."]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"transport-configuration",children:"Transport Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["Routr supports ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", and ",(0,t.jsx)(r.code,{children:"wss"})," as transport protocols."]}),"\n",(0,t.jsxs)(r.p,{children:["The server requires at least one transport protocol.\nTo bind a transport protocol to a specific IP address, you can use the ",(0,t.jsx)(r.code,{children:"spec.transport.bindAddr"})," or more generally ",(0,t.jsx)(r.code,{children:"spec.bindAddr"}),"."]}),"\n",(0,t.jsx)(r.h2,{id:"datasource-providers",children:"Datasource Providers"}),"\n",(0,t.jsxs)(r.p,{children:["Routr currently implements two data providers: ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," and ",(0,t.jsx)(r.code,{children:"files_data_provider"}),". The default data provider is the ",(0,t.jsx)(r.code,{children:"files_data_provider"}),"."]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["The docker distribution of the server uses ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," by default"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"redis-data-provider",children:"Redis Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"host"}),(0,t.jsx)(r.td,{children:"Redis host. Defaults to 'localhost'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"port"}),(0,t.jsx)(r.td,{children:"Redis port. The default port is 6379"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"secret"}),(0,t.jsx)(r.td,{children:"Password to access database"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.h3,{id:"files-data-provider",children:"Files Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"files_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsx)(r.tbody,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"path"}),(0,t.jsxs)(r.td,{children:["Path to configuration files. Defaults to the ",(0,t.jsx)(r.code,{children:"config"})," folder"]}),(0,t.jsx)(r.td,{children:"No"})]})})]}),"\n",(0,t.jsx)(r.p,{children:"This implementation has the limitation that writes operations have to be performed manually on the files."}),"\n",(0,t.jsx)(r.h2,{id:"configuring-the-server-behind-a-nat",children:"Configuring the server behind a NAT"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," and ",(0,t.jsx)(r.code,{children:"spec.localnets"})," parameters help Routr identify the\ncorrect path for any given traffic. The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," is typically the Internet\nfacing IP address. The ",(0,t.jsx)(r.code,{children:"spec.localnets"})," is an array with valid CIDR, IP/Mask, or single IP values.\nHere is quick example:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n externAddr: 172.220.231.23\n localnets: [172.17.0.2/16]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"access-control-list",children:"Access Control List"}),"\n",(0,t.jsxs)(r.p,{children:["The Access Control List(ACL) provides with a security mechanism to disable network\naccess from unwanted sources. ACL rules exist at general or Domain level. Here is an example,\nblocking all traffic except from IP address ",(0,t.jsx)(r.code,{children:"192.168.0.1"}),"."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"basic-example",children:"Basic Example"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"apiVersion: v1beta1\nspec:\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n"})})]})}function h(e={}){const{wrapper:r}={...(0,d.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>i,x:()=>c});var t=s(6540);const d={},n=t.createContext(d);function i(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5613],{3507:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>c,toc:()=>o});var t=s(4848),d=s(8453);const n={},i="General",c={id:"configuration/general",title:"General",description:"The general configuration affects your entire Routr instance. The general configuration",source:"@site/versioned_docs/version-1.x.x/configuration/general.md",sourceDirName:"configuration",slug:"/configuration/general",permalink:"/docs/1.x.x/configuration/general",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/general.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"},next:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"}},l={},o=[{value:"General Configuration Parameters",id:"general-configuration-parameters",level:2},{value:"Transport Configuration",id:"transport-configuration",level:2},{value:"Datasource Providers",id:"datasource-providers",level:2},{value:"Redis Data Provider",id:"redis-data-provider",level:3},{value:"Files Data Provider",id:"files-data-provider",level:3},{value:"Configuring the server behind a NAT",id:"configuring-the-server-behind-a-nat",level:2},{value:"Access Control List",id:"access-control-list",level:2},{value:"Basic Example",id:"basic-example",level:2}];function a(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"general",children:"General"}),"\n",(0,t.jsxs)(r.p,{children:["The general configuration affects your entire Routr instance. The general configuration\ncan be provided using the file ",(0,t.jsx)(r.code,{children:"config/config.yml"})," located at the root of your Routr installation."]}),"\n",(0,t.jsx)(r.h2,{id:"general-configuration-parameters",children:"General Configuration Parameters"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"apiVersion"}),(0,t.jsx)(r.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"metadata.userAgent"}),(0,t.jsxs)(r.td,{children:["Sets sip header ",(0,t.jsx)(r.code,{children:"User-Agent"})," to the desired value"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.provider"}),(0,t.jsxs)(r.td,{children:["Defines data provider. Defaults to ",(0,t.jsx)(r.code,{children:"files_data_provider"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.dataSource.parameters"}),(0,t.jsx)(r.td,{children:"Data Source Parameters. Ex.: 'host=localhost,port=6379'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.bindAddr"}),(0,t.jsx)(r.td,{children:"Default stack IP address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.externAddr"}),(0,t.jsx)(r.td,{children:"IP address to advertise"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.localnets"}),(0,t.jsx)(r.td,{children:"Local networks. Use in combination with spec.externAddr"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.recordRoute"}),(0,t.jsx)(r.td,{children:"Stay within the signaling path"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].bindAddr"}),(0,t.jsxs)(r.td,{children:["Overwrites ",(0,t.jsx)(r.code,{children:"spec.bindAddr"})," for transport entry"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].port"}),(0,t.jsx)(r.td,{children:"Transport port"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.transport.[*].protocol"}),(0,t.jsxs)(r.td,{children:["Valid values are: ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", ",(0,t.jsx)(r.code,{children:"wss"})]}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.registrarIntf"}),(0,t.jsxs)(r.td,{children:[(0,t.jsx)(r.code,{children:"Internal"}),' causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ',(0,t.jsx)(r.code,{children:"External"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.deny.[*]"}),(0,t.jsx)(r.td,{children:"Deny incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.accessControlList.allow.[*]"}),(0,t.jsx)(r.td,{children:"Allow incoming traffic from network list"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.bindAddr"}),(0,t.jsx)(r.td,{children:"Restful service listening address"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.port"}),(0,t.jsx)(r.td,{children:"Restful service port. Defaults to 4567"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.minThreads"}),(0,t.jsx)(r.td,{children:"Minimum thread allocation. Defaults to 8"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.maxThreads"}),(0,t.jsx)(r.td,{children:"Maximum thread allocation. Defaults to 200"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.timeOutMillis"}),(0,t.jsx)(r.td,{children:"Will reject requests that last more than this value. Defaults to 5000(5 seconds)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.unsecured"}),(0,t.jsxs)(r.td,{children:["Disabled https for restful calls. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.restService.trueStorePassword"}),(0,t.jsx)(r.td,{children:"Password for trueStore"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStore"}),(0,t.jsx)(r.td,{children:"Path to keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.trustStore"}),(0,t.jsx)(r.td,{children:"Path to trueStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStorePassword"}),(0,t.jsx)(r.td,{children:"Password for keyStore"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.keyStoreType"}),(0,t.jsx)(r.td,{children:"KeyStore type"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.authType"}),(0,t.jsxs)(r.td,{children:["Type of client authentication. Defaults to ",(0,t.jsx)(r.code,{children:"DisabledAll"}),". See ",(0,t.jsx)(r.a,{href:"https://goo.gl/1vKbXW",children:"https://goo.gl/1vKbXW"})," for more options"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.client.protocols.[*]"}),(0,t.jsxs)(r.td,{children:["Accepted TLS protocols. Defaults to [",(0,t.jsx)(r.code,{children:"TLSv1.2"}),"]"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.securityContext.debugging"}),(0,t.jsxs)(r.td,{children:["Turns ON or OFF ssl debugging. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.enabled"}),(0,t.jsxs)(r.td,{children:["If enabled, it will send all media thru the RTPEngine. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.proto"}),(0,t.jsxs)(r.td,{children:["Reserved to allow for NG commands via ",(0,t.jsx)(r.code,{children:"http"}),", ",(0,t.jsx)(r.code,{children:"https"}),", and ",(0,t.jsx)(r.code,{children:"udp"}),". Currently only ",(0,t.jsx)(r.code,{children:"http"})," is supported"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.host"}),(0,t.jsx)(r.td,{children:"Address for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_rtpEngine.port"}),(0,t.jsx)(r.td,{children:"Port for RTPEngine"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_convertTelToE164"}),(0,t.jsxs)(r.td,{children:["If enabled, it will convert the number on ingress calls to ",(0,t.jsx)(r.code,{children:"E164"})," format before routing the call. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"spec.ex_uniqueGatewayPerHostPort"}),(0,t.jsxs)(r.td,{children:["If enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to ",(0,t.jsx)(r.code,{children:"false"})]}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["Variables prefixed with ",(0,t.jsx)(r.code,{children:"ex_"})," are experimental features and may be removed or renamed in the future."]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"transport-configuration",children:"Transport Configuration"}),"\n",(0,t.jsxs)(r.p,{children:["Routr supports ",(0,t.jsx)(r.code,{children:"tcp"}),", ",(0,t.jsx)(r.code,{children:"udp"}),", ",(0,t.jsx)(r.code,{children:"tls"}),", ",(0,t.jsx)(r.code,{children:"sctp"}),", ",(0,t.jsx)(r.code,{children:"ws"}),", and ",(0,t.jsx)(r.code,{children:"wss"})," as transport protocols."]}),"\n",(0,t.jsxs)(r.p,{children:["The server requires at least one transport protocol.\nTo bind a transport protocol to a specific IP address, you can use the ",(0,t.jsx)(r.code,{children:"spec.transport.bindAddr"})," or more generally ",(0,t.jsx)(r.code,{children:"spec.bindAddr"}),"."]}),"\n",(0,t.jsx)(r.h2,{id:"datasource-providers",children:"Datasource Providers"}),"\n",(0,t.jsxs)(r.p,{children:["Routr currently implements two data providers: ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," and ",(0,t.jsx)(r.code,{children:"files_data_provider"}),". The default data provider is the ",(0,t.jsx)(r.code,{children:"files_data_provider"}),"."]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["The docker distribution of the server uses ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," by default"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"redis-data-provider",children:"Redis Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"redis_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"host"}),(0,t.jsx)(r.td,{children:"Redis host. Defaults to 'localhost'"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"port"}),(0,t.jsx)(r.td,{children:"Redis port. The default port is 6379"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"secret"}),(0,t.jsx)(r.td,{children:"Password to access database"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.h3,{id:"files-data-provider",children:"Files Data Provider"}),"\n",(0,t.jsxs)(r.p,{children:["The parameters for ",(0,t.jsx)(r.code,{children:"files_data_provider"})," are:"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Parameter"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsx)(r.tbody,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"path"}),(0,t.jsxs)(r.td,{children:["Path to configuration files. Defaults to the ",(0,t.jsx)(r.code,{children:"config"})," folder"]}),(0,t.jsx)(r.td,{children:"No"})]})})]}),"\n",(0,t.jsx)(r.p,{children:"This implementation has the limitation that writes operations have to be performed manually on the files."}),"\n",(0,t.jsx)(r.h2,{id:"configuring-the-server-behind-a-nat",children:"Configuring the server behind a NAT"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," and ",(0,t.jsx)(r.code,{children:"spec.localnets"})," parameters help Routr identify the\ncorrect path for any given traffic. The ",(0,t.jsx)(r.code,{children:"spec.externAddr"})," is typically the Internet\nfacing IP address. The ",(0,t.jsx)(r.code,{children:"spec.localnets"})," is an array with valid CIDR, IP/Mask, or single IP values.\nHere is quick example:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n externAddr: 172.220.231.23\n localnets: [172.17.0.2/16]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"access-control-list",children:"Access Control List"}),"\n",(0,t.jsxs)(r.p,{children:["The Access Control List(ACL) provides with a security mechanism to disable network\naccess from unwanted sources. ACL rules exist at general or Domain level. Here is an example,\nblocking all traffic except from IP address ",(0,t.jsx)(r.code,{children:"192.168.0.1"}),"."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"spec:\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})}),"\n",(0,t.jsx)(r.h2,{id:"basic-example",children:"Basic Example"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"apiVersion: v1beta1\nspec:\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n"})})]})}function h(e={}){const{wrapper:r}={...(0,d.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>i,x:()=>c});var t=s(6540);const d={},n=t.createContext(d);function i(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f9d54d1.8784b614.js b/assets/js/3f9d54d1.8784b614.js new file mode 100644 index 000000000..4a99861b4 --- /dev/null +++ b/assets/js/3f9d54d1.8784b614.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2333],{1282:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=o(4848),r=o(8453);const a={},s="Custom data with the APIServer",d={id:"development/custom-data-with-the-apiserver",title:"Custom data with the APIServer",description:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.",source:"@site/docs/development/custom-data-with-the-apiserver.md",sourceDirName:"development",slug:"/development/custom-data-with-the-apiserver",permalink:"/docs/2.11.5/development/custom-data-with-the-apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/custom-data-with-the-apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Middleware",permalink:"/docs/2.11.5/development/building-a-middleware"},next:{title:"Extending the Command-Line Tool",permalink:"/docs/2.11.5/development/extending-the-ctl"}},i={},c=[{value:"When to store custom data",id:"when-to-store-custom-data",level:2},{value:"How to store custom data",id:"how-to-store-custom-data",level:2},{value:"How to retrieve custom data",id:"how-to-retrieve-custom-data",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"custom-data-with-the-apiserver",children:"Custom data with the APIServer"}),"\n",(0,n.jsx)(t.p,{children:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer."}),"\n",(0,n.jsxs)(t.p,{children:["The APIServer, typically used for Routr Connect, consists of objects with an ",(0,n.jsx)(t.code,{children:"extended"})," property to store custom data. This ",(0,n.jsx)(t.code,{children:"extended"})," property is a JSON object you can use to store any data you want."]}),"\n",(0,n.jsx)(t.h2,{id:"when-to-store-custom-data",children:"When to store custom data"}),"\n",(0,n.jsx)(t.p,{children:"Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system."}),"\n",(0,n.jsxs)(t.p,{children:["You might also need to store information a Processor requires, like the ",(0,n.jsx)(t.code,{children:"User-Agent"})," of a device an Agent uses, and use that information to adjust the signaling process."]}),"\n",(0,n.jsx)(t.h2,{id:"how-to-store-custom-data",children:"How to store custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To store custom data, add a property to the ",(0,n.jsx)(t.code,{children:"extended"})," object. For instance, to add the external identifier of an Agent in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'const request = {\n name: "John Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "externalId": "123456789"\n }\n};\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,n.jsxs)(t.p,{children:["For additional examples of how to store custom data, see the ",(0,n.jsx)(t.a,{href:"/docs/2.11.5/connect/nodesdk/overview",children:"Node SDK"}),' and search for "extended."']}),"\n",(0,n.jsx)(t.h2,{id:"how-to-retrieve-custom-data",children:"How to retrieve custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To retrieve custom data, read the ",(0,n.jsx)(t.code,{children:"extended"})," property. For instance, to retrieve the external identifier of a user in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")\n .then(agent => {\n console.log(agent.extended.externalId);\n })\n .catch(console.error); // an error occurred\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>d});var n=o(6540);const r={},a=n.createContext(r);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3f9d54d1.c4d5fa12.js b/assets/js/3f9d54d1.c4d5fa12.js deleted file mode 100644 index 7a0287650..000000000 --- a/assets/js/3f9d54d1.c4d5fa12.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2333],{3451:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=o(4848),r=o(8453);const a={},s="Custom data with the APIServer",d={id:"development/custom-data-with-the-apiserver",title:"Custom data with the APIServer",description:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.",source:"@site/docs/development/custom-data-with-the-apiserver.md",sourceDirName:"development",slug:"/development/custom-data-with-the-apiserver",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/custom-data-with-the-apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"},next:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"}},i={},c=[{value:"When to store custom data",id:"when-to-store-custom-data",level:2},{value:"How to store custom data",id:"how-to-store-custom-data",level:2},{value:"How to retrieve custom data",id:"how-to-retrieve-custom-data",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"custom-data-with-the-apiserver",children:"Custom data with the APIServer"}),"\n",(0,n.jsx)(t.p,{children:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer."}),"\n",(0,n.jsxs)(t.p,{children:["The APIServer, typically used for Routr Connect, consists of objects with an ",(0,n.jsx)(t.code,{children:"extended"})," property to store custom data. This ",(0,n.jsx)(t.code,{children:"extended"})," property is a JSON object you can use to store any data you want."]}),"\n",(0,n.jsx)(t.h2,{id:"when-to-store-custom-data",children:"When to store custom data"}),"\n",(0,n.jsx)(t.p,{children:"Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system."}),"\n",(0,n.jsxs)(t.p,{children:["You might also need to store information a Processor requires, like the ",(0,n.jsx)(t.code,{children:"User-Agent"})," of a device an Agent uses, and use that information to adjust the signaling process."]}),"\n",(0,n.jsx)(t.h2,{id:"how-to-store-custom-data",children:"How to store custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To store custom data, add a property to the ",(0,n.jsx)(t.code,{children:"extended"})," object. For instance, to add the external identifier of an Agent in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'const request = {\n name: "John Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "externalId": "123456789"\n }\n};\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,n.jsxs)(t.p,{children:["For additional examples of how to store custom data, see the ",(0,n.jsx)(t.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node SDK"}),' and search for "extended."']}),"\n",(0,n.jsx)(t.h2,{id:"how-to-retrieve-custom-data",children:"How to retrieve custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To retrieve custom data, read the ",(0,n.jsx)(t.code,{children:"extended"})," property. For instance, to retrieve the external identifier of a user in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")\n .then(agent => {\n console.log(agent.extended.externalId);\n })\n .catch(console.error); // an error occurred\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>d});var n=o(6540);const r={},a=n.createContext(r);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40f2a0b4.bcebf01b.js b/assets/js/40f2a0b4.7e3f3239.js similarity index 98% rename from assets/js/40f2a0b4.bcebf01b.js rename to assets/js/40f2a0b4.7e3f3239.js index 0a7e7e6c0..61873b7b4 100644 --- a/assets/js/40f2a0b4.bcebf01b.js +++ b/assets/js/40f2a0b4.7e3f3239.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6926],{125:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var n=s(4848),r=s(8453);const a={},i="deleteGateway",o={id:"api/gateways/delete",title:"deleteGateway",description:"Removes a Gateway resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",sourceDirName:"api/gateways",slug:"/api/gateways/delete",permalink:"/docs/1.x.x/api/gateways/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"},next:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"}},d={},l=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"deletegateway",children:"deleteGateway"}),"\n",(0,n.jsxs)(t.p,{children:["Removes a Gateway resource from a persistent database. Before removing\na Gateway, ensure you have remove all of it child Numbers. Otherwise,\nthis method returns a ",(0,n.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"DELETE"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"ref"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method removes a Gateway resource."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>o});var n=s(6540);const r={},a=n.createContext(r);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6926],{598:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var n=s(4848),r=s(8453);const a={},i="deleteGateway",o={id:"api/gateways/delete",title:"deleteGateway",description:"Removes a Gateway resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",sourceDirName:"api/gateways",slug:"/api/gateways/delete",permalink:"/docs/1.x.x/api/gateways/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"},next:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"}},d={},l=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"deletegateway",children:"deleteGateway"}),"\n",(0,n.jsxs)(t.p,{children:["Removes a Gateway resource from a persistent database. Before removing\na Gateway, ensure you have remove all of it child Numbers. Otherwise,\nthis method returns a ",(0,n.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"DELETE"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"ref"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method removes a Gateway resource."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>o});var n=s(6540);const r={},a=n.createContext(r);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40f2f3c6.6108f911.js b/assets/js/40f2f3c6.94b90663.js similarity index 98% rename from assets/js/40f2f3c6.6108f911.js rename to assets/js/40f2f3c6.94b90663.js index 463de0d22..0b5102e4c 100644 --- a/assets/js/40f2f3c6.6108f911.js +++ b/assets/js/40f2f3c6.94b90663.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8353],{4765:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="deleteDomain",d={id:"api/domains/delete",title:"deleteDomain",description:"Removes a Domain resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/domains/delete.md",sourceDirName:"api/domains",slug:"/api/domains/delete",permalink:"/docs/1.x.x/api/domains/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"},next:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"}},l={},a=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletedomain",children:"deleteDomain"}),"\n",(0,s.jsxs)(t.p,{children:["Removes a Domain resource from a persistent database. Before removing\na Domain, ensure you have remove all of it child Agents. Otherwise,\nthis method returns a ",(0,s.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8353],{3688:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="deleteDomain",d={id:"api/domains/delete",title:"deleteDomain",description:"Removes a Domain resource from a persistent database. Before removing",source:"@site/versioned_docs/version-1.x.x/api/domains/delete.md",sourceDirName:"api/domains",slug:"/api/domains/delete",permalink:"/docs/1.x.x/api/domains/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"},next:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"}},l={},a=[];function c(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletedomain",children:"deleteDomain"}),"\n",(0,s.jsxs)(t.p,{children:["Removes a Domain resource from a persistent database. Before removing\na Domain, ensure you have remove all of it child Agents. Otherwise,\nthis method returns a ",(0,s.jsx)(t.code,{children:"FOUND_DEPENDENT_OBJECTS_RESPONSE"})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/411db075.9b5d818d.js b/assets/js/411db075.36e4e24e.js similarity index 97% rename from assets/js/411db075.9b5d818d.js rename to assets/js/411db075.36e4e24e.js index 52fe02550..e992f8f29 100644 --- a/assets/js/411db075.9b5d818d.js +++ b/assets/js/411db075.36e4e24e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8535],{7134:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const c={},o="createPeer",i={id:"api/peers/create",title:"createPeer",description:"Creates a new Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/create.md",sourceDirName:"api/peers",slug:"/api/peers/create",permalink:"/docs/1.x.x/api/peers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"},next:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"createpeer",children:"createPeer"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/peers"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"POST"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsxs)(n.p,{children:["A file containing a ",(0,t.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,t.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method creates a Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/peers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "pr2c77f4"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>i});var t=r(6540);const s={},c=t.createContext(s);function o(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8535],{6651:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>d});var t=r(4848),s=r(8453);const c={},o="createPeer",i={id:"api/peers/create",title:"createPeer",description:"Creates a new Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/create.md",sourceDirName:"api/peers",slug:"/api/peers/create",permalink:"/docs/1.x.x/api/peers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"},next:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"createpeer",children:"createPeer"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/peers"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"POST"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsxs)(n.p,{children:["A file containing a ",(0,t.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,t.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful this method creates a Peer resource."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/peers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "pr2c77f4"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>i});var t=r(6540);const s={},c=t.createContext(s);function o(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43d3d555.cbd810c1.js b/assets/js/43d3d555.cbd810c1.js new file mode 100644 index 000000000..3a41c0b81 --- /dev/null +++ b/assets/js/43d3d555.cbd810c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3624],{6671:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var r=s(4848),d=s(8453);const t={},i="SDK",c={id:"connect/nodesdk/sdk",title:"SDK",description:"* Installation",source:"@site/docs/connect/nodesdk/sdk.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/sdk",permalink:"/docs/2.11.5/connect/nodesdk/sdk",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/sdk.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.11.5/connect/nodesdk/overview"},next:{title:"Home or Office Setup",permalink:"/docs/2.11.5/connect/home-or-office-setup"}},l={},o=[{value:"ACL \u21d0 <code>APIClient</code>",id:"acl--apiclient",level:2},{value:"new ACL(options)",id:"new-acloptions",level:3},{value:"acL.createACL(request) \u21d2 <code>Promise.<CreateACLResponse></code>",id:"aclcreateaclrequest--promisecreateaclresponse",level:3},{value:"acL.updateACL(request) \u21d2 <code>Promise.<UpdateACLResponse></code>",id:"aclupdateaclrequest--promiseupdateaclresponse",level:3},{value:"acL.getACL(ref) \u21d2 <code>Promise.<GetACLResponse></code>",id:"aclgetaclref--promisegetaclresponse",level:3},{value:"acL.deleteACL(ref) \u21d2 <code>Promise.<void></code>",id:"acldeleteaclref--promisevoid",level:3},{value:"acL.listACLs(request) \u21d2 <code>Promise.<ListACLResponse></code>",id:"acllistaclsrequest--promiselistaclresponse",level:3},{value:"Agents \u21d0 <code>APIClient</code>",id:"agents--apiclient",level:2},{value:"new Agents(options)",id:"new-agentsoptions",level:3},{value:"agents.createAgent(request) \u21d2 <code>Promise.<CreateAgentResponse></code>",id:"agentscreateagentrequest--promisecreateagentresponse",level:3},{value:"agents.updateAgent(request) \u21d2 <code>Promise.<UpdateAgentResponse></code>",id:"agentsupdateagentrequest--promiseupdateagentresponse",level:3},{value:"agents.getAgent(ref) \u21d2 <code>Promise.<GetAgentResponse></code>",id:"agentsgetagentref--promisegetagentresponse",level:3},{value:"agents.deleteAgent(ref) \u21d2 <code>Promise.<void></code>",id:"agentsdeleteagentref--promisevoid",level:3},{value:"agents.listAgents(request) \u21d2 <code>Promise.<ListAgentResponse></code>",id:"agentslistagentsrequest--promiselistagentresponse",level:3},{value:"Credentials \u21d0 <code>APIClient</code>",id:"credentials--apiclient",level:2},{value:"new Credentials(options)",id:"new-credentialsoptions",level:3},{value:"credentials.createCredentials(request) \u21d2 <code>Promise.<CreateCredentialsResponse></code>",id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",level:3},{value:"credentials.updateCredentials(request) \u21d2 <code>Promise.<UpdateCredentialsResponse></code>",id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",level:3},{value:"credentials.getCredentials(ref) \u21d2 <code>Promise.<GetCredentialsResponse></code>",id:"credentialsgetcredentialsref--promisegetcredentialsresponse",level:3},{value:"credentials.deleteCredentials(ref) \u21d2 <code>Promise.<void></code>",id:"credentialsdeletecredentialsref--promisevoid",level:3},{value:"credentials.listCredentials(request) \u21d2 <code>Promise.<ListCredentialsResponse></code>",id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",level:3},{value:"Domains \u21d0 <code>APIClient</code>",id:"domains--apiclient",level:2},{value:"new Domains(options)",id:"new-domainsoptions",level:3},{value:"domains.createDomain(request) \u21d2 <code>Promise.<CreateDomainResponse></code>",id:"domainscreatedomainrequest--promisecreatedomainresponse",level:3},{value:"domains.updateDomain(request) \u21d2 <code>Promise.<UpdateDomainResponse></code>",id:"domainsupdatedomainrequest--promiseupdatedomainresponse",level:3},{value:"domains.getDomain(ref) \u21d2 <code>Promise.<GetDomainResponse></code>",id:"domainsgetdomainref--promisegetdomainresponse",level:3},{value:"domains.deleteDomain(ref) \u21d2 <code>Promise.<void></code>",id:"domainsdeletedomainref--promisevoid",level:3},{value:"domains.listDomains(request) \u21d2 <code>Promise.<ListDomainResponse></code>",id:"domainslistdomainsrequest--promiselistdomainresponse",level:3},{value:"Numbers \u21d0 <code>APIClient</code>",id:"numbers--apiclient",level:2},{value:"new Numbers(options)",id:"new-numbersoptions",level:3},{value:"numbers.createNumber(request) \u21d2 <code>Promise.<CreateNumberResponse></code>",id:"numberscreatenumberrequest--promisecreatenumberresponse",level:3},{value:"numbers.updateNumber(request) \u21d2 <code>Promise.<UpdateNumberResponse></code>",id:"numbersupdatenumberrequest--promiseupdatenumberresponse",level:3},{value:"numbers.getNumber(ref) \u21d2 <code>Promise.<GetNumberResponse></code>",id:"numbersgetnumberref--promisegetnumberresponse",level:3},{value:"numbers.deleteNumber(ref) \u21d2 <code>Promise.<void></code>",id:"numbersdeletenumberref--promisevoid",level:3},{value:"numbers.listNumbers(request) \u21d2 <code>Promise.<ListNumberResponse></code>",id:"numberslistnumbersrequest--promiselistnumberresponse",level:3},{value:"Peers \u21d0 <code>APIClient</code>",id:"peers--apiclient",level:2},{value:"new Peers(options)",id:"new-peersoptions",level:3},{value:"peers.createPeer(request) \u21d2 <code>Promise.<CreatePeerResponse></code>",id:"peerscreatepeerrequest--promisecreatepeerresponse",level:3},{value:"peers.updatePeer(request) \u21d2 <code>Promise.<UpdatePeerResponse></code>",id:"peersupdatepeerrequest--promiseupdatepeerresponse",level:3},{value:"peers.getPeer(ref) \u21d2 <code>Promise.<GetPeerResponse></code>",id:"peersgetpeerref--promisegetpeerresponse",level:3},{value:"peers.deletePeer(ref) \u21d2 <code>Promise.<void></code>",id:"peersdeletepeerref--promisevoid",level:3},{value:"peers.listPeers(request) \u21d2 <code>Promise.<ListPeerResponse></code>",id:"peerslistpeersrequest--promiselistpeerresponse",level:3},{value:"Trunks \u21d0 <code>APIClient</code>",id:"trunks--apiclient",level:2},{value:"new Trunks(options)",id:"new-trunksoptions",level:3},{value:"trunks.createTrunk(request) \u21d2 <code>Promise.<CreateTrunkResponse></code>",id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",level:3},{value:"trunks.updateTrunk(request) \u21d2 <code>Promise.<UpdateTrunkResponse></code>",id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",level:3},{value:"trunks.getTrunk(ref) \u21d2 <code>Promise.<GetTrunkResponse></code>",id:"trunksgettrunkref--promisegettrunkresponse",level:3},{value:"trunks.deleteTrunk(ref) \u21d2 <code>Promise.<void></code>",id:"trunksdeletetrunkref--promisevoid",level:3},{value:"trunks.listTrunks(request) \u21d2 <code>Promise.<ListTrunkResponse></code>",id:"trunkslisttrunksrequest--promiselisttrunkresponse",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"sdk",children:"SDK"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/2.11.5/connect/nodesdk/sdk#installation",children:"Installation"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#apis",children:"APIs"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install --save @routr/sdk\n"})}),"\n",(0,r.jsx)(n.h1,{id:"apis",children:"APIs"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)(n.code,{children:"Access Control List"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)(n.code,{children:"Agents"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)(n.code,{children:"Credentials"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)(n.code,{children:"Domains"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)(n.code,{children:"Numbers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)(n.code,{children:"Peers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)(n.code,{children:"Trunks"})})}),"\n"]}),"\n",(0,r.jsx)("a",{name:"ACL"}),"\n",(0,r.jsxs)(n.h2,{id:"acl--apiclient",children:["ACL \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get\nand delete Access Control Lists. The ACL API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL",children:"ACL"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_ACL_new",children:"new ACL(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+createACL",children:".createACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+updateACL",children:".updateACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+getACL",children:".getACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+deleteACL",children:".deleteACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+listACLs",children:".listACLs(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_ACL_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-acloptions",children:"new ACL(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new ACL API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst acl = new SDK.ACL()\n\nconst request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+createACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclcreateaclrequest--promisecreateaclresponse",children:["acL.createACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})," - The newly created AccessControlList",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+updateACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclupdateaclrequest--promiseupdateaclresponse",children:["acL.updateACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateACLRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Peer network updated",\n}\n\nacl.updateACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+getACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclgetaclref--promisegetaclresponse",children:["acL.getACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.getACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+deleteACL"}),"\n",(0,r.jsxs)(n.h3,{id:"acldeleteaclref--promisevoid",children:["acL.deleteACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.deleteACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+listACLs"}),"\n",(0,r.jsxs)(n.h3,{id:"acllistaclsrequest--promiselistaclresponse",children:["acL.listACLs(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all AccessControlLists from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})," - The list of AccessControlLists"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to list ACLs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of ACLs to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nacl.listACLs(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Agents"}),"\n",(0,r.jsxs)(n.h2,{id:"agents--apiclient",children:["Agents \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get\nand delete Agents. The Agents API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents",children:"Agents"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Agents_new",children:"new Agents(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+createAgent",children:".createAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+updateAgent",children:".updateAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+getAgent",children:".getAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+deleteAgent",children:".deleteAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+listAgents",children:".listAgents(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Agents_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-agentsoptions",children:"new Agents(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Agent API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst agents = new SDK.Agents()\n\nconst request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+createAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentscreateagentrequest--promisecreateagentresponse",children:["agents.createAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})," - The newly created Agent",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+updateAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsupdateagentrequest--promiseupdateagentresponse",children:["agents.updateAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})," - The updated Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateAgentRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John D Doe",\n enabled: false\n}\n\nagents.updateAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+getAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsgetagentref--promisegetagentresponse",children:["agents.getAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})," - The Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.getAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+deleteAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsdeleteagentref--promisevoid",children:["agents.deleteAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.deleteAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+listAgents"}),"\n",(0,r.jsxs)(n.h3,{id:"agentslistagentsrequest--promiselistagentresponse",children:["agents.listAgents(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Agents from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})," - The list of Agents in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Agents"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Agents to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nagents.listAgents(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Credentials"}),"\n",(0,r.jsxs)(n.h2,{id:"credentials--apiclient",children:["Credentials \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get\nand delete Credentials. The Credentials API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials",children:"Credentials"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Credentials_new",children:"new Credentials(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+createCredentials",children:".createCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+updateCredentials",children:".updateCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+getCredentials",children:".getCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+deleteCredentials",children:".deleteCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+listCredentials",children:".listCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Credentials_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-credentialsoptions",children:"new Credentials(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Credentials API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst credentials = new SDK.Credentials()\n\nconst request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+createCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",children:["credentials.createCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})," - The newly created Credentials",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+updateCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",children:["credentials.updateCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})," - The updated Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John Doe\'s Credentials"\n}\n\ncredentials.updateCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+getCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsgetcredentialsref--promisegetcredentialsresponse",children:["credentials.getCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})," - The Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.getCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+deleteCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsdeletecredentialsref--promisevoid",children:["credentials.deleteCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.deleteCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+listCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",children:["credentials.listCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Credentials from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})," - The list of Credentials in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Credentials to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ncredentials.listCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Domains"}),"\n",(0,r.jsxs)(n.h2,{id:"domains--apiclient",children:["Domains \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get\nand delete Domains. The Domains API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains",children:"Domains"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Domains_new",children:"new Domains(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+createDomain",children:".createDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+updateDomain",children:".updateDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+getDomain",children:".getDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+deleteDomain",children:".deleteDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+listDomains",children:".listDomains(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Domains_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-domainsoptions",children:"new Domains(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Domain API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst domains = new SDK.Domains()\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+createDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainscreatedomainrequest--promisecreatedomainresponse",children:["domains.createDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})," - The newly created Domain",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The FQDN of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+updateDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsupdatedomainrequest--promiseupdatedomainresponse",children:["domains.updateDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})," - The updated Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateDomainRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain updated",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n}\n\ndomains.updateDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+getDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsgetdomainref--promisegetdomainresponse",children:["domains.getDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})," - The Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.getDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+deleteDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsdeletedomainref--promisevoid",children:["domains.deleteDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.deleteDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+listDomains"}),"\n",(0,r.jsxs)(n.h3,{id:"domainslistdomainsrequest--promiselistdomainresponse",children:["domains.listDomains(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Domains from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})," - The list of Domains"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Domains to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ndomains.listDomains(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Numbers"}),"\n",(0,r.jsxs)(n.h2,{id:"numbers--apiclient",children:["Numbers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get\nand delete Numbers. The Number API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers",children:"Numbers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Numbers_new",children:"new Numbers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+createNumber",children:".createNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+updateNumber",children:".updateNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+getNumber",children:".getNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+deleteNumber",children:".deleteNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+listNumbers",children:".listNumbers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Numbers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-numbersoptions",children:"new Numbers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Number API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst numbers = new SDK.Numbers()\n\nconst request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+createNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numberscreatenumberrequest--promisecreatenumberresponse",children:["numbers.createNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})," - The newly created Number",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.telUrl"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The number URI to be used (e.g., te:+1234567890)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.city"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The city where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.country"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.countryISOCode"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country ISO code where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+updateNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersupdatenumberrequest--promiseupdatenumberresponse",children:["numbers.updateNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})," - The updated Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateNumberRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212 (friendly name)",\n aorLink: "sip:2001@sip.local"\n}\n\nnumbers.updateNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+getNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersgetnumberref--promisegetnumberresponse",children:["numbers.getNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})," - The Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.getNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+deleteNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersdeletenumberref--promisevoid",children:["numbers.deleteNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.deleteNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+listNumbers"}),"\n",(0,r.jsxs)(n.h3,{id:"numberslistnumbersrequest--promiselistnumberresponse",children:["numbers.listNumbers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Numbers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})," - The list of Numbers"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Numbers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Numbers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nnumbers.listNumbers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Peers"}),"\n",(0,r.jsxs)(n.h2,{id:"peers--apiclient",children:["Peers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get\nand delete Peers. The Peers API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers",children:"Peers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Peers_new",children:"new Peers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+createPeer",children:".createPeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+updatePeer",children:".updatePeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+getPeer",children:".getPeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+deletePeer",children:".deletePeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+listPeers",children:".listPeers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Peers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-peersoptions",children:"new Peers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Peer API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst peers = new SDK.Peers()\n\nconst request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+createPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peerscreatepeerrequest--promisecreatepeerresponse",children:["peers.createPeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})," - The newly created Peer",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreatePeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+updatePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersupdatepeerrequest--promiseupdatepeerresponse",children:["peers.updatePeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})," - The updated Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdatePeerRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Feature Server"\n}\n\npeers.updatePeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+getPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersgetpeerref--promisegetpeerresponse",children:["peers.getPeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})," - The Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.getPeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+deletePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersdeletepeerref--promisevoid",children:["peers.deletePeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.deletePeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+listPeers"}),"\n",(0,r.jsxs)(n.h3,{id:"peerslistpeersrequest--promiselistpeerresponse",children:["peers.listPeers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Peers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})," - The list of Peers in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListPeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Peers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Peers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\npeers.listPeers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Trunks"}),"\n",(0,r.jsxs)(n.h2,{id:"trunks--apiclient",children:["Trunks \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get\nand delete Trunks. The Trunks API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks",children:"Trunks"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Trunks_new",children:"new Trunks(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+createTrunk",children:".createTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+updateTrunk",children:".updateTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+getTrunk",children:".getTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+deleteTrunk",children:".deleteTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+listTrunks",children:".listTrunks(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Trunks_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-trunksoptions",children:"new Trunks(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Trunk API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst trunks = new SDK.Trunks()\n\nconst request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+createTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",children:["trunks.createTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})," - The newly created Trunk",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+updateTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",children:["trunks.updateTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})," - The updated Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Trunk from Twilio (US-East)",\n}\n\ntrunks.updateTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+getTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksgettrunkref--promisegettrunkresponse",children:["trunks.getTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})," - The Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.getTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+deleteTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksdeletetrunkref--promisevoid",children:["trunks.deleteTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.deleteTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+listTrunks"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkslisttrunksrequest--promiselisttrunkresponse",children:["trunks.listTrunks(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Trunks from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})," - The list of Trunks in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Trunks"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Trunks to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ntrunks.listTrunks(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var r=s(6540);const d={},t=r.createContext(d);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43d3d555.fc23fdad.js b/assets/js/43d3d555.fc23fdad.js deleted file mode 100644 index b76d36b56..000000000 --- a/assets/js/43d3d555.fc23fdad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3624],{4236:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var r=s(4848),d=s(8453);const t={},i="SDK",c={id:"connect/nodesdk/sdk",title:"SDK",description:"* Installation",source:"@site/docs/connect/nodesdk/sdk.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/sdk",permalink:"/docs/2.0.0/connect/nodesdk/sdk",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/sdk.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"},next:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"}},l={},o=[{value:"ACL \u21d0 <code>APIClient</code>",id:"acl--apiclient",level:2},{value:"new ACL(options)",id:"new-acloptions",level:3},{value:"acL.createACL(request) \u21d2 <code>Promise.<CreateACLResponse></code>",id:"aclcreateaclrequest--promisecreateaclresponse",level:3},{value:"acL.updateACL(request) \u21d2 <code>Promise.<UpdateACLResponse></code>",id:"aclupdateaclrequest--promiseupdateaclresponse",level:3},{value:"acL.getACL(ref) \u21d2 <code>Promise.<GetACLResponse></code>",id:"aclgetaclref--promisegetaclresponse",level:3},{value:"acL.deleteACL(ref) \u21d2 <code>Promise.<void></code>",id:"acldeleteaclref--promisevoid",level:3},{value:"acL.listACLs(request) \u21d2 <code>Promise.<ListACLResponse></code>",id:"acllistaclsrequest--promiselistaclresponse",level:3},{value:"Agents \u21d0 <code>APIClient</code>",id:"agents--apiclient",level:2},{value:"new Agents(options)",id:"new-agentsoptions",level:3},{value:"agents.createAgent(request) \u21d2 <code>Promise.<CreateAgentResponse></code>",id:"agentscreateagentrequest--promisecreateagentresponse",level:3},{value:"agents.updateAgent(request) \u21d2 <code>Promise.<UpdateAgentResponse></code>",id:"agentsupdateagentrequest--promiseupdateagentresponse",level:3},{value:"agents.getAgent(ref) \u21d2 <code>Promise.<GetAgentResponse></code>",id:"agentsgetagentref--promisegetagentresponse",level:3},{value:"agents.deleteAgent(ref) \u21d2 <code>Promise.<void></code>",id:"agentsdeleteagentref--promisevoid",level:3},{value:"agents.listAgents(request) \u21d2 <code>Promise.<ListAgentResponse></code>",id:"agentslistagentsrequest--promiselistagentresponse",level:3},{value:"Credentials \u21d0 <code>APIClient</code>",id:"credentials--apiclient",level:2},{value:"new Credentials(options)",id:"new-credentialsoptions",level:3},{value:"credentials.createCredentials(request) \u21d2 <code>Promise.<CreateCredentialsResponse></code>",id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",level:3},{value:"credentials.updateCredentials(request) \u21d2 <code>Promise.<UpdateCredentialsResponse></code>",id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",level:3},{value:"credentials.getCredentials(ref) \u21d2 <code>Promise.<GetCredentialsResponse></code>",id:"credentialsgetcredentialsref--promisegetcredentialsresponse",level:3},{value:"credentials.deleteCredentials(ref) \u21d2 <code>Promise.<void></code>",id:"credentialsdeletecredentialsref--promisevoid",level:3},{value:"credentials.listCredentials(request) \u21d2 <code>Promise.<ListCredentialsResponse></code>",id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",level:3},{value:"Domains \u21d0 <code>APIClient</code>",id:"domains--apiclient",level:2},{value:"new Domains(options)",id:"new-domainsoptions",level:3},{value:"domains.createDomain(request) \u21d2 <code>Promise.<CreateDomainResponse></code>",id:"domainscreatedomainrequest--promisecreatedomainresponse",level:3},{value:"domains.updateDomain(request) \u21d2 <code>Promise.<UpdateDomainResponse></code>",id:"domainsupdatedomainrequest--promiseupdatedomainresponse",level:3},{value:"domains.getDomain(ref) \u21d2 <code>Promise.<GetDomainResponse></code>",id:"domainsgetdomainref--promisegetdomainresponse",level:3},{value:"domains.deleteDomain(ref) \u21d2 <code>Promise.<void></code>",id:"domainsdeletedomainref--promisevoid",level:3},{value:"domains.listDomains(request) \u21d2 <code>Promise.<ListDomainResponse></code>",id:"domainslistdomainsrequest--promiselistdomainresponse",level:3},{value:"Numbers \u21d0 <code>APIClient</code>",id:"numbers--apiclient",level:2},{value:"new Numbers(options)",id:"new-numbersoptions",level:3},{value:"numbers.createNumber(request) \u21d2 <code>Promise.<CreateNumberResponse></code>",id:"numberscreatenumberrequest--promisecreatenumberresponse",level:3},{value:"numbers.updateNumber(request) \u21d2 <code>Promise.<UpdateNumberResponse></code>",id:"numbersupdatenumberrequest--promiseupdatenumberresponse",level:3},{value:"numbers.getNumber(ref) \u21d2 <code>Promise.<GetNumberResponse></code>",id:"numbersgetnumberref--promisegetnumberresponse",level:3},{value:"numbers.deleteNumber(ref) \u21d2 <code>Promise.<void></code>",id:"numbersdeletenumberref--promisevoid",level:3},{value:"numbers.listNumbers(request) \u21d2 <code>Promise.<ListNumberResponse></code>",id:"numberslistnumbersrequest--promiselistnumberresponse",level:3},{value:"Peers \u21d0 <code>APIClient</code>",id:"peers--apiclient",level:2},{value:"new Peers(options)",id:"new-peersoptions",level:3},{value:"peers.createPeer(request) \u21d2 <code>Promise.<CreatePeerResponse></code>",id:"peerscreatepeerrequest--promisecreatepeerresponse",level:3},{value:"peers.updatePeer(request) \u21d2 <code>Promise.<UpdatePeerResponse></code>",id:"peersupdatepeerrequest--promiseupdatepeerresponse",level:3},{value:"peers.getPeer(ref) \u21d2 <code>Promise.<GetPeerResponse></code>",id:"peersgetpeerref--promisegetpeerresponse",level:3},{value:"peers.deletePeer(ref) \u21d2 <code>Promise.<void></code>",id:"peersdeletepeerref--promisevoid",level:3},{value:"peers.listPeers(request) \u21d2 <code>Promise.<ListPeerResponse></code>",id:"peerslistpeersrequest--promiselistpeerresponse",level:3},{value:"Trunks \u21d0 <code>APIClient</code>",id:"trunks--apiclient",level:2},{value:"new Trunks(options)",id:"new-trunksoptions",level:3},{value:"trunks.createTrunk(request) \u21d2 <code>Promise.<CreateTrunkResponse></code>",id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",level:3},{value:"trunks.updateTrunk(request) \u21d2 <code>Promise.<UpdateTrunkResponse></code>",id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",level:3},{value:"trunks.getTrunk(ref) \u21d2 <code>Promise.<GetTrunkResponse></code>",id:"trunksgettrunkref--promisegettrunkresponse",level:3},{value:"trunks.deleteTrunk(ref) \u21d2 <code>Promise.<void></code>",id:"trunksdeletetrunkref--promisevoid",level:3},{value:"trunks.listTrunks(request) \u21d2 <code>Promise.<ListTrunkResponse></code>",id:"trunkslisttrunksrequest--promiselisttrunkresponse",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"sdk",children:"SDK"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/sdk#installation",children:"Installation"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#apis",children:"APIs"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install --save @routr/sdk\n"})}),"\n",(0,r.jsx)(n.h1,{id:"apis",children:"APIs"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)(n.code,{children:"Access Control List"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)(n.code,{children:"Agents"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)(n.code,{children:"Credentials"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)(n.code,{children:"Domains"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)(n.code,{children:"Numbers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)(n.code,{children:"Peers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)(n.code,{children:"Trunks"})})}),"\n"]}),"\n",(0,r.jsx)("a",{name:"ACL"}),"\n",(0,r.jsxs)(n.h2,{id:"acl--apiclient",children:["ACL \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get\nand delete Access Control Lists. The ACL API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL",children:"ACL"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_ACL_new",children:"new ACL(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+createACL",children:".createACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+updateACL",children:".updateACL(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+getACL",children:".getACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+deleteACL",children:".deleteACL(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#ACL+listACLs",children:".listACLs(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_ACL_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-acloptions",children:"new ACL(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new ACL API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst acl = new SDK.ACL()\n\nconst request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+createACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclcreateaclrequest--promisecreateaclresponse",children:["acL.createACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateACLResponse>"})," - The newly created AccessControlList",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+updateACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclupdateaclrequest--promiseupdateaclresponse",children:["acL.updateACL(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateACLResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateACLRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Peer network updated",\n}\n\nacl.updateACL(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+getACL"}),"\n",(0,r.jsxs)(n.h3,{id:"aclgetaclref--promisegetaclresponse",children:["acL.getACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetACLResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.getACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+deleteACL"}),"\n",(0,r.jsxs)(n.h3,{id:"acldeleteaclref--promisevoid",children:["acL.deleteACL(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.deleteACL(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"ACL+listACLs"}),"\n",(0,r.jsxs)(n.h3,{id:"acllistaclsrequest--promiselistaclresponse",children:["acL.listACLs(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all AccessControlLists from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#ACL",children:(0,r.jsx)("code",{children:"ACL"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListACLResponse>"})," - The list of AccessControlLists"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListACLRequest"})}),(0,r.jsx)(n.td,{children:"The request to list ACLs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of ACLs to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nacl.listACLs(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Agents"}),"\n",(0,r.jsxs)(n.h2,{id:"agents--apiclient",children:["Agents \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get\nand delete Agents. The Agents API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents",children:"Agents"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Agents_new",children:"new Agents(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+createAgent",children:".createAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+updateAgent",children:".updateAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+getAgent",children:".getAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+deleteAgent",children:".deleteAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+listAgents",children:".listAgents(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Agents_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-agentsoptions",children:"new Agents(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Agent API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst agents = new SDK.Agents()\n\nconst request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+createAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentscreateagentrequest--promisecreateagentresponse",children:["agents.createAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})," - The newly created Agent",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+updateAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsupdateagentrequest--promiseupdateagentresponse",children:["agents.updateAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})," - The updated Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateAgentRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John D Doe",\n enabled: false\n}\n\nagents.updateAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+getAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsgetagentref--promisegetagentresponse",children:["agents.getAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})," - The Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.getAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+deleteAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsdeleteagentref--promisevoid",children:["agents.deleteAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.deleteAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+listAgents"}),"\n",(0,r.jsxs)(n.h3,{id:"agentslistagentsrequest--promiselistagentresponse",children:["agents.listAgents(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Agents from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})," - The list of Agents in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Agents"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Agents to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nagents.listAgents(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Credentials"}),"\n",(0,r.jsxs)(n.h2,{id:"credentials--apiclient",children:["Credentials \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get\nand delete Credentials. The Credentials API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials",children:"Credentials"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Credentials_new",children:"new Credentials(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+createCredentials",children:".createCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+updateCredentials",children:".updateCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+getCredentials",children:".getCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+deleteCredentials",children:".deleteCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+listCredentials",children:".listCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Credentials_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-credentialsoptions",children:"new Credentials(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Credentials API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst credentials = new SDK.Credentials()\n\nconst request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+createCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",children:["credentials.createCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})," - The newly created Credentials",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+updateCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",children:["credentials.updateCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})," - The updated Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John Doe\'s Credentials"\n}\n\ncredentials.updateCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+getCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsgetcredentialsref--promisegetcredentialsresponse",children:["credentials.getCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})," - The Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.getCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+deleteCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsdeletecredentialsref--promisevoid",children:["credentials.deleteCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.deleteCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+listCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",children:["credentials.listCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Credentials from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})," - The list of Credentials in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Credentials to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ncredentials.listCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Domains"}),"\n",(0,r.jsxs)(n.h2,{id:"domains--apiclient",children:["Domains \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get\nand delete Domains. The Domains API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains",children:"Domains"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Domains_new",children:"new Domains(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+createDomain",children:".createDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+updateDomain",children:".updateDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+getDomain",children:".getDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+deleteDomain",children:".deleteDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+listDomains",children:".listDomains(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Domains_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-domainsoptions",children:"new Domains(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Domain API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst domains = new SDK.Domains()\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+createDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainscreatedomainrequest--promisecreatedomainresponse",children:["domains.createDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})," - The newly created Domain",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The FQDN of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+updateDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsupdatedomainrequest--promiseupdatedomainresponse",children:["domains.updateDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})," - The updated Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateDomainRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<CC.EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain updated",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n}\n\ndomains.updateDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+getDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsgetdomainref--promisegetdomainresponse",children:["domains.getDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})," - The Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.getDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+deleteDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsdeletedomainref--promisevoid",children:["domains.deleteDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.deleteDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+listDomains"}),"\n",(0,r.jsxs)(n.h3,{id:"domainslistdomainsrequest--promiselistdomainresponse",children:["domains.listDomains(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Domains from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})," - The list of Domains"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Domains to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ndomains.listDomains(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Numbers"}),"\n",(0,r.jsxs)(n.h2,{id:"numbers--apiclient",children:["Numbers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get\nand delete Numbers. The Number API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers",children:"Numbers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Numbers_new",children:"new Numbers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+createNumber",children:".createNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+updateNumber",children:".updateNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+getNumber",children:".getNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+deleteNumber",children:".deleteNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+listNumbers",children:".listNumbers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Numbers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-numbersoptions",children:"new Numbers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Number API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst numbers = new SDK.Numbers()\n\nconst request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+createNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numberscreatenumberrequest--promisecreatenumberresponse",children:["numbers.createNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})," - The newly created Number",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.telUrl"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The number URI to be used (e.g., te:+1234567890)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.city"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The city where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.country"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.countryISOCode"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country ISO code where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryISOCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+updateNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersupdatenumberrequest--promiseupdatenumberresponse",children:["numbers.updateNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})," - The updated Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateNumberRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<Object>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212 (friendly name)",\n aorLink: "sip:2001@sip.local"\n}\n\nnumbers.updateNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+getNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersgetnumberref--promisegetnumberresponse",children:["numbers.getNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})," - The Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.getNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+deleteNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersdeletenumberref--promisevoid",children:["numbers.deleteNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.deleteNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+listNumbers"}),"\n",(0,r.jsxs)(n.h3,{id:"numberslistnumbersrequest--promiselistnumberresponse",children:["numbers.listNumbers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Numbers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})," - The list of Numbers"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Numbers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Numbers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nnumbers.listNumbers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Peers"}),"\n",(0,r.jsxs)(n.h2,{id:"peers--apiclient",children:["Peers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get\nand delete Peers. The Peers API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers",children:"Peers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Peers_new",children:"new Peers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+createPeer",children:".createPeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+updatePeer",children:".updatePeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+getPeer",children:".getPeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+deletePeer",children:".deletePeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+listPeers",children:".listPeers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Peers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-peersoptions",children:"new Peers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Peer API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst peers = new SDK.Peers()\n\nconst request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+createPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peerscreatepeerrequest--promisecreatepeerresponse",children:["peers.createPeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})," - The newly created Peer",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreatePeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+updatePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersupdatepeerrequest--promiseupdatepeerresponse",children:["peers.updatePeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})," - The updated Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdatePeerRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Feature Server"\n}\n\npeers.updatePeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+getPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersgetpeerref--promisegetpeerresponse",children:["peers.getPeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})," - The Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.getPeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+deletePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersdeletepeerref--promisevoid",children:["peers.deletePeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.deletePeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+listPeers"}),"\n",(0,r.jsxs)(n.h3,{id:"peerslistpeersrequest--promiselistpeerresponse",children:["peers.listPeers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Peers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})," - The list of Peers in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListPeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Peers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Peers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\npeers.listPeers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Trunks"}),"\n",(0,r.jsxs)(n.h2,{id:"trunks--apiclient",children:["Trunks \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get\nand delete Trunks. The Trunks API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks",children:"Trunks"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Trunks_new",children:"new Trunks(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+createTrunk",children:".createTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+updateTrunk",children:".updateTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+getTrunk",children:".getTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+deleteTrunk",children:".deleteTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+listTrunks",children:".listTrunks(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Trunks_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-trunksoptions",children:"new Trunks(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Trunk API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst trunks = new SDK.Trunks()\n\nconst request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+createTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",children:["trunks.createTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})," - The newly created Trunk",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+updateTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",children:["trunks.updateTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})," - The updated Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Trunk from Twilio (US-East)",\n}\n\ntrunks.updateTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+getTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksgettrunkref--promisegettrunkresponse",children:["trunks.getTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})," - The Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.getTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+deleteTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksdeletetrunkref--promisevoid",children:["trunks.deleteTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.deleteTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+listTrunks"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkslisttrunksrequest--promiselisttrunkresponse",children:["trunks.listTrunks(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Trunks from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})," - The list of Trunks in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Trunks"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Trunks to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ntrunks.listTrunks(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var r=s(6540);const d={},t=r.createContext(d);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4591c4c7.11cc3307.js b/assets/js/4591c4c7.11cc3307.js new file mode 100644 index 000000000..2bae847bf --- /dev/null +++ b/assets/js/4591c4c7.11cc3307.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5315],{9011:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var s=t(4848),o=t(8453);const r={sidebar_position:2},i="Installing in Kubernetes",c={id:"connect/quick-start/kubernetes",title:"Installing in Kubernetes",description:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.",source:"@site/versioned_docs/version-2.0.0/connect/quick-start/kubernetes.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/quick-start/kubernetes.md",tags:[],version:"2.0.0",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"}},a={},l=[];function u(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"installing-in-kubernetes",children:"Installing in Kubernetes"}),"\n",(0,s.jsx)(n.p,{children:"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"You can use Minikube or Docker Desktop to create a local Kubernetes cluster."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"First, add the Helm repository:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm repo add routr https://routr.io/charts\nhelm repo update\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then, create a namespace for Routr:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, install Routr with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"helm install sipnet routr/routr-connect --namespace sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n sipnet\n"})}),"\n",(0,s.jsx)(n.p,{children:"You should see a list of pods and their status. If the status is Running, then you are ready to go."}),"\n",(0,s.jsxs)(n.p,{children:["For more details, please refer to the chart's ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/ops/charts/connect/README.md",children:"README"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"Command-Line Tools"})," section for detauls on how to interact with Routr Connect via the CLI."]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>c});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d0c799d.82777be3.js b/assets/js/4d0c799d.c141ba59.js similarity index 98% rename from assets/js/4d0c799d.82777be3.js rename to assets/js/4d0c799d.c141ba59.js index c4654ea07..984f88f5b 100644 --- a/assets/js/4d0c799d.82777be3.js +++ b/assets/js/4d0c799d.c141ba59.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[823],{2260:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>d,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const d={},i="deleteNumber",l={id:"api/numbers/delete",title:"deleteNumber",description:"Removes a Number from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",sourceDirName:"api/numbers",slug:"/api/numbers/delete",permalink:"/docs/1.x.x/api/numbers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"},next:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletenumber",children:"deleteNumber"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Number from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Number."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200", \n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[823],{8949:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>d,metadata:()=>l,toc:()=>c});var s=n(4848),r=n(8453);const d={},i="deleteNumber",l={id:"api/numbers/delete",title:"deleteNumber",description:"Removes a Number from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",sourceDirName:"api/numbers",slug:"/api/numbers/delete",permalink:"/docs/1.x.x/api/numbers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createNumber",permalink:"/docs/1.x.x/api/numbers/create"},next:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"}},o={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletenumber",children:"deleteNumber"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Number from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Number."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200", \n "message": "Successful request"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>l});var s=n(6540);const r={},d=s.createContext(r);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d54d076.07298993.js b/assets/js/4d54d076.07298993.js deleted file mode 100644 index 6abf6532a..000000000 --- a/assets/js/4d54d076.07298993.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1459],{6564:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var i=t(4848),s=t(8453);const o={},r="Contributing Guide",l={id:"contributing",title:"Contributing Guide",description:"* New Contributor Guide",source:"@site/docs/contributing.md",sourceDirName:".",slug:"/contributing",permalink:"/docs/2.0.0/contributing",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/contributing.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/2.0.0/community"},next:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},u={},c=[{value:"Ways to Contribute",id:"ways-to-contribute",level:2},{value:"Come to Meetings",id:"come-to-meetings",level:3},{value:"Find an Issue",id:"find-an-issue",level:2},{value:"Ask for Help",id:"ask-for-help",level:2},{value:"Pull Request Lifecycle",id:"pull-request-lifecycle",level:2},{value:"Development Environment Setup",id:"development-environment-setup",level:2},{value:"Sign your Commits",id:"sign-your-commits",level:2},{value:"DCO",id:"dco",level:3},{value:"Pull Request Checklist",id:"pull-request-checklist",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#contributing-guide",children:"New Contributor Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ways-to-contribute",children:"Ways to Contribute"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#find-an-issue",children:"Find an Issue"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ask-for-help",children:"Ask for Help"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-lifecycle",children:"Pull Request Lifecycle"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#development-environment-setup",children:"Development Environment Setup"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#sign-your-commits",children:"Sign your Commits"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-checklist",children:"Pull Request Checklist"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Welcome! We are glad that you want to contribute to our project! \ud83d\udc96"}),"\n",(0,i.jsx)(n.p,{children:"As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Problems found during setting up a new developer environment"}),"\n",(0,i.jsx)(n.li,{children:"Gaps in our Quickstart Guide or documentation"}),"\n",(0,i.jsx)(n.li,{children:"Bugs in our automation scripts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!"}),"\n",(0,i.jsx)(n.h2,{id:"ways-to-contribute",children:"Ways to Contribute"}),"\n",(0,i.jsx)(n.p,{children:"We welcome many different types of contributions including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"New features"}),"\n",(0,i.jsx)(n.li,{children:"Builds, CI/CD"}),"\n",(0,i.jsx)(n.li,{children:"Bug fixes"}),"\n",(0,i.jsx)(n.li,{children:"Documentation"}),"\n",(0,i.jsx)(n.li,{children:"Issue Triage"}),"\n",(0,i.jsx)(n.li,{children:"Answering questions on Discord/GitHub Discussions"}),"\n",(0,i.jsx)(n.li,{children:"Web design"}),"\n",(0,i.jsx)(n.li,{children:"UI/UX"}),"\n",(0,i.jsx)(n.li,{children:"Communications / Social Media / Blog Posts"}),"\n",(0,i.jsx)(n.li,{children:"Release management"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Not everything happens through a GitHub pull request. Please come to our ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"meetings"})," or ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"contact us"})," and let's discuss how we can work\ntogether."]}),"\n",(0,i.jsx)(n.h3,{id:"come-to-meetings",children:"Come to Meetings"}),"\n",(0,i.jsx)(n.p,{children:"Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don\u2019t have anything you feel like you want to contribute. Just being there is enough!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find out more about our meetings ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"here"}),". You don\u2019t have to turn on your video. The first time you come, introducing yourself is more than enough."]}),"\n",(0,i.jsx)(n.p,{children:"Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences."}),"\n",(0,i.jsx)(n.h2,{id:"find-an-issue",children:"Find an Issue"}),"\n",(0,i.jsxs)(n.p,{children:["We have good first issues for new contributors and help wanted issues suitable for any contributor. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22",children:"good first issue"})," has extra information to help you make your first contribution. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:"help wanted"})," are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request."]}),"\n",(0,i.jsxs)(n.p,{children:["Sometimes there won\u2019t be any issues with these labels. That\u2019s ok! There is likely still something for you to work on. If you want to contribute but you don\u2019t know where to start or can't find a suitable issue, you can reach out to us via ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," and we will help you find something."]}),"\n",(0,i.jsx)(n.p,{children:'Once you see an issue that you\'d like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.'}),"\n",(0,i.jsx)(n.h2,{id:"ask-for-help",children:"Ask for Help"}),"\n",(0,i.jsx)(n.p,{children:"The best way to reach us with a question when contributing is to ask on:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The original github issue"}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," community"]}),"\n",(0,i.jsxs)(n.li,{children:["Our ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-lifecycle",children:"Pull Request Lifecycle"}),"\n",(0,i.jsx)(n.p,{children:"Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request."}),"\n",(0,i.jsx)(n.p,{children:"After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Enhancements in your code"}),"\n",(0,i.jsx)(n.li,{children:"Additional tests or updates to the documentation"}),"\n",(0,i.jsx)(n.li,{children:"Changes in your implementation approach"}),"\n",(0,i.jsx)(n.li,{children:"Dividing your pull request into smaller, more manageable parts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Depending on the project\u2019s roadmap and priorities, you might also be asked to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Delay the integration of your pull request to align with future releases"}),"\n",(0,i.jsx)(n.li,{children:"Close your current pull request and, if needed, open a new one with revised changes"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"development-environment-setup",children:"Development Environment Setup"}),"\n",(0,i.jsxs)(n.p,{children:["See our ",(0,i.jsx)(n.a,{href:"https://routr.io/docs/development/introduction",children:"Development environment setup"})," guide to get started locally or using Gitpod."]}),"\n",(0,i.jsx)(n.h2,{id:"sign-your-commits",children:"Sign your Commits"}),"\n",(0,i.jsx)(n.h3,{id:"dco",children:"DCO"}),"\n",(0,i.jsxs)(n.p,{children:["Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The ",(0,i.jsx)(n.a,{href:"https://probot.github.io/apps/dco/",children:"Developer Certificate of Origin (DCO)"})," is a way to certify that you wrote and have the right to contribute the code you are submitting to the project."]}),"\n",(0,i.jsx)(n.p,{children:"You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"This is my commit message\n\nSigned-off-by: Your Name <your.name@example.com>\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Git has a ",(0,i.jsx)(n.code,{children:"-s"})," command line option to do this automatically:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit -s -m 'This is my commit message'\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit --amend -s\n"})}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-checklist",children:"Pull Request Checklist"}),"\n",(0,i.jsx)(n.p,{children:"When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:"}),"\n",(0,i.jsxs)(n.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code builds and passes tests locally"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code passes our automated checks"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have signed your commits"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have added tests for your code (if applicable)"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have updated the documentation (if applicable)"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var i=t(6540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d54d076.46542fb6.js b/assets/js/4d54d076.46542fb6.js new file mode 100644 index 000000000..af54e04a0 --- /dev/null +++ b/assets/js/4d54d076.46542fb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1459],{913:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var i=t(4848),s=t(8453);const o={},r="Contributing Guide",l={id:"contributing",title:"Contributing Guide",description:"* New Contributor Guide",source:"@site/docs/contributing.md",sourceDirName:".",slug:"/contributing",permalink:"/docs/2.11.5/contributing",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/contributing.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/2.11.5/community"},next:{title:"FAQs",permalink:"/docs/2.11.5/faqs"}},u={},c=[{value:"Ways to Contribute",id:"ways-to-contribute",level:2},{value:"Come to Meetings",id:"come-to-meetings",level:3},{value:"Find an Issue",id:"find-an-issue",level:2},{value:"Ask for Help",id:"ask-for-help",level:2},{value:"Pull Request Lifecycle",id:"pull-request-lifecycle",level:2},{value:"Development Environment Setup",id:"development-environment-setup",level:2},{value:"Sign your Commits",id:"sign-your-commits",level:2},{value:"DCO",id:"dco",level:3},{value:"Pull Request Checklist",id:"pull-request-checklist",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#contributing-guide",children:"New Contributor Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ways-to-contribute",children:"Ways to Contribute"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#find-an-issue",children:"Find an Issue"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ask-for-help",children:"Ask for Help"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-lifecycle",children:"Pull Request Lifecycle"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#development-environment-setup",children:"Development Environment Setup"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#sign-your-commits",children:"Sign your Commits"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#pull-request-checklist",children:"Pull Request Checklist"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Welcome! We are glad that you want to contribute to our project! \ud83d\udc96"}),"\n",(0,i.jsx)(n.p,{children:"As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Problems found during setting up a new developer environment"}),"\n",(0,i.jsx)(n.li,{children:"Gaps in our Quickstart Guide or documentation"}),"\n",(0,i.jsx)(n.li,{children:"Bugs in our automation scripts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!"}),"\n",(0,i.jsx)(n.h2,{id:"ways-to-contribute",children:"Ways to Contribute"}),"\n",(0,i.jsx)(n.p,{children:"We welcome many different types of contributions including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"New features"}),"\n",(0,i.jsx)(n.li,{children:"Builds, CI/CD"}),"\n",(0,i.jsx)(n.li,{children:"Bug fixes"}),"\n",(0,i.jsx)(n.li,{children:"Documentation"}),"\n",(0,i.jsx)(n.li,{children:"Issue Triage"}),"\n",(0,i.jsx)(n.li,{children:"Answering questions on Discord/GitHub Discussions"}),"\n",(0,i.jsx)(n.li,{children:"Web design"}),"\n",(0,i.jsx)(n.li,{children:"UI/UX"}),"\n",(0,i.jsx)(n.li,{children:"Communications / Social Media / Blog Posts"}),"\n",(0,i.jsx)(n.li,{children:"Release management"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Not everything happens through a GitHub pull request. Please come to our ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"meetings"})," or ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"contact us"})," and let's discuss how we can work\ntogether."]}),"\n",(0,i.jsx)(n.h3,{id:"come-to-meetings",children:"Come to Meetings"}),"\n",(0,i.jsx)(n.p,{children:"Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don\u2019t have anything you feel like you want to contribute. Just being there is enough!"}),"\n",(0,i.jsxs)(n.p,{children:["You can find out more about our meetings ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"here"}),". You don\u2019t have to turn on your video. The first time you come, introducing yourself is more than enough."]}),"\n",(0,i.jsx)(n.p,{children:"Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences."}),"\n",(0,i.jsx)(n.h2,{id:"find-an-issue",children:"Find an Issue"}),"\n",(0,i.jsxs)(n.p,{children:["We have good first issues for new contributors and help wanted issues suitable for any contributor. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22",children:"good first issue"})," has extra information to help you make your first contribution. ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:"help wanted"})," are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request."]}),"\n",(0,i.jsxs)(n.p,{children:["Sometimes there won\u2019t be any issues with these labels. That\u2019s ok! There is likely still something for you to work on. If you want to contribute but you don\u2019t know where to start or can't find a suitable issue, you can reach out to us via ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," and we will help you find something."]}),"\n",(0,i.jsx)(n.p,{children:'Once you see an issue that you\'d like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.'}),"\n",(0,i.jsx)(n.h2,{id:"ask-for-help",children:"Ask for Help"}),"\n",(0,i.jsx)(n.p,{children:"The best way to reach us with a question when contributing is to ask on:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The original github issue"}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," community"]}),"\n",(0,i.jsxs)(n.li,{children:["Our ",(0,i.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-lifecycle",children:"Pull Request Lifecycle"}),"\n",(0,i.jsx)(n.p,{children:"Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request."}),"\n",(0,i.jsx)(n.p,{children:"After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Enhancements in your code"}),"\n",(0,i.jsx)(n.li,{children:"Additional tests or updates to the documentation"}),"\n",(0,i.jsx)(n.li,{children:"Changes in your implementation approach"}),"\n",(0,i.jsx)(n.li,{children:"Dividing your pull request into smaller, more manageable parts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Depending on the project\u2019s roadmap and priorities, you might also be asked to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Delay the integration of your pull request to align with future releases"}),"\n",(0,i.jsx)(n.li,{children:"Close your current pull request and, if needed, open a new one with revised changes"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"development-environment-setup",children:"Development Environment Setup"}),"\n",(0,i.jsxs)(n.p,{children:["See our ",(0,i.jsx)(n.a,{href:"https://routr.io/docs/development/introduction",children:"Development environment setup"})," guide to get started locally or using Gitpod."]}),"\n",(0,i.jsx)(n.h2,{id:"sign-your-commits",children:"Sign your Commits"}),"\n",(0,i.jsx)(n.h3,{id:"dco",children:"DCO"}),"\n",(0,i.jsxs)(n.p,{children:["Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The ",(0,i.jsx)(n.a,{href:"https://probot.github.io/apps/dco/",children:"Developer Certificate of Origin (DCO)"})," is a way to certify that you wrote and have the right to contribute the code you are submitting to the project."]}),"\n",(0,i.jsx)(n.p,{children:"You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"This is my commit message\n\nSigned-off-by: Your Name <your.name@example.com>\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Git has a ",(0,i.jsx)(n.code,{children:"-s"})," command line option to do this automatically:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit -s -m 'This is my commit message'\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"git commit --amend -s\n"})}),"\n",(0,i.jsx)(n.h2,{id:"pull-request-checklist",children:"Pull Request Checklist"}),"\n",(0,i.jsx)(n.p,{children:"When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:"}),"\n",(0,i.jsxs)(n.ul,{className:"contains-task-list",children:["\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code builds and passes tests locally"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code passes our automated checks"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have signed your commits"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have added tests for your code (if applicable)"]}),"\n",(0,i.jsxs)(n.li,{className:"task-list-item",children:[(0,i.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have updated the documentation (if applicable)"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>l});var i=t(6540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dcd5895.ca12b02c.js b/assets/js/4dcd5895.ca12b02c.js new file mode 100644 index 000000000..cc09ed32e --- /dev/null +++ b/assets/js/4dcd5895.ca12b02c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6615],{243:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=r(4848),t=r(8453);const i={},o="updateNumber",a={id:"api/numbers/update",title:"updateNumber",description:"Updates an existing Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/update.md",sourceDirName:"api/numbers",slug:"/api/numbers/update",permalink:"/docs/1.x.x/api/numbers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"},next:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"}},c={},d=[];function u(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatenumber",children:"updateNumber"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/numbers/dd50baa4\n{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var s=r(6540);const t={},i=s.createContext(t);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4dcd5895.fb90af12.js b/assets/js/4dcd5895.fb90af12.js deleted file mode 100644 index aea55adfb..000000000 --- a/assets/js/4dcd5895.fb90af12.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6615],{3022:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=r(4848),t=r(8453);const i={},o="updateNumber",a={id:"api/numbers/update",title:"updateNumber",description:"Updates an existing Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/update.md",sourceDirName:"api/numbers",slug:"/api/numbers/update",permalink:"/docs/1.x.x/api/numbers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"},next:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"}},c={},d=[];function u(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatenumber",children:"updateNumber"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/numbers/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Number."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/numbers/dd50baa4\n{\n "apiVersion": "v1beta1",\n "kind": "Number",\n "metadata": {\n "ref": "dd50baa4",\n "gwRef": "gweef506",\n "geoInfo": {\n "city": "City, State",\n "country": "Country",\n "countryISOCode": "US"\n }\n },\n "spec": {\n "location": {\n "telUrl": "tel:0000000000",\n "aorLink": "sip:1001@sip.local"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var s=r(6540);const t={},i=s.createContext(t);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e27cd47.40cb91a8.js b/assets/js/4e27cd47.5f839e63.js similarity index 98% rename from assets/js/4e27cd47.40cb91a8.js rename to assets/js/4e27cd47.5f839e63.js index 5ff8062fd..b5495bae6 100644 --- a/assets/js/4e27cd47.40cb91a8.js +++ b/assets/js/4e27cd47.5f839e63.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8253],{5846:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var s=n(4848),r=n(8453);const o={},d="addEndpoint",i={id:"api/location/create",title:"addEndpoint",description:"Adds an entry into the location table",source:"@site/versioned_docs/version-1.x.x/api/location/create.md",sourceDirName:"api/location",slug:"/api/location/create",permalink:"/docs/1.x.x/api/location/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"},next:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"addendpoint",children:"addEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Adds an entry into the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"POST"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the new entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Supply a json containing an address, port, expires, user values."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method adds an entry to the location table. Useful for end-to-end testing."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/location/sip:guest@guest\n{\n "user": "guest",\n "address": "192.168.1.149",\n "port": 5080,\n "expires": 600\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Added location entry"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>i});var s=n(6540);const r={},o=s.createContext(r);function d(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8253],{5977:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var s=n(4848),r=n(8453);const o={},d="addEndpoint",i={id:"api/location/create",title:"addEndpoint",description:"Adds an entry into the location table",source:"@site/versioned_docs/version-1.x.x/api/location/create.md",sourceDirName:"api/location",slug:"/api/location/create",permalink:"/docs/1.x.x/api/location/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"},next:{title:"evictEndpoint",permalink:"/docs/1.x.x/api/location/delete"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"addendpoint",children:"addEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Adds an entry into the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"POST"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the new entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Supply a json containing an address, port, expires, user values."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method adds an entry to the location table. Useful for end-to-end testing."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/location/sip:guest@guest\n{\n "user": "guest",\n "address": "192.168.1.149",\n "port": 5080,\n "expires": 600\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Added location entry"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>i});var s=n(6540);const r={},o=s.createContext(r);function d(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e3cbe94.0efb67be.js b/assets/js/4e3cbe94.0efb67be.js deleted file mode 100644 index 6f06bca17..000000000 --- a/assets/js/4e3cbe94.0efb67be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6692],{7403:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(4848),s=n(8453);const i={},r="Testing with SEET",c={id:"development/testing-with-seet",title:"Testing with SEET",description:"Coming soon.",source:"@site/docs/development/testing-with-seet.md",sourceDirName:"development",slug:"/development/testing-with-seet",permalink:"/docs/2.0.0/development/testing-with-seet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/testing-with-seet.md",tags:[],version:"current",frontMatter:{}},d={},u=[];function p(t){const e={h1:"h1",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"testing-with-seet",children:"Testing with SEET"}),"\n",(0,o.jsx)(e.p,{children:"Coming soon."})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(p,{...t})}):p(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>c});var o=n(6540);const s={},i=o.createContext(s);function r(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e3cbe94.5e11f413.js b/assets/js/4e3cbe94.5e11f413.js new file mode 100644 index 000000000..5c948a2fc --- /dev/null +++ b/assets/js/4e3cbe94.5e11f413.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6692],{5980:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(4848),s=n(8453);const i={},r="Testing with SEET",c={id:"development/testing-with-seet",title:"Testing with SEET",description:"Coming soon.",source:"@site/docs/development/testing-with-seet.md",sourceDirName:"development",slug:"/development/testing-with-seet",permalink:"/docs/2.11.5/development/testing-with-seet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/testing-with-seet.md",tags:[],version:"current",frontMatter:{}},d={},u=[];function p(t){const e={h1:"h1",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"testing-with-seet",children:"Testing with SEET"}),"\n",(0,o.jsx)(e.p,{children:"Coming soon."})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(p,{...t})}):p(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>r,x:()=>c});var o=n(6540);const s={},i=o.createContext(s);function r(t){const e=o.useContext(i);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),o.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e8389ca.e0a1b70c.js b/assets/js/4e8389ca.e0a1b70c.js new file mode 100644 index 000000000..c98efece9 --- /dev/null +++ b/assets/js/4e8389ca.e0a1b70c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9884],{5547:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>p});var n=t(4848),i=t(8453);const r={},s="Overview",c={id:"development/components/overview",title:"Overview",description:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.",source:"@site/versioned_docs/version-2.0.0/development/components/overview.md",sourceDirName:"development/components",slug:"/development/components/overview",permalink:"/docs/2.0.0/development/components/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/overview.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"},next:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"}},a={},p=[];function d(e){const o={code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502EdgePort 001\u2502\u2502EdgePort 002\u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Message Dispatcher \u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502IM Processor \u2502\u2502Connect Processor \u2502\u2502Twilio Processor\u2502\n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Data APIs & External Services\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n"})}),"\n",(0,n.jsx)(o.p,{children:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it."}),"\n",(0,n.jsx)(o.p,{children:"Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more."})]})}function l(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>c});var n=t(6540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4f841ba9.a40db22a.js b/assets/js/4f841ba9.a40db22a.js new file mode 100644 index 000000000..0f8d5e8f5 --- /dev/null +++ b/assets/js/4f841ba9.a40db22a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7326],{5591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={sidebar_position:1},c="Docker installation",a={id:"connect/quick-start/docker",title:"Docker installation",description:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:',source:"@site/versioned_docs/version-2.0.0/connect/quick-start/docker.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/docker",permalink:"/docs/2.0.0/connect/quick-start/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/quick-start/docker.md",tags:[],version:"2.0.0",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"},next:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"}},i={},l=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"docker-installation",children:"Docker installation"}),"\n",(0,o.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.em,{children:"compose.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n\nvolumes:\n shared:\n'})}),"\n",(0,o.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,o.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see a containers with its status. Your output should look like the one below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,o.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,o.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,o.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:"And here is an example of creating a SIP Domain:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For additional examples, refer to the command line ",(0,o.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation."})]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54969ead.01cf159a.js b/assets/js/54969ead.01cf159a.js deleted file mode 100644 index 58b28431c..000000000 --- a/assets/js/54969ead.01cf159a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[364],{2994:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=n(4848),s=n(8453);const r={},c="Everything about MELT",i={id:"development/metrics-events-logs-and-traces",title:"Everything about MELT",description:"Comin soon.",source:"@site/docs/development/metrics-events-logs-and-traces.md",sourceDirName:"development",slug:"/development/metrics-events-logs-and-traces",permalink:"/docs/2.0.0/development/metrics-events-logs-and-traces",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/metrics-events-logs-and-traces.md",tags:[],version:"current",frontMatter:{}},a={},d=[];function u(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"everything-about-melt",children:"Everything about MELT"}),"\n",(0,o.jsx)(t.p,{children:"Comin soon."})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var o=n(6540);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54969ead.e52b273f.js b/assets/js/54969ead.e52b273f.js new file mode 100644 index 000000000..83f8dfc75 --- /dev/null +++ b/assets/js/54969ead.e52b273f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[364],{4791:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var o=n(4848),s=n(8453);const r={},c="Everything about MELT",i={id:"development/metrics-events-logs-and-traces",title:"Everything about MELT",description:"Comin soon.",source:"@site/docs/development/metrics-events-logs-and-traces.md",sourceDirName:"development",slug:"/development/metrics-events-logs-and-traces",permalink:"/docs/2.11.5/development/metrics-events-logs-and-traces",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/metrics-events-logs-and-traces.md",tags:[],version:"current",frontMatter:{}},a={},d=[];function u(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"everything-about-melt",children:"Everything about MELT"}),"\n",(0,o.jsx)(t.p,{children:"Comin soon."})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var o=n(6540);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5514a4b8.1ab17e54.js b/assets/js/5514a4b8.1ab17e54.js new file mode 100644 index 000000000..e8c31e6e2 --- /dev/null +++ b/assets/js/5514a4b8.1ab17e54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[583],{1658:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=e(4848),i=e(8453);const s={title:"Installation"},r=void 0,a={id:"administration/cli/installation",title:"Installation",description:"To get the Routr Command-Line Tool run the following command:",source:"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",sourceDirName:"administration/cli",slug:"/administration/cli/installation",permalink:"/docs/1.x.x/administration/cli/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/installation.md",tags:[],version:"1.x.x",frontMatter:{title:"Installation"},sidebar:"tutorialSidebar",previous:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"},next:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"}},l={},c=[{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2}];function d(n){const t={blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,o.jsx)(t.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,o.jsx)(t.p,{children:"Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo snap install rctl\n"})}),"\n",(0,o.jsx)(t.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,o.jsx)(t.p,{children:"To log in to a Routr server and being issuing commands run the following commands."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"The current API version is v1beta1"}),"\n"]})]})}function u(n={}){const{wrapper:t}={...(0,i.R)(),...n.components};return t?(0,o.jsx)(t,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}},8453:(n,t,e)=>{e.d(t,{R:()=>r,x:()=>a});var o=e(6540);const i={},s=o.createContext(i);function r(n){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function a(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:r(n.components),o.createElement(s.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/5514a4b8.b85640cf.js b/assets/js/5514a4b8.b85640cf.js deleted file mode 100644 index 62bdfb780..000000000 --- a/assets/js/5514a4b8.b85640cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[583],{405:(n,t,e)=>{e.r(t),e.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=e(4848),i=e(8453);const s={title:"Installation"},r=void 0,a={id:"administration/cli/installation",title:"Installation",description:"To get the Routr Command-Line Tool run the following command:",source:"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",sourceDirName:"administration/cli",slug:"/administration/cli/installation",permalink:"/docs/1.x.x/administration/cli/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/installation.md",tags:[],version:"1.x.x",frontMatter:{title:"Installation"},sidebar:"tutorialSidebar",previous:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"},next:{title:"Remote Access",permalink:"/docs/1.x.x/administration/cli/remote-access"}},l={},c=[{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2}];function d(n){const t={blockquote:"blockquote",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,o.jsx)(t.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,o.jsx)(t.p,{children:"Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"sudo snap install rctl\n"})}),"\n",(0,o.jsx)(t.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,o.jsx)(t.p,{children:"To log in to a Routr server and being issuing commands run the following commands."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsx)(t.p,{children:"The current API version is v1beta1"}),"\n"]})]})}function u(n={}){const{wrapper:t}={...(0,i.R)(),...n.components};return t?(0,o.jsx)(t,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}},8453:(n,t,e)=>{e.d(t,{R:()=>r,x:()=>a});var o=e(6540);const i={},s=o.createContext(i);function r(n){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function a(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:r(n.components),o.createElement(s.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/5816b036.283415f4.js b/assets/js/5816b036.283415f4.js new file mode 100644 index 000000000..70ff90daf --- /dev/null +++ b/assets/js/5816b036.283415f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4860],{5028:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"2.11.5","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.11.5/overview/introduction","docId":"overview/introduction","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/2.11.5/overview/architecture","docId":"overview/architecture","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.11.5/overview/concepts","docId":"overview/concepts","unlisted":false},{"type":"link","label":"Deploy with Docker","href":"/docs/2.11.5/overview/deploy-with-docker","docId":"overview/deploy-with-docker","unlisted":false}]},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.11.5/development/introduction","docId":"development/introduction","unlisted":false},{"type":"link","label":"Quick Start","href":"/docs/2.11.5/development/quick-start","docId":"development/quick-start","unlisted":false},{"type":"link","label":"Development with Gitpod","href":"/docs/2.11.5/development/development-mode-with-gitpod","docId":"development/development-mode-with-gitpod","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.11.5/development/components/overview","docId":"development/components/overview","unlisted":false},{"type":"link","label":"EdgePort","href":"/docs/2.11.5/development/components/edgeport","docId":"development/components/edgeport","unlisted":false},{"type":"link","label":"Message Dispatcher","href":"/docs/2.11.5/development/components/dispatcher","docId":"development/components/dispatcher","unlisted":false},{"type":"link","label":"Location Service","href":"/docs/2.11.5/development/components/location","docId":"development/components/location","unlisted":false},{"type":"link","label":"Registry Service","href":"/docs/2.11.5/development/components/registry","docId":"development/components/registry","unlisted":false},{"type":"link","label":"Requester","href":"/docs/2.11.5/development/components/requester","docId":"development/components/requester","unlisted":false},{"type":"link","label":"RTPRelay","href":"/docs/2.11.5/development/components/rtprelay","docId":"development/components/rtprelay","unlisted":false},{"type":"link","label":"APIServer","href":"/docs/2.11.5/development/components/apiserver","docId":"development/components/apiserver","unlisted":false},{"type":"link","label":"SimpleAuth Service","href":"/docs/2.11.5/development/components/simpleauth","docId":"development/components/simpleauth","unlisted":false}]},{"type":"category","label":"Alterations API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.11.5/development/alterations/overview","docId":"development/alterations/overview","unlisted":false},{"type":"link","label":"Alteration Methods","href":"/docs/2.11.5/development/alterations/methods","docId":"development/alterations/methods","unlisted":false}]},{"type":"link","label":"Building a Processor","href":"/docs/2.11.5/development/building-a-processor","docId":"development/building-a-processor","unlisted":false},{"type":"link","label":"Building a Middleware","href":"/docs/2.11.5/development/building-a-middleware","docId":"development/building-a-middleware","unlisted":false},{"type":"link","label":"Custom data with the APIServer","href":"/docs/2.11.5/development/custom-data-with-the-apiserver","docId":"development/custom-data-with-the-apiserver","unlisted":false},{"type":"link","label":"Extending the Command-Line Tool","href":"/docs/2.11.5/development/extending-the-ctl","docId":"development/extending-the-ctl","unlisted":false}]},{"type":"category","label":"Connect Mode","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.11.5/connect/introduction","docId":"connect/introduction","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.11.5/connect/concepts","docId":"connect/concepts","unlisted":false},{"type":"category","label":"Quick Start","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker installation","href":"/docs/2.11.5/connect/quick-start/docker","docId":"connect/quick-start/docker","unlisted":false},{"type":"link","label":"Installing in Kubernetes","href":"/docs/2.11.5/connect/quick-start/kubernetes","docId":"connect/quick-start/kubernetes","unlisted":false}]},{"type":"category","label":"Command-Line Tool","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.11.5/connect/command-line/overview","docId":"connect/command-line/overview","unlisted":false},{"type":"link","label":"CTL","href":"/docs/2.11.5/connect/command-line/ctl","docId":"connect/command-line/ctl","unlisted":false}]},{"type":"category","label":"Node.js SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.11.5/connect/nodesdk/overview","docId":"connect/nodesdk/overview","unlisted":false},{"type":"link","label":"SDK","href":"/docs/2.11.5/connect/nodesdk/sdk","docId":"connect/nodesdk/sdk","unlisted":false}]},{"type":"link","label":"Home or Office Setup","href":"/docs/2.11.5/connect/home-or-office-setup","docId":"connect/home-or-office-setup","unlisted":false},{"type":"link","label":"WebRTC Support","href":"/docs/2.11.5/connect/webrtc-support","docId":"connect/webrtc-support","unlisted":false},{"type":"link","label":"Securing the Server","href":"/docs/2.11.5/connect/securing-the-server","docId":"connect/securing-the-server","unlisted":false},{"type":"link","label":"Sending Call Events to NATS","href":"/docs/2.11.5/connect/sending-call-events-to-nats","docId":"connect/sending-call-events-to-nats","unlisted":false}]},{"type":"link","label":"Community","href":"/docs/2.11.5/community","docId":"community","unlisted":false},{"type":"link","label":"Contributing Guide","href":"/docs/2.11.5/contributing","docId":"contributing","unlisted":false},{"type":"link","label":"FAQs","href":"/docs/2.11.5/faqs","docId":"faqs","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/2.11.5/changelog","docId":"changelog","unlisted":false}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"Coming soon.","sidebar":"tutorialSidebar"},"community":{"id":"community","title":"Community","description":"We are developing Routr in the open. These are the channels we use for communication and contribution:","sidebar":"tutorialSidebar"},"connect/command-line/ctl":{"id":"connect/command-line/ctl","title":"CTL","description":"Command-Line for Routr server.","sidebar":"tutorialSidebar"},"connect/command-line/overview":{"id":"connect/command-line/overview","title":"Overview","description":"The command-line tool contains all commands you will need to manage your Routr Connect server.","sidebar":"tutorialSidebar"},"connect/concepts":{"id":"connect/concepts","title":"Concepts","description":"The Connect Mode is Routr\'s implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.","sidebar":"tutorialSidebar"},"connect/home-or-office-setup":{"id":"connect/home-or-office-setup","title":"Home or Office Setup","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/introduction":{"id":"connect/introduction","title":"Introduction","description":"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.","sidebar":"tutorialSidebar"},"connect/nodesdk/overview":{"id":"connect/nodesdk/overview","title":"Overview","description":"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.","sidebar":"tutorialSidebar"},"connect/nodesdk/sdk":{"id":"connect/nodesdk/sdk","title":"SDK","description":"* Installation","sidebar":"tutorialSidebar"},"connect/quick-start/docker":{"id":"connect/quick-start/docker","title":"Docker installation","description":"First, create a directory named \\"routr\\". Navigate into the new folder, and then copy the content below:","sidebar":"tutorialSidebar"},"connect/quick-start/kubernetes":{"id":"connect/quick-start/kubernetes","title":"Installing in Kubernetes","description":"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.","sidebar":"tutorialSidebar"},"connect/securing-the-server":{"id":"connect/securing-the-server","title":"Securing the Server","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/sending-call-events-to-nats":{"id":"connect/sending-call-events-to-nats","title":"Sending Call Events to NATS","description":"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:","sidebar":"tutorialSidebar"},"connect/webrtc-support":{"id":"connect/webrtc-support","title":"WebRTC Support","description":"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.","sidebar":"tutorialSidebar"},"contributing":{"id":"contributing","title":"Contributing Guide","description":"* New Contributor Guide","sidebar":"tutorialSidebar"},"development/alterations/methods":{"id":"development/alterations/methods","title":"Alteration Methods","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/alterations/overview":{"id":"development/alterations/overview","title":"Overview","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/building-a-chat-application":{"id":"development/building-a-chat-application","title":"Building a Chat Application","description":"Comin soon."},"development/building-a-middleware":{"id":"development/building-a-middleware","title":"Building a Middleware","description":"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.","sidebar":"tutorialSidebar"},"development/building-a-processor":{"id":"development/building-a-processor","title":"Building a Processor","description":"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.","sidebar":"tutorialSidebar"},"development/building-a-scaip-processor":{"id":"development/building-a-scaip-processor","title":"Building a SCAIP Processor","description":"Comin soon."},"development/components/apiserver":{"id":"development/components/apiserver","title":"APIServer","description":"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.","sidebar":"tutorialSidebar"},"development/components/dispatcher":{"id":"development/components/dispatcher","title":"Message Dispatcher","description":"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.","sidebar":"tutorialSidebar"},"development/components/edgeport":{"id":"development/components/edgeport","title":"EdgePort","description":"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.","sidebar":"tutorialSidebar"},"development/components/location":{"id":"development/components/location","title":"Location Service","description":"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.","sidebar":"tutorialSidebar"},"development/components/overview":{"id":"development/components/overview","title":"Overview","description":"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.","sidebar":"tutorialSidebar"},"development/components/registry":{"id":"development/components/registry","title":"Registry Service","description":"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.","sidebar":"tutorialSidebar"},"development/components/requester":{"id":"development/components/requester","title":"Requester","description":"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.","sidebar":"tutorialSidebar"},"development/components/rtprelay":{"id":"development/components/rtprelay","title":"RTPRelay","description":"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.","sidebar":"tutorialSidebar"},"development/components/simpleauth":{"id":"development/components/simpleauth","title":"SimpleAuth Service","description":"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.","sidebar":"tutorialSidebar"},"development/custom-data-with-the-apiserver":{"id":"development/custom-data-with-the-apiserver","title":"Custom data with the APIServer","description":"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.","sidebar":"tutorialSidebar"},"development/development-mode-with-gitpod":{"id":"development/development-mode-with-gitpod","title":"Development with Gitpod","description":"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.","sidebar":"tutorialSidebar"},"development/extending-the-ctl":{"id":"development/extending-the-ctl","title":"Extending the Command-Line Tool","description":"Routr\'s command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.","sidebar":"tutorialSidebar"},"development/introduction":{"id":"development/introduction","title":"Introduction","description":"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you\'ll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.","sidebar":"tutorialSidebar"},"development/metrics-events-logs-and-traces":{"id":"development/metrics-events-logs-and-traces","title":"Everything about MELT","description":"Comin soon."},"development/orchestration-with-docker":{"id":"development/orchestration-with-docker","title":"Orchestration with Docker","description":"Coming soon."},"development/orchestration-with-kubernetes":{"id":"development/orchestration-with-kubernetes","title":"Orchestration with Kubernetes","description":"Coming soon."},"development/quick-start":{"id":"development/quick-start","title":"Quick Start","description":"Before starting the development, you need to install the following tools:","sidebar":"tutorialSidebar"},"development/testing-with-seet":{"id":"development/testing-with-seet","title":"Testing with SEET","description":"Coming soon."},"faqs":{"id":"faqs","title":"FAQs","description":"What is Routr?","sidebar":"tutorialSidebar"},"overview/architecture":{"id":"overview/architecture","title":"Architecture","description":"Routr\'s architecture diagram","sidebar":"tutorialSidebar"},"overview/concepts":{"id":"overview/concepts","title":"Concepts","description":"Routr\'s approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.","sidebar":"tutorialSidebar"},"overview/deploy-with-docker":{"id":"overview/deploy-with-docker","title":"Deploy with Docker","description":"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.","sidebar":"tutorialSidebar"},"overview/introduction":{"id":"overview/introduction","title":"introduction","description":"Community banner","sidebar":"tutorialSidebar"},"tutorials/deploying-to-civo-with-helm":{"id":"tutorials/deploying-to-civo-with-helm","title":"Deploying to Civo with Helm","description":"Coming soon."},"tutorials/ephemeral-agents-in-the-browser":{"id":"tutorials/ephemeral-agents-in-the-browser","title":"Ephemeral Agents in the Browser","description":"Coming soon."},"tutorials/intercom-system-with-routr-and-kubernetes":{"id":"tutorials/intercom-system-with-routr-and-kubernetes","title":"Intercom System with Routr and Kubernetes","description":"Coming soon."},"tutorials/load-balancing-asterisk-with-routr":{"id":"tutorials/load-balancing-asterisk-with-routr","title":"Load-balancing Asterisk with Routr","description":"Coming soon."}}}}')}}]); \ No newline at end of file diff --git a/assets/js/5a1924d4.161693fb.js b/assets/js/5a1924d4.161693fb.js deleted file mode 100644 index 7c3c9a5e0..000000000 --- a/assets/js/5a1924d4.161693fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2433],{4670:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const i={},s="Concepts",a={id:"connect/concepts",title:"Concepts",description:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.",source:"@site/docs/connect/concepts.md",sourceDirName:"connect",slug:"/connect/concepts",permalink:"/docs/2.0.0/connect/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"},next:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"}},c={},l=[{value:"Agent-to-Agent",id:"agent-to-agent",level:2},{value:"Agent-to-PSTN",id:"agent-to-pstn",level:2},{value:"From-PSTN",id:"from-pstn",level:2},{value:"Peer-to-PSTN",id:"peer-to-pstn",level:2},{value:"Agent-to-Peer",id:"agent-to-peer",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,o.jsx)(n.p,{children:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation."}),"\n",(0,o.jsx)(n.p,{children:'The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.'}),"\n",(0,o.jsx)(n.p,{children:"The following routing types are supported:"}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-agent",children:"Agent-to-Agent"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"agent-to-agent"})," routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n\n- apiVersion: v2beta1\n kind: Agent\n ref: agent-02\n metadata:\n name: Jane Doe\n spec:\n username: "1002"\n domainRef: domain-01\n credentialsRef: credentials-02\n'})}),"\n",(0,o.jsx)(n.p,{children:"With the configuration above, John and Jane can call each other using their usernames."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-pstn",children:"Agent-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["In the Connect Mode, the ",(0,o.jsx)(n.code,{children:"agent-to-pstn"})," routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"egressPolicies"})," section of the Domain resource handles the routing. The examples below show how these resources relate to each other."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n accessControlListRef: acl-01\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Number configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n'})}),"\n",(0,o.jsxs)(n.p,{children:["With the previous configuration, any Agent in the Domain can call the PSTN using the Number ",(0,o.jsx)(n.code,{children:"(910)343-4434"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"from-pstn",children:"From-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"from-pstn"})," routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The ",(0,o.jsx)(n.code,{children:"location"})," section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n aorLink: sip:john@sip.local\n'})}),"\n",(0,o.jsx)(n.p,{children:"You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr."}),"\n",(0,o.jsx)(n.h2,{id:"peer-to-pstn",children:"Peer-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"peer-to-pstn"})," routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike ",(0,o.jsx)(n.code,{children:"agent-to-pstn"}),", this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the ",(0,o.jsx)(n.code,{children:"Trunking"})," resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table."]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-peer",children:"Agent-to-Peer"}),"\n",(0,o.jsxs)(n.p,{children:['This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain\'s boundaries, the Agent must have a valid JWT token in the ',(0,o.jsx)(n.code,{children:"X-Connect-Token"})," header. Incidentally, required claims in the JWT token include fields similar to the ",(0,o.jsx)(n.code,{children:"Agent"})," resource. Here is an example of the payload of a JWT token:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "ref": "agent-01",\n "domainRef": "domain-01",\n "aor": "sip:1001@sip.local",\n "aorLink": "sip:asterisk@default",\n "domain": "sip.local",\n "privacy": "NONE",\n "allowedMethods": ["INVITE", "REGISTER"]\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(6540);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a1924d4.f8ba78ec.js b/assets/js/5a1924d4.f8ba78ec.js new file mode 100644 index 000000000..847008030 --- /dev/null +++ b/assets/js/5a1924d4.f8ba78ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2433],{5939:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const i={},s="Concepts",a={id:"connect/concepts",title:"Concepts",description:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.",source:"@site/docs/connect/concepts.md",sourceDirName:"connect",slug:"/connect/concepts",permalink:"/docs/2.11.5/connect/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/concepts.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.11.5/connect/introduction"},next:{title:"Docker installation",permalink:"/docs/2.11.5/connect/quick-start/docker"}},c={},l=[{value:"Agent-to-Agent",id:"agent-to-agent",level:2},{value:"Agent-to-PSTN",id:"agent-to-pstn",level:2},{value:"From-PSTN",id:"from-pstn",level:2},{value:"Peer-to-PSTN",id:"peer-to-pstn",level:2},{value:"Agent-to-Peer",id:"agent-to-peer",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,o.jsx)(n.p,{children:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation."}),"\n",(0,o.jsx)(n.p,{children:'The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.'}),"\n",(0,o.jsx)(n.p,{children:"The following routing types are supported:"}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-agent",children:"Agent-to-Agent"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"agent-to-agent"})," routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n\n- apiVersion: v2beta1\n kind: Agent\n ref: agent-02\n metadata:\n name: Jane Doe\n spec:\n username: "1002"\n domainRef: domain-01\n credentialsRef: credentials-02\n'})}),"\n",(0,o.jsx)(n.p,{children:"With the configuration above, John and Jane can call each other using their usernames."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-pstn",children:"Agent-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["In the Connect Mode, the ",(0,o.jsx)(n.code,{children:"agent-to-pstn"})," routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"egressPolicies"})," section of the Domain resource handles the routing. The examples below show how these resources relate to each other."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n accessControlListRef: acl-01\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Number configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryIsoCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n'})}),"\n",(0,o.jsxs)(n.p,{children:["With the previous configuration, any Agent in the Domain can call the PSTN using the Number ",(0,o.jsx)(n.code,{children:"(910)343-4434"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"from-pstn",children:"From-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"from-pstn"})," routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The ",(0,o.jsx)(n.code,{children:"location"})," section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryIsoCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n aorLink: sip:john@sip.local\n'})}),"\n",(0,o.jsx)(n.p,{children:"You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr."}),"\n",(0,o.jsx)(n.h2,{id:"peer-to-pstn",children:"Peer-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"peer-to-pstn"})," routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike ",(0,o.jsx)(n.code,{children:"agent-to-pstn"}),", this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the ",(0,o.jsx)(n.code,{children:"Trunking"})," resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table."]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-peer",children:"Agent-to-Peer"}),"\n",(0,o.jsxs)(n.p,{children:['This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain\'s boundaries, the Agent must have a valid JWT token in the ',(0,o.jsx)(n.code,{children:"X-Connect-Token"})," header. Incidentally, required claims in the JWT token include fields similar to the ",(0,o.jsx)(n.code,{children:"Agent"})," resource. Here is an example of the payload of a JWT token:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "ref": "agent-01",\n "domainRef": "domain-01",\n "aor": "sip:1001@sip.local",\n "aorLink": "sip:asterisk@default",\n "domain": "sip.local",\n "privacy": "NONE",\n "allowedMethods": ["INVITE", "REGISTER"]\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(6540);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a510007.03777827.js b/assets/js/5a510007.03777827.js new file mode 100644 index 000000000..83287d76a --- /dev/null +++ b/assets/js/5a510007.03777827.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9012],{5584:(t,o,e)=>{e.r(o),e.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>u});var n=e(4848),i=e(8453);const r={},s="Deploying to Civo with Helm",c={id:"tutorials/deploying-to-civo-with-helm",title:"Deploying to Civo with Helm",description:"Coming soon.",source:"@site/docs/tutorials/deploying-to-civo-with-helm.md",sourceDirName:"tutorials",slug:"/tutorials/deploying-to-civo-with-helm",permalink:"/docs/2.11.5/tutorials/deploying-to-civo-with-helm",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/deploying-to-civo-with-helm.md",tags:[],version:"current",frontMatter:{}},l={},u=[];function d(t){const o={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"deploying-to-civo-with-helm",children:"Deploying to Civo with Helm"}),"\n",(0,n.jsx)(o.p,{children:"Coming soon."})]})}function a(t={}){const{wrapper:o}={...(0,i.R)(),...t.components};return o?(0,n.jsx)(o,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},8453:(t,o,e)=>{e.d(o,{R:()=>s,x:()=>c});var n=e(6540);const i={},r=n.createContext(i);function s(t){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function c(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:s(t.components),n.createElement(r.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/5a510007.f35cb9c6.js b/assets/js/5a510007.f35cb9c6.js deleted file mode 100644 index 3eb882fe2..000000000 --- a/assets/js/5a510007.f35cb9c6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9012],{8671:(t,o,e)=>{e.r(o),e.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>u});var n=e(4848),i=e(8453);const r={},s="Deploying to Civo with Helm",c={id:"tutorials/deploying-to-civo-with-helm",title:"Deploying to Civo with Helm",description:"Coming soon.",source:"@site/docs/tutorials/deploying-to-civo-with-helm.md",sourceDirName:"tutorials",slug:"/tutorials/deploying-to-civo-with-helm",permalink:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/deploying-to-civo-with-helm.md",tags:[],version:"current",frontMatter:{}},l={},u=[];function d(t){const o={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"deploying-to-civo-with-helm",children:"Deploying to Civo with Helm"}),"\n",(0,n.jsx)(o.p,{children:"Coming soon."})]})}function a(t={}){const{wrapper:o}={...(0,i.R)(),...t.components};return o?(0,n.jsx)(o,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},8453:(t,o,e)=>{e.d(o,{R:()=>s,x:()=>c});var n=e(6540);const i={},r=n.createContext(i);function s(t){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function c(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:s(t.components),n.createElement(r.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e82a060.c1d9a442.js b/assets/js/5e82a060.4bdd3262.js similarity index 98% rename from assets/js/5e82a060.c1d9a442.js rename to assets/js/5e82a060.4bdd3262.js index f80db2f1a..59a66deab 100644 --- a/assets/js/5e82a060.c1d9a442.js +++ b/assets/js/5e82a060.4bdd3262.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6038],{6118:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>o});var n=s(4848),r=s(8453);const i={},l="listGateways",a={id:"api/gateways/list",title:"listGateways",description:"This method returns a list of Gateways resources.",source:"@site/versioned_docs/version-1.x.x/api/gateways/list.md",sourceDirName:"api/gateways",slug:"/api/gateways/list",permalink:"/docs/1.x.x/api/gateways/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"},next:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"}},d={},o=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listgateways",children:"listGateways"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>a});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6038],{2485:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>o});var n=s(4848),r=s(8453);const i={},l="listGateways",a={id:"api/gateways/list",title:"listGateways",description:"This method returns a list of Gateways resources.",source:"@site/versioned_docs/version-1.x.x/api/gateways/list.md",sourceDirName:"api/gateways",slug:"/api/gateways/list",permalink:"/docs/1.x.x/api/gateways/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getGateway",permalink:"/docs/1.x.x/api/gateways/get"},next:{title:"updateGateways",permalink:"/docs/1.x.x/api/gateways/update"}},d={},o=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listgateways",children:"listGateways"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/gateways"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Gateways resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>a});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.72a3fe22.js b/assets/js/5ef0e9d6.72a3fe22.js deleted file mode 100644 index cb73cee8d..000000000 --- a/assets/js/5ef0e9d6.72a3fe22.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[911],{8999:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),s=o(8453);const i={},r="Community",c={id:"community",title:"Community",description:"We are developing Routr in the open. These are the channels we use for communication and contribution:",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/2.0.0/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/community.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"},next:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(n.p,{children:"We are developing Routr in the open. These are the channels we use for communication and contribution:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://discord.com/invite/4QWgSz4hTC",children:"Discord community"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub discussions"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Twitter:"})," ",(0,t.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr repository"})," to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsxs)(n.p,{children:["We welcome community contributions! Please see the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING.md"})," file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request."]}),"\n",(0,t.jsxs)(n.p,{children:["Development: ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(n.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(n.p,{children:"We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting."}),"\n",(0,t.jsx)(n.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(n.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(n.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (creator and maintainer)"]}),"\n",(0,t.jsx)(n.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(n.p,{children:["Routr was developed initially by ",(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(n.a,{href:"https://fonoster.com",children:"Fonoster"})," and ",(0,t.jsx)(n.a,{href:"https://camanio.com",children:"Camanio AB"})," sponsored the majority of its development."]})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.b2d2def4.js b/assets/js/5ef0e9d6.b2d2def4.js new file mode 100644 index 000000000..13f8e7ea6 --- /dev/null +++ b/assets/js/5ef0e9d6.b2d2def4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[911],{5548:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=o(4848),s=o(8453);const i={},r="Community",c={id:"community",title:"Community",description:"We are developing Routr in the open. These are the channels we use for communication and contribution:",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/2.11.5/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/community.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sending Call Events to NATS",permalink:"/docs/2.11.5/connect/sending-call-events-to-nats"},next:{title:"Contributing Guide",permalink:"/docs/2.11.5/contributing"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(n.p,{children:"We are developing Routr in the open. These are the channels we use for communication and contribution:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://discord.com/invite/4QWgSz4hTC",children:"Discord community"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub discussions"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Twitter:"})," ",(0,t.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr repository"})," to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsxs)(n.p,{children:["We welcome community contributions! Please see the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING.md"})," file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request."]}),"\n",(0,t.jsxs)(n.p,{children:["Development: ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(n.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(n.p,{children:"We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting."}),"\n",(0,t.jsx)(n.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(n.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(n.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (creator and maintainer)"]}),"\n",(0,t.jsx)(n.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(n.p,{children:["Routr was developed initially by ",(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(n.a,{href:"https://fonoster.com",children:"Fonoster"})," and ",(0,t.jsx)(n.a,{href:"https://camanio.com",children:"Camanio AB"})," sponsored the majority of its development."]})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f06ffd7.ceb3fc26.js b/assets/js/5f06ffd7.ceb3fc26.js new file mode 100644 index 000000000..b1e9d179a --- /dev/null +++ b/assets/js/5f06ffd7.ceb3fc26.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[391],{3744:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"2.0.0","label":"2.0.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-2.0.0","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/overview/introduction","docId":"overview/introduction","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/2.0.0/overview/architecture","docId":"overview/architecture","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/overview/concepts","docId":"overview/concepts","unlisted":false},{"type":"link","label":"Deploy with Docker","href":"/docs/2.0.0/overview/deploy-with-docker","docId":"overview/deploy-with-docker","unlisted":false}]},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/development/introduction","docId":"development/introduction","unlisted":false},{"type":"link","label":"Quick Start","href":"/docs/2.0.0/development/quick-start","docId":"development/quick-start","unlisted":false},{"type":"link","label":"Development with Gitpod","href":"/docs/2.0.0/development/development-mode-with-gitpod","docId":"development/development-mode-with-gitpod","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/components/overview","docId":"development/components/overview","unlisted":false},{"type":"link","label":"EdgePort","href":"/docs/2.0.0/development/components/edgeport","docId":"development/components/edgeport","unlisted":false},{"type":"link","label":"Message Dispatcher","href":"/docs/2.0.0/development/components/dispatcher","docId":"development/components/dispatcher","unlisted":false},{"type":"link","label":"Location Service","href":"/docs/2.0.0/development/components/location","docId":"development/components/location","unlisted":false},{"type":"link","label":"Registry Service","href":"/docs/2.0.0/development/components/registry","docId":"development/components/registry","unlisted":false},{"type":"link","label":"Requester","href":"/docs/2.0.0/development/components/requester","docId":"development/components/requester","unlisted":false},{"type":"link","label":"RTPRelay","href":"/docs/2.0.0/development/components/rtprelay","docId":"development/components/rtprelay","unlisted":false},{"type":"link","label":"APIServer","href":"/docs/2.0.0/development/components/apiserver","docId":"development/components/apiserver","unlisted":false},{"type":"link","label":"SimpleAuth Service","href":"/docs/2.0.0/development/components/simpleauth","docId":"development/components/simpleauth","unlisted":false}]},{"type":"category","label":"Alterations API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/alterations/overview","docId":"development/alterations/overview","unlisted":false},{"type":"link","label":"Alteration Methods","href":"/docs/2.0.0/development/alterations/methods","docId":"development/alterations/methods","unlisted":false}]},{"type":"link","label":"Building a Processor","href":"/docs/2.0.0/development/building-a-processor","docId":"development/building-a-processor","unlisted":false},{"type":"link","label":"Building a Middleware","href":"/docs/2.0.0/development/building-a-middleware","docId":"development/building-a-middleware","unlisted":false},{"type":"link","label":"Custom data with the APIServer","href":"/docs/2.0.0/development/custom-data-with-the-apiserver","docId":"development/custom-data-with-the-apiserver","unlisted":false},{"type":"link","label":"Extending the Command-Line Tool","href":"/docs/2.0.0/development/extending-the-ctl","docId":"development/extending-the-ctl","unlisted":false}]},{"type":"category","label":"Connect Mode","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/connect/introduction","docId":"connect/introduction","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/connect/concepts","docId":"connect/concepts","unlisted":false},{"type":"category","label":"Quick Start","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker installation","href":"/docs/2.0.0/connect/quick-start/docker","docId":"connect/quick-start/docker","unlisted":false},{"type":"link","label":"Installing in Kubernetes","href":"/docs/2.0.0/connect/quick-start/kubernetes","docId":"connect/quick-start/kubernetes","unlisted":false}]},{"type":"category","label":"Command-Line Tool","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/command-line/overview","docId":"connect/command-line/overview","unlisted":false},{"type":"link","label":"CTL","href":"/docs/2.0.0/connect/command-line/ctl","docId":"connect/command-line/ctl","unlisted":false}]},{"type":"category","label":"Node.js SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/nodesdk/overview","docId":"connect/nodesdk/overview","unlisted":false},{"type":"link","label":"SDK","href":"/docs/2.0.0/connect/nodesdk/sdk","docId":"connect/nodesdk/sdk","unlisted":false}]},{"type":"link","label":"Home or Office Setup","href":"/docs/2.0.0/connect/home-or-office-setup","docId":"connect/home-or-office-setup","unlisted":false},{"type":"link","label":"WebRTC Support","href":"/docs/2.0.0/connect/webrtc-support","docId":"connect/webrtc-support","unlisted":false},{"type":"link","label":"Securing the Server","href":"/docs/2.0.0/connect/securing-the-server","docId":"connect/securing-the-server","unlisted":false},{"type":"link","label":"Sending Call Events to NATS","href":"/docs/2.0.0/connect/sending-call-events-to-nats","docId":"connect/sending-call-events-to-nats","unlisted":false}]},{"type":"link","label":"Community","href":"/docs/2.0.0/community","docId":"community","unlisted":false},{"type":"link","label":"Contributing Guide","href":"/docs/2.0.0/contributing","docId":"contributing","unlisted":false},{"type":"link","label":"FAQs","href":"/docs/2.0.0/faqs","docId":"faqs","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/2.0.0/changelog","docId":"changelog","unlisted":false}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"Coming soon.","sidebar":"tutorialSidebar"},"community":{"id":"community","title":"Community","description":"We are developing Routr in the open. These are the channels we use for communication and contribution:","sidebar":"tutorialSidebar"},"connect/command-line/ctl":{"id":"connect/command-line/ctl","title":"CTL","description":"Command-Line for Routr server.","sidebar":"tutorialSidebar"},"connect/command-line/overview":{"id":"connect/command-line/overview","title":"Overview","description":"The command-line tool contains all commands you will need to manage your Routr Connect server.","sidebar":"tutorialSidebar"},"connect/concepts":{"id":"connect/concepts","title":"Concepts","description":"The Connect Mode is Routr\'s implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.","sidebar":"tutorialSidebar"},"connect/home-or-office-setup":{"id":"connect/home-or-office-setup","title":"Home or Office Setup","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/introduction":{"id":"connect/introduction","title":"Introduction","description":"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.","sidebar":"tutorialSidebar"},"connect/nodesdk/overview":{"id":"connect/nodesdk/overview","title":"Overview","description":"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.","sidebar":"tutorialSidebar"},"connect/nodesdk/sdk":{"id":"connect/nodesdk/sdk","title":"SDK","description":"* Installation","sidebar":"tutorialSidebar"},"connect/quick-start/docker":{"id":"connect/quick-start/docker","title":"Docker installation","description":"First, create a directory named \\"routr\\". Navigate into the new folder, and then copy the content below:","sidebar":"tutorialSidebar"},"connect/quick-start/kubernetes":{"id":"connect/quick-start/kubernetes","title":"Installing in Kubernetes","description":"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.","sidebar":"tutorialSidebar"},"connect/securing-the-server":{"id":"connect/securing-the-server","title":"Securing the Server","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/sending-call-events-to-nats":{"id":"connect/sending-call-events-to-nats","title":"Sending Call Events to NATS","description":"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:","sidebar":"tutorialSidebar"},"connect/webrtc-support":{"id":"connect/webrtc-support","title":"WebRTC Support","description":"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.","sidebar":"tutorialSidebar"},"contributing":{"id":"contributing","title":"Contributing Guide","description":"* New Contributor Guide","sidebar":"tutorialSidebar"},"development/alterations/methods":{"id":"development/alterations/methods","title":"Alteration Methods","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/alterations/overview":{"id":"development/alterations/overview","title":"Overview","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/building-a-chat-application":{"id":"development/building-a-chat-application","title":"Building a Chat Application","description":"Comin soon."},"development/building-a-middleware":{"id":"development/building-a-middleware","title":"Building a Middleware","description":"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.","sidebar":"tutorialSidebar"},"development/building-a-processor":{"id":"development/building-a-processor","title":"Building a Processor","description":"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.","sidebar":"tutorialSidebar"},"development/building-a-scaip-processor":{"id":"development/building-a-scaip-processor","title":"Building a SCAIP Processor","description":"Comin soon."},"development/components/apiserver":{"id":"development/components/apiserver","title":"APIServer","description":"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.","sidebar":"tutorialSidebar"},"development/components/dispatcher":{"id":"development/components/dispatcher","title":"Message Dispatcher","description":"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.","sidebar":"tutorialSidebar"},"development/components/edgeport":{"id":"development/components/edgeport","title":"EdgePort","description":"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.","sidebar":"tutorialSidebar"},"development/components/location":{"id":"development/components/location","title":"Location Service","description":"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.","sidebar":"tutorialSidebar"},"development/components/overview":{"id":"development/components/overview","title":"Overview","description":"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.","sidebar":"tutorialSidebar"},"development/components/registry":{"id":"development/components/registry","title":"Registry Service","description":"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.","sidebar":"tutorialSidebar"},"development/components/requester":{"id":"development/components/requester","title":"Requester","description":"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.","sidebar":"tutorialSidebar"},"development/components/rtprelay":{"id":"development/components/rtprelay","title":"RTPRelay","description":"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.","sidebar":"tutorialSidebar"},"development/components/simpleauth":{"id":"development/components/simpleauth","title":"SimpleAuth Service","description":"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.","sidebar":"tutorialSidebar"},"development/custom-data-with-the-apiserver":{"id":"development/custom-data-with-the-apiserver","title":"Custom data with the APIServer","description":"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.","sidebar":"tutorialSidebar"},"development/development-mode-with-gitpod":{"id":"development/development-mode-with-gitpod","title":"Development with Gitpod","description":"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.","sidebar":"tutorialSidebar"},"development/extending-the-ctl":{"id":"development/extending-the-ctl","title":"Extending the Command-Line Tool","description":"Routr\'s command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.","sidebar":"tutorialSidebar"},"development/introduction":{"id":"development/introduction","title":"Introduction","description":"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you\'ll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.","sidebar":"tutorialSidebar"},"development/metrics-events-logs-and-traces":{"id":"development/metrics-events-logs-and-traces","title":"Everything about MELT","description":"Comin soon."},"development/orchestration-with-docker":{"id":"development/orchestration-with-docker","title":"Orchestration with Docker","description":"Coming soon."},"development/orchestration-with-kubernetes":{"id":"development/orchestration-with-kubernetes","title":"Orchestration with Kubernetes","description":"Coming soon."},"development/quick-start":{"id":"development/quick-start","title":"Quick Start","description":"Before starting the development, you need to install the following tools:","sidebar":"tutorialSidebar"},"development/testing-with-seet":{"id":"development/testing-with-seet","title":"Testing with SEET","description":"Coming soon."},"faqs":{"id":"faqs","title":"FAQs","description":"What is Routr?","sidebar":"tutorialSidebar"},"overview/architecture":{"id":"overview/architecture","title":"Architecture","description":"Routr\'s architecture diagram","sidebar":"tutorialSidebar"},"overview/concepts":{"id":"overview/concepts","title":"Concepts","description":"Routr\'s approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.","sidebar":"tutorialSidebar"},"overview/deploy-with-docker":{"id":"overview/deploy-with-docker","title":"Deploy with Docker","description":"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.","sidebar":"tutorialSidebar"},"overview/introduction":{"id":"overview/introduction","title":"introduction","description":"Community banner","sidebar":"tutorialSidebar"},"tutorials/deploying-to-civo-with-helm":{"id":"tutorials/deploying-to-civo-with-helm","title":"Deploying to Civo with Helm","description":"Coming soon."},"tutorials/ephemeral-agents-in-the-browser":{"id":"tutorials/ephemeral-agents-in-the-browser","title":"Ephemeral Agents in the Browser","description":"Coming soon."},"tutorials/intercom-system-with-routr-and-kubernetes":{"id":"tutorials/intercom-system-with-routr-and-kubernetes","title":"Intercom System with Routr and Kubernetes","description":"Coming soon."},"tutorials/load-balancing-asterisk-with-routr":{"id":"tutorials/load-balancing-asterisk-with-routr","title":"Load-balancing Asterisk with Routr","description":"Coming soon."}}}}')}}]); \ No newline at end of file diff --git a/assets/js/638e7455.dd8562a6.js b/assets/js/638e7455.dd8562a6.js new file mode 100644 index 000000000..9b6da9d6c --- /dev/null +++ b/assets/js/638e7455.dd8562a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1071],{4615:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(4848),i=t(8453);const r={},s="Development with Gitpod",a={id:"development/development-mode-with-gitpod",title:"Development with Gitpod",description:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.",source:"@site/versioned_docs/version-2.0.0/development/development-mode-with-gitpod.md",sourceDirName:"development",slug:"/development/development-mode-with-gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/development-mode-with-gitpod.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"},next:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"}},c={},d=[];function l(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"development-with-gitpod",children:"Development with Gitpod"}),"\n",(0,n.jsx)(o.p,{children:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories."}),"\n",(0,n.jsx)(o.p,{children:"To launch a Gitpod workspace, click the button below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/#https://github.com/fonoster/routr",children:(0,n.jsx)(o.img,{src:"https://gitpod.io/button/open-in-gitpod.svg",alt:"Open in Gitpod"})})}),"\n",(0,n.jsx)(o.p,{children:"This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode."}),"\n",(0,n.jsx)(o.p,{children:"While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod."}),"\n",(0,n.jsx)(o.p,{children:"First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/user/keys",children:"https://gitpod.io/user/keys"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod account keys",src:t(6803).A+"",width:"1358",height:"527"})}),"\n",(0,n.jsx)(o.p,{children:"On Linux or macOS, you can find your public key by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat ~/.ssh/id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"Or, if you are using Windows, you can find your public key using this command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat %USERPROFILE%\\.ssh\\id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"If you don't have a public key, you can generate one by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:'ssh-keygen -t rsa -b 4096 -C "your_email@example.com"\n'})}),"\n",(0,n.jsx)(o.p,{children:'Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/workspaces",children:"https://gitpod.io/workspaces"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod workspace",src:t(5430).A+"",width:"1360",height:"588"})}),"\n",(0,n.jsxs)(o.p,{children:["You want to be able to access port ",(0,n.jsx)(o.code,{children:"5060"})," from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that."]}),"\n",(0,n.jsxs)(o.p,{children:["To create the port forward, take the SSH connection string and add ",(0,n.jsx)(o.code,{children:"-L 5060:localhost:5060"})," to the end of the line. For example, your command might look like this:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh <workspace-ssh-connection> -L 5060:localhost:5060\n"})}),"\n",(0,n.jsx)(o.p,{children:'Be sure to replace "workspace SSH connection" with your local connection.'}),"\n",(0,n.jsx)(o.p,{children:"Here is an example of what the command might look like:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 \n"})}),"\n",(0,n.jsxs)(o.p,{children:["This command forwards traffic from your local port ",(0,n.jsx)(o.code,{children:"5060"})," to your Gitpod workspace's port ",(0,n.jsx)(o.code,{children:"5060"}),", allowing you to connect via SIP."]}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command."}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:'This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/main/config/resources",children:"https://github.com/fonoster/routr/blob/main/config/resources"})}),"\n",(0,n.jsx)(o.p,{children:"Feel free to explore these files and make changes as needed."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},6803:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-account-keys-0833e0da64fdd0fa6867611cb583a0fc.png"},5430:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-workspace-9a23cadbc9b3dfdfa8eda64fe4da4475.png"},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(6540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/63bd238e.dad0fc8c.js b/assets/js/63bd238e.dad0fc8c.js new file mode 100644 index 000000000..d4a4a3c51 --- /dev/null +++ b/assets/js/63bd238e.dad0fc8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2512],{3548:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var o=n(4848),r=n(8453);const s={},i="Requester",c={id:"development/components/requester",title:"Requester",description:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.",source:"@site/versioned_docs/version-2.0.0/development/components/requester.md",sourceDirName:"development/components",slug:"/development/components/requester",permalink:"/docs/2.0.0/development/components/requester",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/requester.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"},next:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"}},a={},u=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Requester with Docker",id:"launching-the-requester-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"requester",children:"Requester"}),"\n",(0,o.jsx)(t.p,{children:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses."}),"\n",(0,o.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,o.jsx)(t.p,{children:"The Requester service does not have a configuration file. However the following environment variables are available:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"BIND_ADDR"})," - Address to bind the service (Defaults to ",(0,o.jsx)(t.code,{children:"0.0.0.0:51909"}),")"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"ENABLE_HEALTHCHECKS"})," - Enable health checks (Defaults to ",(0,o.jsx)(t.code,{children:"true"}),")"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,o.jsx)(t.p,{children:"Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,o.jsxs)(t.p,{children:["Link to the ",(0,o.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,o.jsx)(t.h2,{id:"launching-the-requester-with-docker",children:"Launching the Requester with Docker"}),"\n",(0,o.jsxs)(t.p,{children:["The Requester is available as a Docker image from ",(0,o.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-requester",children:"Docker Hub"}),". To launch the Requester with Docker, you can use the following command:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"docker run -it -p 51909:51909 fonoster/routr-requester\n"})}),"\n",(0,o.jsxs)(t.p,{children:["The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port ",(0,o.jsx)(t.code,{children:"51909"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port ",(0,o.jsx)(t.code,{children:"51909"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,o.jsxs)(t.p,{children:["One easy way to interact with the Requester for testing and development is to use ",(0,o.jsx)(t.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Requester using gRPCurl:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto requester.proto -d '{...}' \\\n localhost:51909 \\\n fonoster.routr.requester.v2beta1.Requester/SendMessage\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/64332b0f.849013cf.js b/assets/js/64332b0f.849013cf.js deleted file mode 100644 index f96e5f2b8..000000000 --- a/assets/js/64332b0f.849013cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8329],{4801:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var n=o(4848),r=o(8453);const s={sidebar_position:1},i="Welcome",c={id:"welcome",title:"Welcome",description:"Use the left-hand to navigate to find topics of interest.",source:"@site/versioned_docs/version-1.x.x/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/1.x.x/welcome",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/welcome.md",tags:[],version:"1.x.x",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"}},d={},a=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"welcome",children:"Welcome"}),"\n",(0,n.jsx)(t.p,{children:"Use the left-hand to navigate to find topics of interest."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>c});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/64332b0f.9f16706f.js b/assets/js/64332b0f.9f16706f.js new file mode 100644 index 000000000..7d917cbab --- /dev/null +++ b/assets/js/64332b0f.9f16706f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8329],{46:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var n=o(4848),r=o(8453);const s={sidebar_position:1},i="Welcome",c={id:"welcome",title:"Welcome",description:"Use the left-hand to navigate to find topics of interest.",source:"@site/versioned_docs/version-1.x.x/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/1.x.x/welcome",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/welcome.md",tags:[],version:"1.x.x",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",next:{title:"Overview",permalink:"/docs/1.x.x/introduction/overview"}},d={},a=[];function l(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"welcome",children:"Welcome"}),"\n",(0,n.jsx)(t.p,{children:"Use the left-hand to navigate to find topics of interest."})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>c});var n=o(6540);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/646468fb.28bd5243.js b/assets/js/646468fb.92911e0d.js similarity index 98% rename from assets/js/646468fb.28bd5243.js rename to assets/js/646468fb.92911e0d.js index a1a19bd3d..7aebb12a8 100644 --- a/assets/js/646468fb.28bd5243.js +++ b/assets/js/646468fb.92911e0d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[821],{2013:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="evictEndpoint",d={id:"api/location/delete",title:"evictEndpoint",description:"Evicts an entry from the location table",source:"@site/versioned_docs/version-1.x.x/api/location/delete.md",sourceDirName:"api/location",slug:"/api/location/delete",permalink:"/docs/1.x.x/api/location/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"},next:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"evictendpoint",children:"evictEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Evicts an entry from the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method removes and entry for the give address of record"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/{apiversion}/location/sip:guest@guest\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Location entry evicted"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[821],{5934:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="evictEndpoint",d={id:"api/location/delete",title:"evictEndpoint",description:"Evicts an entry from the location table",source:"@site/versioned_docs/version-1.x.x/api/location/delete.md",sourceDirName:"api/location",slug:"/api/location/delete",permalink:"/docs/1.x.x/api/location/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/location/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"},next:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"evictendpoint",children:"evictEndpoint"}),"\n",(0,s.jsx)(t.p,{children:"Evicts an entry from the location table"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/location/{addressOfRecord}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"addressOfRecord"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Address of record for the entry"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method removes and entry for the give address of record"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/{apiversion}/location/sip:guest@guest\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Location entry evicted"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/656951a7.c9f52622.js b/assets/js/656951a7.ced038dc.js similarity index 97% rename from assets/js/656951a7.c9f52622.js rename to assets/js/656951a7.ced038dc.js index f3389f2b9..baf619074 100644 --- a/assets/js/656951a7.c9f52622.js +++ b/assets/js/656951a7.ced038dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5009],{5523:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>a});var t=s(4848),r=s(8453);const o={},i=void 0,c={id:"api/token",title:"token",description:"This method gets a token for subsequent API calls.",source:"@site/versioned_docs/version-1.x.x/api/token.md",sourceDirName:"api",slug:"/api/token",permalink:"/docs/1.x.x/api/token",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/token.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},d={},a=[];function l(e){const n={code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This method gets a token for subsequent API calls."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/token"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful, this method returns a string with a token."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/token\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Notes"})}),"\n",(0,t.jsx)(n.p,{children:"You must send a basic authentication header with this request."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5009],{3428:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>a});var t=s(4848),r=s(8453);const o={},i=void 0,c={id:"api/token",title:"token",description:"This method gets a token for subsequent API calls.",source:"@site/versioned_docs/version-1.x.x/api/token.md",sourceDirName:"api",slug:"/api/token",permalink:"/docs/1.x.x/api/token",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/token.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerLogs",permalink:"/docs/1.x.x/api/sys/logs"}},d={},a=[];function l(e){const n={code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This method gets a token for subsequent API calls."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"URL"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"/token"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"GET"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,t.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Request body"})}),"\n",(0,t.jsx)(n.p,{children:"Do not supply a request body with this method."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Response"})}),"\n",(0,t.jsx)(n.p,{children:"If successful, this method returns a string with a token."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'GET /api/{apiversion}/token\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Notes"})}),"\n",(0,t.jsx)(n.p,{children:"You must send a basic authentication header with this request."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var t=s(6540);const r={},o=t.createContext(r);function i(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/67679d6c.a616f1b5.js b/assets/js/67679d6c.a616f1b5.js new file mode 100644 index 000000000..6d605c55d --- /dev/null +++ b/assets/js/67679d6c.a616f1b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4133],{6353:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>a});var o=n(4848),s=n(8453);const r={},c="Everything about MELT",i={id:"development/metrics-events-logs-and-traces",title:"Everything about MELT",description:"Comin soon.",source:"@site/versioned_docs/version-2.0.0/development/metrics-events-logs-and-traces.md",sourceDirName:"development",slug:"/development/metrics-events-logs-and-traces",permalink:"/docs/2.0.0/development/metrics-events-logs-and-traces",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/metrics-events-logs-and-traces.md",tags:[],version:"2.0.0",frontMatter:{}},d={},a=[];function u(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"everything-about-melt",children:"Everything about MELT"}),"\n",(0,o.jsx)(t.p,{children:"Comin soon."})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var o=n(6540);const s={},r=o.createContext(s);function c(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6a8a88b7.3e5506cb.js b/assets/js/6a8a88b7.3e5506cb.js new file mode 100644 index 000000000..11b635df2 --- /dev/null +++ b/assets/js/6a8a88b7.3e5506cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3244],{9967:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=t(4848),r=t(8453);const s={},i="Introduction",c={id:"development/introduction",title:"Introduction",description:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.",source:"@site/docs/development/introduction.md",sourceDirName:"development",slug:"/development/introduction",permalink:"/docs/2.11.5/development/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploy with Docker",permalink:"/docs/2.11.5/overview/deploy-with-docker"},next:{title:"Quick Start",permalink:"/docs/2.11.5/development/quick-start"}},l={},d=[{value:"How to read this section",id:"how-to-read-this-section",level:2},{value:"Tooling and dependencies",id:"tooling-and-dependencies",level:2}];function a(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(o.p,{children:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware."}),"\n",(0,n.jsx)(o.p,{children:"Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool."}),"\n",(0,n.jsx)(o.h2,{id:"how-to-read-this-section",children:"How to read this section"}),"\n",(0,n.jsx)(o.p,{children:"The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most."}),"\n",(0,n.jsx)(o.h2,{id:"tooling-and-dependencies",children:"Tooling and dependencies"}),"\n",(0,n.jsx)(o.p,{children:"The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://www.docker.com/",children:"Docker"}),": We use Docker to build and run individual components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://docs.docker.com/compose/",children:"Docker Compose"}),": We use Docker Compose to orchestrate the components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://helm.sh/",children:"Helm"}),": Helm helps us to deploy Routr in Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),": Kubernetes is the platform where we deploy Routr for large scale deployments"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",children:"Kubectl"}),": Kubectl is the command-line tool for Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/irontec/sngrep",children:"sngrep"}),": A tool for monitoring SIP traffic (You could use Wireshark as well)"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/fullstorydev/grpcurl",children:"grpcurl"}),": A command-line tool for interacting with gRPC servers"]}),"\n"]}),"\n",(0,n.jsxs)(o.p,{children:["If you don't have a Kubernetes cluster, you can use ",(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-minikube/",children:"Minikube"})," or Docker Desktop with Kubernetes enabled."]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>c});var n=t(6540);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6a8a88b7.4d11689b.js b/assets/js/6a8a88b7.4d11689b.js deleted file mode 100644 index 7332d90cd..000000000 --- a/assets/js/6a8a88b7.4d11689b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3244],{4846:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=t(4848),r=t(8453);const s={},i="Introduction",c={id:"development/introduction",title:"Introduction",description:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.",source:"@site/docs/development/introduction.md",sourceDirName:"development",slug:"/development/introduction",permalink:"/docs/2.0.0/development/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"},next:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"}},l={},d=[{value:"How to read this section",id:"how-to-read-this-section",level:2},{value:"Tooling and dependencies",id:"tooling-and-dependencies",level:2}];function a(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(o.p,{children:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware."}),"\n",(0,n.jsx)(o.p,{children:"Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool."}),"\n",(0,n.jsx)(o.h2,{id:"how-to-read-this-section",children:"How to read this section"}),"\n",(0,n.jsx)(o.p,{children:"The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most."}),"\n",(0,n.jsx)(o.h2,{id:"tooling-and-dependencies",children:"Tooling and dependencies"}),"\n",(0,n.jsx)(o.p,{children:"The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://www.docker.com/",children:"Docker"}),": We use Docker to build and run individual components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://docs.docker.com/compose/",children:"Docker Compose"}),": We use Docker Compose to orchestrate the components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://helm.sh/",children:"Helm"}),": Helm helps us to deploy Routr in Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),": Kubernetes is the platform where we deploy Routr for large scale deployments"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",children:"Kubectl"}),": Kubectl is the command-line tool for Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/irontec/sngrep",children:"sngrep"}),": A tool for monitoring SIP traffic (You could use Wireshark as well)"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/fullstorydev/grpcurl",children:"grpcurl"}),": A command-line tool for interacting with gRPC servers"]}),"\n"]}),"\n",(0,n.jsxs)(o.p,{children:["If you don't have a Kubernetes cluster, you can use ",(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-minikube/",children:"Minikube"})," or Docker Desktop with Kubernetes enabled."]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>c});var n=t(6540);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c14cd7d.f1e17186.js b/assets/js/6c14cd7d.143b0b15.js similarity index 98% rename from assets/js/6c14cd7d.f1e17186.js rename to assets/js/6c14cd7d.143b0b15.js index 34d2f9194..36a875c29 100644 --- a/assets/js/6c14cd7d.f1e17186.js +++ b/assets/js/6c14cd7d.143b0b15.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6341],{5655:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var s=n(4848),r=n(8453);const i={},l="listNumbers",d={id:"api/numbers/list",title:"listNumbers",description:"This method returns a list of Numbers.",source:"@site/versioned_docs/version-1.x.x/api/numbers/list.md",sourceDirName:"api/numbers",slug:"/api/numbers/list",permalink:"/docs/1.x.x/api/numbers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"},next:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listnumbers",children:"listNumbers"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6341],{6446:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var s=n(4848),r=n(8453);const i={},l="listNumbers",d={id:"api/numbers/list",title:"listNumbers",description:"This method returns a list of Numbers.",source:"@site/versioned_docs/version-1.x.x/api/numbers/list.md",sourceDirName:"api/numbers",slug:"/api/numbers/list",permalink:"/docs/1.x.x/api/numbers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getNumber",permalink:"/docs/1.x.x/api/numbers/get"},next:{title:"updateNumber",permalink:"/docs/1.x.x/api/numbers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listnumbers",children:"listNumbers"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/numbers"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Numbers."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6c35bbce.00ee5040.js b/assets/js/6c35bbce.07883798.js similarity index 98% rename from assets/js/6c35bbce.00ee5040.js rename to assets/js/6c35bbce.07883798.js index 25a2ba246..289951a70 100644 --- a/assets/js/6c35bbce.00ee5040.js +++ b/assets/js/6c35bbce.07883798.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4862],{3653:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l="listAgents",d={id:"api/agents/list",title:"listAgents",description:"This method returns a list of Agent resources.",source:"@site/versioned_docs/version-1.x.x/api/agents/list.md",sourceDirName:"api/agents",slug:"/api/agents/list",permalink:"/docs/1.x.x/api/agents/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"},next:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"}},o={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listagents",children:"listAgents"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4862],{5814:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l="listAgents",d={id:"api/agents/list",title:"listAgents",description:"This method returns a list of Agent resources.",source:"@site/versioned_docs/version-1.x.x/api/agents/list.md",sourceDirName:"api/agents",slug:"/api/agents/list",permalink:"/docs/1.x.x/api/agents/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getAgent",permalink:"/docs/1.x.x/api/agents/get"},next:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"}},o={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listagents",children:"listAgents"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Agent resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e2907e5.766a8f96.js b/assets/js/6e2907e5.dd856be2.js similarity index 97% rename from assets/js/6e2907e5.766a8f96.js rename to assets/js/6e2907e5.dd856be2.js index f74065485..d6df37373 100644 --- a/assets/js/6e2907e5.766a8f96.js +++ b/assets/js/6e2907e5.dd856be2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4366],{8213:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(4848),t=n(8453);const o={},i="getServerLogs",c={id:"api/sys/logs",title:"getServerLogs",description:"This method returns logs from the server",source:"@site/versioned_docs/version-1.x.x/api/sys/logs.md",sourceDirName:"api/sys",slug:"/api/sys/logs",permalink:"/docs/1.x.x/api/sys/logs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/logs.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"},next:{title:"token",permalink:"/docs/1.x.x/api/token"}},d={},l=[];function a(e){const s={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"getserverlogs",children:"getServerLogs"}),"\n",(0,r.jsx)(s.p,{children:"This method returns logs from the server"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"URL"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"/system/logs"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Method"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"GET"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(s.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Request body"})}),"\n",(0,r.jsx)(s.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Response"})}),"\n",(0,r.jsx)(s.p,{children:"If successful this method returns logging information from the server."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'GET /api/{apiversion}/system/logs\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":"[DEBUG] 2020-04-13 12:29:49.785..."\n}\n'})})]})}function p(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>c});var r=n(6540);const t={},o=r.createContext(t);function i(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4366],{6384:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var r=n(4848),t=n(8453);const o={},i="getServerLogs",c={id:"api/sys/logs",title:"getServerLogs",description:"This method returns logs from the server",source:"@site/versioned_docs/version-1.x.x/api/sys/logs.md",sourceDirName:"api/sys",slug:"/api/sys/logs",permalink:"/docs/1.x.x/api/sys/logs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/sys/logs.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"},next:{title:"token",permalink:"/docs/1.x.x/api/token"}},d={},l=[];function a(e){const s={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"getserverlogs",children:"getServerLogs"}),"\n",(0,r.jsx)(s.p,{children:"This method returns logs from the server"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"URL"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"/system/logs"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Method"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"GET"})}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(s.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Request body"})}),"\n",(0,r.jsx)(s.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Response"})}),"\n",(0,r.jsx)(s.p,{children:"If successful this method returns logging information from the server."}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'GET /api/{apiversion}/system/logs\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status":200,\n "message":"Successful request",\n "data":"[DEBUG] 2020-04-13 12:29:49.785..."\n}\n'})})]})}function p(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>c});var r=n(6540);const t={},o=r.createContext(t);function i(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e84f360.7cf065d9.js b/assets/js/6e84f360.7cf065d9.js new file mode 100644 index 000000000..073108bcb --- /dev/null +++ b/assets/js/6e84f360.7cf065d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5719],{4275:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var t=i(4848),s=i(8453);const o={},r="Contributing Guide",l={id:"contributing",title:"Contributing Guide",description:"* New Contributor Guide",source:"@site/versioned_docs/version-2.0.0/contributing.md",sourceDirName:".",slug:"/contributing",permalink:"/docs/2.0.0/contributing",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/contributing.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Community",permalink:"/docs/2.0.0/community"},next:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},u={},c=[{value:"Ways to Contribute",id:"ways-to-contribute",level:2},{value:"Come to Meetings",id:"come-to-meetings",level:3},{value:"Find an Issue",id:"find-an-issue",level:2},{value:"Ask for Help",id:"ask-for-help",level:2},{value:"Pull Request Lifecycle",id:"pull-request-lifecycle",level:2},{value:"Development Environment Setup",id:"development-environment-setup",level:2},{value:"Sign your Commits",id:"sign-your-commits",level:2},{value:"DCO",id:"dco",level:3},{value:"Pull Request Checklist",id:"pull-request-checklist",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",input:"input",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"contributing-guide",children:"Contributing Guide"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#contributing-guide",children:"New Contributor Guide"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ways-to-contribute",children:"Ways to Contribute"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#find-an-issue",children:"Find an Issue"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#ask-for-help",children:"Ask for Help"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#pull-request-lifecycle",children:"Pull Request Lifecycle"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#development-environment-setup",children:"Development Environment Setup"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#sign-your-commits",children:"Sign your Commits"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#pull-request-checklist",children:"Pull Request Checklist"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Welcome! We are glad that you want to contribute to our project! \ud83d\udc96"}),"\n",(0,t.jsx)(n.p,{children:"As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Problems found during setting up a new developer environment"}),"\n",(0,t.jsx)(n.li,{children:"Gaps in our Quickstart Guide or documentation"}),"\n",(0,t.jsx)(n.li,{children:"Bugs in our automation scripts"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!"}),"\n",(0,t.jsx)(n.h2,{id:"ways-to-contribute",children:"Ways to Contribute"}),"\n",(0,t.jsx)(n.p,{children:"We welcome many different types of contributions including:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"New features"}),"\n",(0,t.jsx)(n.li,{children:"Builds, CI/CD"}),"\n",(0,t.jsx)(n.li,{children:"Bug fixes"}),"\n",(0,t.jsx)(n.li,{children:"Documentation"}),"\n",(0,t.jsx)(n.li,{children:"Issue Triage"}),"\n",(0,t.jsx)(n.li,{children:"Answering questions on Discord/GitHub Discussions"}),"\n",(0,t.jsx)(n.li,{children:"Web design"}),"\n",(0,t.jsx)(n.li,{children:"UI/UX"}),"\n",(0,t.jsx)(n.li,{children:"Communications / Social Media / Blog Posts"}),"\n",(0,t.jsx)(n.li,{children:"Release management"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Not everything happens through a GitHub pull request. Please come to our ",(0,t.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"meetings"})," or ",(0,t.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"contact us"})," and let's discuss how we can work\ntogether."]}),"\n",(0,t.jsx)(n.h3,{id:"come-to-meetings",children:"Come to Meetings"}),"\n",(0,t.jsx)(n.p,{children:"Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don\u2019t have anything you feel like you want to contribute. Just being there is enough!"}),"\n",(0,t.jsxs)(n.p,{children:["You can find out more about our meetings ",(0,t.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"here"}),". You don\u2019t have to turn on your video. The first time you come, introducing yourself is more than enough."]}),"\n",(0,t.jsx)(n.p,{children:"Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences."}),"\n",(0,t.jsx)(n.h2,{id:"find-an-issue",children:"Find an Issue"}),"\n",(0,t.jsxs)(n.p,{children:["We have good first issues for new contributors and help wanted issues suitable for any contributor. ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22",children:"good first issue"})," has extra information to help you make your first contribution. ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22",children:"help wanted"})," are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request."]}),"\n",(0,t.jsxs)(n.p,{children:["Sometimes there won\u2019t be any issues with these labels. That\u2019s ok! There is likely still something for you to work on. If you want to contribute but you don\u2019t know where to start or can't find a suitable issue, you can reach out to us via ",(0,t.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," or ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," and we will help you find something."]}),"\n",(0,t.jsx)(n.p,{children:'Once you see an issue that you\'d like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.'}),"\n",(0,t.jsx)(n.h2,{id:"ask-for-help",children:"Ask for Help"}),"\n",(0,t.jsx)(n.p,{children:"The best way to reach us with a question when contributing is to ask on:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The original github issue"}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsx)(n.a,{href:"https://discord.gg/4QWgSz4hTC",children:"Discord"})," community"]}),"\n",(0,t.jsxs)(n.li,{children:["Our ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"pull-request-lifecycle",children:"Pull Request Lifecycle"}),"\n",(0,t.jsx)(n.p,{children:"Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request."}),"\n",(0,t.jsx)(n.p,{children:"After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Enhancements in your code"}),"\n",(0,t.jsx)(n.li,{children:"Additional tests or updates to the documentation"}),"\n",(0,t.jsx)(n.li,{children:"Changes in your implementation approach"}),"\n",(0,t.jsx)(n.li,{children:"Dividing your pull request into smaller, more manageable parts"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Depending on the project\u2019s roadmap and priorities, you might also be asked to:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Delay the integration of your pull request to align with future releases"}),"\n",(0,t.jsx)(n.li,{children:"Close your current pull request and, if needed, open a new one with revised changes"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"development-environment-setup",children:"Development Environment Setup"}),"\n",(0,t.jsxs)(n.p,{children:["See our ",(0,t.jsx)(n.a,{href:"https://routr.io/docs/development/introduction",children:"Development environment setup"})," guide to get started locally or using Gitpod."]}),"\n",(0,t.jsx)(n.h2,{id:"sign-your-commits",children:"Sign your Commits"}),"\n",(0,t.jsx)(n.h3,{id:"dco",children:"DCO"}),"\n",(0,t.jsxs)(n.p,{children:["Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The ",(0,t.jsx)(n.a,{href:"https://probot.github.io/apps/dco/",children:"Developer Certificate of Origin (DCO)"})," is a way to certify that you wrote and have the right to contribute the code you are submitting to the project."]}),"\n",(0,t.jsx)(n.p,{children:"You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"This is my commit message\n\nSigned-off-by: Your Name <your.name@example.com>\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Git has a ",(0,t.jsx)(n.code,{children:"-s"})," command line option to do this automatically:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"git commit -s -m 'This is my commit message'\n"})}),"\n",(0,t.jsx)(n.p,{children:"If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"git commit --amend -s\n"})}),"\n",(0,t.jsx)(n.h2,{id:"pull-request-checklist",children:"Pull Request Checklist"}),"\n",(0,t.jsx)(n.p,{children:"When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:"}),"\n",(0,t.jsxs)(n.ul,{className:"contains-task-list",children:["\n",(0,t.jsxs)(n.li,{className:"task-list-item",children:[(0,t.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code builds and passes tests locally"]}),"\n",(0,t.jsxs)(n.li,{className:"task-list-item",children:[(0,t.jsx)(n.input,{type:"checkbox",disabled:!0})," ","Your code passes our automated checks"]}),"\n",(0,t.jsxs)(n.li,{className:"task-list-item",children:[(0,t.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have signed your commits"]}),"\n",(0,t.jsxs)(n.li,{className:"task-list-item",children:[(0,t.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have added tests for your code (if applicable)"]}),"\n",(0,t.jsxs)(n.li,{className:"task-list-item",children:[(0,t.jsx)(n.input,{type:"checkbox",disabled:!0})," ","You have updated the documentation (if applicable)"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(6540);const s={},o=t.createContext(s);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e8a13e2.cd6b5ab3.js b/assets/js/6e8a13e2.cd6b5ab3.js new file mode 100644 index 000000000..ae4b7b226 --- /dev/null +++ b/assets/js/6e8a13e2.cd6b5ab3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7176],{365:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"1.x.x","label":"1.x.x","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-1.x.x","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/1.x.x/welcome","docId":"welcome","unlisted":false},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/1.x.x/introduction/overview","docId":"introduction/overview","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/introduction/installation","docId":"introduction/installation","unlisted":false},{"type":"link","label":"Comparison","href":"/docs/1.x.x/introduction/comparison","docId":"introduction/comparison","unlisted":false},{"type":"link","label":"Community","href":"/docs/1.x.x/introduction/community","docId":"introduction/community","unlisted":false},{"type":"link","label":"Roadmap","href":"/docs/1.x.x/introduction/roadmap","docId":"introduction/roadmap","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/1.x.x/introduction/faq","docId":"introduction/faq","unlisted":false},{"type":"link","label":"Glossary","href":"/docs/1.x.x/introduction/glossary","docId":"introduction/glossary","unlisted":false},{"type":"link","label":"Media","href":"/docs/1.x.x/introduction/media","docId":"introduction/media","unlisted":false},{"type":"link","label":"Routr 1.0RC3 - User Location Lookup Performance Tests","href":"/docs/1.x.x/introduction/performance-tests/user-location","docId":"introduction/performance-tests/user-location","unlisted":false},{"type":"link","label":"Test Plan","href":"/docs/1.x.x/introduction/test-plan","docId":"introduction/test-plan","unlisted":false}]},{"type":"link","label":"Concepts","href":"/docs/1.x.x/concepts","docId":"concepts","unlisted":false},{"type":"category","label":"Administration","items":[{"type":"link","label":"Cheatsheet","href":"/docs/1.x.x/administration/cli/cheatsheet","docId":"administration/cli/cheatsheet","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/administration/cli/installation","docId":"administration/cli/installation","unlisted":false},{"type":"link","label":"Remote Access","href":"/docs/1.x.x/administration/cli/remote-access","docId":"administration/cli/remote-access","unlisted":false},{"type":"link","label":"WebUI","href":"/docs/1.x.x/administration/webconsole","docId":"administration/webconsole","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Configuration","items":[{"type":"link","label":"Agents","href":"/docs/1.x.x/configuration/agents","docId":"configuration/agents","unlisted":false},{"type":"link","label":"Domains","href":"/docs/1.x.x/configuration/domains","docId":"configuration/domains","unlisted":false},{"type":"link","label":"Gateways","href":"/docs/1.x.x/configuration/gateways","docId":"configuration/gateways","unlisted":false},{"type":"link","label":"General","href":"/docs/1.x.x/configuration/general","docId":"configuration/general","unlisted":false},{"type":"link","label":"Numbers","href":"/docs/1.x.x/configuration/numbers","docId":"configuration/numbers","unlisted":false},{"type":"link","label":"Peers","href":"/docs/1.x.x/configuration/peers","docId":"configuration/peers","unlisted":false},{"type":"link","label":"Users","href":"/docs/1.x.x/configuration/users","docId":"configuration/users","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Guides","items":[{"type":"link","label":"Basic Setup","href":"/docs/1.x.x/guides/basic-setup","docId":"guides/basic-setup","unlisted":false},{"type":"link","label":"Routr as Asterisk frontend","href":"/docs/1.x.x/guides/routr-as-asterisk-frontend","docId":"guides/routr-as-asterisk-frontend","unlisted":false},{"type":"link","label":"Running on Kubernetes","href":"/docs/1.x.x/guides/running-on-kubernetes","docId":"guides/running-on-kubernetes","unlisted":false},{"type":"link","label":"Running with Docker","href":"/docs/1.x.x/guides/running-with-docker-or-compose","docId":"guides/running-with-docker-or-compose","unlisted":false},{"type":"link","label":"Securing the signaling path","href":"/docs/1.x.x/guides/securing-the-signaling-path","docId":"guides/securing-the-signaling-path","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"API Docs","items":[{"type":"link","label":"overview","href":"/docs/1.x.x/api/overview","docId":"api/overview","unlisted":false},{"type":"link","label":"createAgent","href":"/docs/1.x.x/api/agents/create","docId":"api/agents/create","unlisted":false},{"type":"link","label":"deleteAgent","href":"/docs/1.x.x/api/agents/delete","docId":"api/agents/delete","unlisted":false},{"type":"link","label":"getAgent","href":"/docs/1.x.x/api/agents/get","docId":"api/agents/get","unlisted":false},{"type":"link","label":"listAgents","href":"/docs/1.x.x/api/agents/list","docId":"api/agents/list","unlisted":false},{"type":"link","label":"updateAgent","href":"/docs/1.x.x/api/agents/update","docId":"api/agents/update","unlisted":false},{"type":"link","label":"getConfiguration","href":"/docs/1.x.x/api/config/get","docId":"api/config/get","unlisted":false},{"type":"link","label":"updateConfiguration","href":"/docs/1.x.x/api/config/update","docId":"api/config/update","unlisted":false},{"type":"link","label":"createDomain","href":"/docs/1.x.x/api/domains/create","docId":"api/domains/create","unlisted":false},{"type":"link","label":"deleteDomain","href":"/docs/1.x.x/api/domains/delete","docId":"api/domains/delete","unlisted":false},{"type":"link","label":"getDomain","href":"/docs/1.x.x/api/domains/get","docId":"api/domains/get","unlisted":false},{"type":"link","label":"listDomains","href":"/docs/1.x.x/api/domains/list","docId":"api/domains/list","unlisted":false},{"type":"link","label":"updateDomain","href":"/docs/1.x.x/api/domains/update","docId":"api/domains/update","unlisted":false},{"type":"link","label":"createGateway","href":"/docs/1.x.x/api/gateways/create","docId":"api/gateways/create","unlisted":false},{"type":"link","label":"deleteGateway","href":"/docs/1.x.x/api/gateways/delete","docId":"api/gateways/delete","unlisted":false},{"type":"link","label":"getGateway","href":"/docs/1.x.x/api/gateways/get","docId":"api/gateways/get","unlisted":false},{"type":"link","label":"listGateways","href":"/docs/1.x.x/api/gateways/list","docId":"api/gateways/list","unlisted":false},{"type":"link","label":"updateGateways","href":"/docs/1.x.x/api/gateways/update","docId":"api/gateways/update","unlisted":false},{"type":"link","label":"addEndpoint","href":"/docs/1.x.x/api/location/create","docId":"api/location/create","unlisted":false},{"type":"link","label":"evictEndpoint","href":"/docs/1.x.x/api/location/delete","docId":"api/location/delete","unlisted":false},{"type":"link","label":"listEndpoints","href":"/docs/1.x.x/api/location/list","docId":"api/location/list","unlisted":false},{"type":"link","label":"createNumber","href":"/docs/1.x.x/api/numbers/create","docId":"api/numbers/create","unlisted":false},{"type":"link","label":"deleteNumber","href":"/docs/1.x.x/api/numbers/delete","docId":"api/numbers/delete","unlisted":false},{"type":"link","label":"getNumber","href":"/docs/1.x.x/api/numbers/get","docId":"api/numbers/get","unlisted":false},{"type":"link","label":"listNumbers","href":"/docs/1.x.x/api/numbers/list","docId":"api/numbers/list","unlisted":false},{"type":"link","label":"updateNumber","href":"/docs/1.x.x/api/numbers/update","docId":"api/numbers/update","unlisted":false},{"type":"link","label":"createPeer","href":"/docs/1.x.x/api/peers/create","docId":"api/peers/create","unlisted":false},{"type":"link","label":"deletePeer","href":"/docs/1.x.x/api/peers/delete","docId":"api/peers/delete","unlisted":false},{"type":"link","label":"getPeer","href":"/docs/1.x.x/api/peers/get","docId":"api/peers/get","unlisted":false},{"type":"link","label":"listPeers","href":"/docs/1.x.x/api/peers/list","docId":"api/peers/list","unlisted":false},{"type":"link","label":"updatePeer","href":"/docs/1.x.x/api/peers/update","docId":"api/peers/update","unlisted":false},{"type":"link","label":"registry","href":"/docs/1.x.x/api/registry","docId":"api/registry","unlisted":false},{"type":"link","label":"checkSystemStatus","href":"/docs/1.x.x/api/status/get","docId":"api/status/get","unlisted":false},{"type":"link","label":"restartServer","href":"/docs/1.x.x/api/status/update","docId":"api/status/update","unlisted":false},{"type":"link","label":"getServerInfo","href":"/docs/1.x.x/api/sys/info","docId":"api/sys/info","unlisted":false},{"type":"link","label":"getServerLogs","href":"/docs/1.x.x/api/sys/logs","docId":"api/sys/logs","unlisted":false},{"type":"link","label":"token","href":"/docs/1.x.x/api/token","docId":"api/token","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"administration/cli/cheatsheet":{"id":"administration/cli/cheatsheet","title":"Cheatsheet","description":"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.","sidebar":"tutorialSidebar"},"administration/cli/installation":{"id":"administration/cli/installation","title":"Installation","description":"To get the Routr Command-Line Tool run the following command:","sidebar":"tutorialSidebar"},"administration/cli/remote-access":{"id":"administration/cli/remote-access","title":"Remote Access","description":"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.","sidebar":"tutorialSidebar"},"administration/webconsole":{"id":"administration/webconsole","title":"WebUI","description":"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.","sidebar":"tutorialSidebar"},"api/agents/create":{"id":"api/agents/create","title":"createAgent","description":"Creates a new Agent resource. The Domain must exist before creating the Agent.","sidebar":"tutorialSidebar"},"api/agents/delete":{"id":"api/agents/delete","title":"deleteAgent","description":"Removes an Agent resource from a persistent database.","sidebar":"tutorialSidebar"},"api/agents/get":{"id":"api/agents/get","title":"getAgent","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/agents/list":{"id":"api/agents/list","title":"listAgents","description":"This method returns a list of Agent resources.","sidebar":"tutorialSidebar"},"api/agents/update":{"id":"api/agents/update","title":"updateAgent","description":"Updates an existing Agent resource.","sidebar":"tutorialSidebar"},"api/config/get":{"id":"api/config/get","title":"getConfiguration","description":"This method returns the servers\' configuration.","sidebar":"tutorialSidebar"},"api/config/update":{"id":"api/config/update","title":"updateConfiguration","description":"This method updates the servers\' configuration.","sidebar":"tutorialSidebar"},"api/domains/create":{"id":"api/domains/create","title":"createDomain","description":"Creates a new Domain resource.","sidebar":"tutorialSidebar"},"api/domains/delete":{"id":"api/domains/delete","title":"deleteDomain","description":"Removes a Domain resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/domains/get":{"id":"api/domains/get","title":"getDomain","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/domains/list":{"id":"api/domains/list","title":"listDomains","description":"This method returns a list of Domain resources.","sidebar":"tutorialSidebar"},"api/domains/update":{"id":"api/domains/update","title":"updateDomain","description":"Updates an existing Domain resource.","sidebar":"tutorialSidebar"},"api/gateways/create":{"id":"api/gateways/create","title":"createGateway","description":"Creates a new Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/delete":{"id":"api/gateways/delete","title":"deleteGateway","description":"Removes a Gateway resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/gateways/get":{"id":"api/gateways/get","title":"getGateway","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/list":{"id":"api/gateways/list","title":"listGateways","description":"This method returns a list of Gateways resources.","sidebar":"tutorialSidebar"},"api/gateways/update":{"id":"api/gateways/update","title":"updateGateways","description":"Updates an existing Gateway resource.","sidebar":"tutorialSidebar"},"api/location/create":{"id":"api/location/create","title":"addEndpoint","description":"Adds an entry into the location table","sidebar":"tutorialSidebar"},"api/location/delete":{"id":"api/location/delete","title":"evictEndpoint","description":"Evicts an entry from the location table","sidebar":"tutorialSidebar"},"api/location/list":{"id":"api/location/list","title":"listEndpoints","description":"Gets a list of registered devices.","sidebar":"tutorialSidebar"},"api/numbers/create":{"id":"api/numbers/create","title":"createNumber","description":"Creates a new Number. The Gateway must exist before creating the Number.","sidebar":"tutorialSidebar"},"api/numbers/delete":{"id":"api/numbers/delete","title":"deleteNumber","description":"Removes a Number from a persistent database.","sidebar":"tutorialSidebar"},"api/numbers/get":{"id":"api/numbers/get","title":"getNumber","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/numbers/list":{"id":"api/numbers/list","title":"listNumbers","description":"This method returns a list of Numbers.","sidebar":"tutorialSidebar"},"api/numbers/update":{"id":"api/numbers/update","title":"updateNumber","description":"Updates an existing Number.","sidebar":"tutorialSidebar"},"api/overview":{"id":"api/overview","title":"overview","description":"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.","sidebar":"tutorialSidebar"},"api/peers/create":{"id":"api/peers/create","title":"createPeer","description":"Creates a new Peer resource.","sidebar":"tutorialSidebar"},"api/peers/delete":{"id":"api/peers/delete","title":"deletePeer","description":"Removes a Peer resource from a persistent database.","sidebar":"tutorialSidebar"},"api/peers/get":{"id":"api/peers/get","title":"getPeer","description":"This method returns a Peer resource.","sidebar":"tutorialSidebar"},"api/peers/list":{"id":"api/peers/list","title":"listPeers","description":"This method returns a list of Peer resources.","sidebar":"tutorialSidebar"},"api/peers/update":{"id":"api/peers/update","title":"updatePeer","description":"Updates an existing Peer resource.","sidebar":"tutorialSidebar"},"api/registry":{"id":"api/registry","title":"registry","description":"This method gets a list of available(online) gateways.","sidebar":"tutorialSidebar"},"api/status/get":{"id":"api/status/get","title":"checkSystemStatus","description":"Pings an instance of Routr engine.","sidebar":"tutorialSidebar"},"api/status/update":{"id":"api/status/update","title":"restartServer","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/info":{"id":"api/sys/info","title":"getServerInfo","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/logs":{"id":"api/sys/logs","title":"getServerLogs","description":"This method returns logs from the server","sidebar":"tutorialSidebar"},"api/token":{"id":"api/token","title":"token","description":"This method gets a token for subsequent API calls.","sidebar":"tutorialSidebar"},"concepts":{"id":"concepts","title":"Concepts","description":"The following are some key concepts, including some of the essential routing strategies implemented in Routr.","sidebar":"tutorialSidebar"},"configuration/agents":{"id":"configuration/agents","title":"Agents","description":"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.","sidebar":"tutorialSidebar"},"configuration/domains":{"id":"configuration/domains","title":"Domains","description":"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and","sidebar":"tutorialSidebar"},"configuration/gateways":{"id":"configuration/gateways","title":"Gateways","description":"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.","sidebar":"tutorialSidebar"},"configuration/general":{"id":"configuration/general","title":"General","description":"The general configuration affects your entire Routr instance. The general configuration","sidebar":"tutorialSidebar"},"configuration/numbers":{"id":"configuration/numbers","title":"Numbers","description":"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.","sidebar":"tutorialSidebar"},"configuration/peers":{"id":"configuration/peers","title":"Peers","description":"Like Agents, Peers represent SIP endpoints such as Media Servers.","sidebar":"tutorialSidebar"},"configuration/users":{"id":"configuration/users","title":"Users","description":"Users exist in Routr to perform administrative actions on a Routr instance.","sidebar":"tutorialSidebar"},"guides/basic-setup":{"id":"guides/basic-setup","title":"Basic Setup","description":"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.","sidebar":"tutorialSidebar"},"guides/routr-as-asterisk-frontend":{"id":"guides/routr-as-asterisk-frontend","title":"Routr as Asterisk frontend","description":"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:","sidebar":"tutorialSidebar"},"guides/running-on-kubernetes":{"id":"guides/running-on-kubernetes","title":"Running on Kubernetes","description":"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.","sidebar":"tutorialSidebar"},"guides/running-with-docker-or-compose":{"id":"guides/running-with-docker-or-compose","title":"Running with Docker","description":"Please refer to Docker Hub for a detail guide on how to use Routr\'s docker image.","sidebar":"tutorialSidebar"},"guides/securing-the-signaling-path":{"id":"guides/securing-the-signaling-path","title":"Securing the signaling path","description":"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.","sidebar":"tutorialSidebar"},"introduction/community":{"id":"introduction/community","title":"Community","description":"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:","sidebar":"tutorialSidebar"},"introduction/comparison":{"id":"introduction/comparison","title":"Comparison","description":"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.","sidebar":"tutorialSidebar"},"introduction/faq":{"id":"introduction/faq","title":"FAQ","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/glossary":{"id":"introduction/glossary","title":"Glossary","description":"This following table features some essential concepts, including the different routing types implemented by the server.","sidebar":"tutorialSidebar"},"introduction/installation":{"id":"introduction/installation","title":"Installation","description":"Instant Server Installation with Snaps","sidebar":"tutorialSidebar"},"introduction/media":{"id":"introduction/media","title":"Media","description":"There is a subreddit collecting all Routr-related resources on the internet.","sidebar":"tutorialSidebar"},"introduction/overview":{"id":"introduction/overview","title":"Overview","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/performance-tests/user-location":{"id":"introduction/performance-tests/user-location","title":"Routr 1.0RC3 - User Location Lookup Performance Tests","description":"Author:","sidebar":"tutorialSidebar"},"introduction/roadmap":{"id":"introduction/roadmap","title":"Roadmap","description":"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.","sidebar":"tutorialSidebar"},"introduction/test-plan":{"id":"introduction/test-plan","title":"Test Plan","description":"DUT and Endpoints Configuration","sidebar":"tutorialSidebar"},"welcome":{"id":"welcome","title":"Welcome","description":"Use the left-hand to navigate to find topics of interest.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/71153375.1ac7f02d.js b/assets/js/71153375.fc453076.js similarity index 98% rename from assets/js/71153375.1ac7f02d.js rename to assets/js/71153375.fc453076.js index cf0873fcd..313912be0 100644 --- a/assets/js/71153375.1ac7f02d.js +++ b/assets/js/71153375.fc453076.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8911],{3017:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getConfiguration",c={id:"api/config/get",title:"getConfiguration",description:"This method returns the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/get.md",sourceDirName:"api/config",slug:"/api/config/get",permalink:"/docs/1.x.x/api/config/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"},next:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"}},d={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getconfiguration",children:"getConfiguration"}),"\n",(0,s.jsx)(t.p,{children:"This method returns the servers' configuration."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/system/config"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"full"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,s.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,s.jsx)(t.code,{children:"true"})," it will return a merged configuration between defaults and user defined values"]})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns the current configuration from the server."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/config\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": {\n ...\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8911],{3796:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getConfiguration",c={id:"api/config/get",title:"getConfiguration",description:"This method returns the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/get.md",sourceDirName:"api/config",slug:"/api/config/get",permalink:"/docs/1.x.x/api/config/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateAgent",permalink:"/docs/1.x.x/api/agents/update"},next:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"}},d={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getconfiguration",children:"getConfiguration"}),"\n",(0,s.jsx)(t.p,{children:"This method returns the servers' configuration."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/system/config"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"full"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,s.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,s.jsx)(t.code,{children:"true"})," it will return a merged configuration between defaults and user defined values"]})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns the current configuration from the server."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/config\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "data": {\n ...\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72607e62.8c39e033.js b/assets/js/72607e62.dfc2054c.js similarity index 98% rename from assets/js/72607e62.8c39e033.js rename to assets/js/72607e62.dfc2054c.js index 73b8b7f90..0447c9d4c 100644 --- a/assets/js/72607e62.8c39e033.js +++ b/assets/js/72607e62.dfc2054c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9042],{5831:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l=void 0,d={id:"api/registry",title:"registry",description:"This method gets a list of available(online) gateways.",source:"@site/versioned_docs/version-1.x.x/api/registry.md",sourceDirName:"api",slug:"/api/registry",permalink:"/docs/1.x.x/api/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/registry.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"},next:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"}},o={},a=[];function c(e){const t={code:"code",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This method gets a list of available(online) gateways."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/registry"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/registry\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [\n {\n "username": "215706",\n "host": "atlanta2.voip.ms",\n "ip":"209.217.224.50",\n "expires": 600,\n "registeredOn": 1588525156280,\n "gwRef": "gw50a1a4ca",\n "gwURI": "sip:215706@atlanta2.voip.ms:5060",\n "regOnFormatted": "a few seconds ago"\n }\n ]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9042],{8330:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>x,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},l=void 0,d={id:"api/registry",title:"registry",description:"This method gets a list of available(online) gateways.",source:"@site/versioned_docs/version-1.x.x/api/registry.md",sourceDirName:"api",slug:"/api/registry",permalink:"/docs/1.x.x/api/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/registry.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"},next:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"}},o={},a=[];function c(e){const t={code:"code",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"This method gets a list of available(online) gateways."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/registry"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list with registered devices."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/registry\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": 200,\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n },\n "data": [\n {\n "username": "215706",\n "host": "atlanta2.voip.ms",\n "ip":"209.217.224.50",\n "expires": 600,\n "registeredOn": 1588525156280,\n "gwRef": "gw50a1a4ca",\n "gwURI": "sip:215706@atlanta2.voip.ms:5060",\n "regOnFormatted": "a few seconds ago"\n }\n ]\n}\n'})})]})}function x(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/738c2db3.c75e85b0.js b/assets/js/738c2db3.c75e85b0.js new file mode 100644 index 000000000..7ce96b278 --- /dev/null +++ b/assets/js/738c2db3.c75e85b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4161],{2222:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>m,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var t=o(4848),r=o(8453);const c={},s="Overview",i={id:"connect/command-line/overview",title:"Overview",description:"The command-line tool contains all commands you will need to manage your Routr Connect server.",source:"@site/versioned_docs/version-2.0.0/connect/command-line/overview.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/overview",permalink:"/docs/2.0.0/connect/command-line/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/command-line/overview.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"},next:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"}},a={},l=[];function d(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"The command-line tool contains all commands you will need to manage your Routr Connect server."}),"\n",(0,t.jsx)(n.p,{children:"To install Routr with npm, you will need to run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-javascript",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:'Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.'}),"\n",(0,t.jsx)(n.p,{children:"Please see the following sections for more information on each command."})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>i});var t=o(6540);const r={},c=t.createContext(r);function s(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/759bfbe1.035fb5f8.js b/assets/js/759bfbe1.035fb5f8.js deleted file mode 100644 index 44658c906..000000000 --- a/assets/js/759bfbe1.035fb5f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1080],{1538:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>o,frontMatter:()=>l,metadata:()=>d,toc:()=>x});var n=s(4848),i=s(8453);const l={},r="Test Plan",d={id:"introduction/test-plan",title:"Test Plan",description:"DUT and Endpoints Configuration",source:"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",sourceDirName:"introduction",slug:"/introduction/test-plan",permalink:"/docs/1.x.x/introduction/test-plan",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/test-plan.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"},next:{title:"Concepts",permalink:"/docs/1.x.x/concepts"}},c={},x=[{value:"DUT and Endpoints Configuration",id:"dut-and-endpoints-configuration",level:2},{value:"Test Case Summary",id:"test-case-summary",level:2},{value:"Test Cases",id:"test-cases",level:2},{value:"Test Case 1.1.1: Registration Setup",id:"test-case-111-registration-setup",level:3}];function h(t){const e={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"test-plan",children:"Test Plan"}),"\n",(0,n.jsx)(e.h2,{id:"dut-and-endpoints-configuration",children:"DUT and Endpoints Configuration"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:"Routr has a Gateway resource configured to use TCP transport."}),"\n",(0,n.jsx)(e.li,{children:"The Gateway resource is configured with a range of E.164 numbers."}),"\n",(0,n.jsx)(e.li,{children:"Routr is configured to support Registration mode."}),"\n",(0,n.jsxs)(e.li,{children:["A Domain named ",(0,n.jsx)(e.code,{children:"sip.local"})," exist with Agents ",(0,n.jsx)(e.code,{children:"1001@sip.local"})," and ",(0,n.jsx)(e.code,{children:"1002@sip.local"})]}),"\n",(0,n.jsx)(e.li,{children:"The Gateway is capable of handling RFC6140 registrations"}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"test-case-summary",children:"Test Case Summary"}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{children:"Test Case ID"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Title"}),(0,n.jsx)(e.th,{style:{textAlign:"right"},children:"Required"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Failure"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Maintaining Registration"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.5"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Server Mode"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"DNS Lookup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Static Mode Failure Detection"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Certificate Validation"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.6.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Peer-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]})]})]}),"\n",(0,n.jsx)(e.h2,{id:"test-cases",children:"Test Cases"}),"\n",(0,n.jsx)(e.h3,{id:"test-case-111-registration-setup",children:"Test Case 1.1.1: Registration Setup"}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Objective"}),": This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Procedure"}),":"]}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Description"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Expected Result"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Restart Routr to send a REGISTER message to the Gateway"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Routr restarts"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Wait for the server to restart"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"UAS receives correct registration sequence"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Clear the registration table"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registry table is empty"})]})]})]})]})}function o(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,s)=>{s.d(e,{R:()=>r,x:()=>d});var n=s(6540);const i={},l=n.createContext(i);function r(t){const e=n.useContext(l);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function d(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:r(t.components),n.createElement(l.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/759bfbe1.dc3e88df.js b/assets/js/759bfbe1.dc3e88df.js new file mode 100644 index 000000000..91923767d --- /dev/null +++ b/assets/js/759bfbe1.dc3e88df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1080],{451:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>o,frontMatter:()=>l,metadata:()=>d,toc:()=>x});var n=s(4848),i=s(8453);const l={},r="Test Plan",d={id:"introduction/test-plan",title:"Test Plan",description:"DUT and Endpoints Configuration",source:"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",sourceDirName:"introduction",slug:"/introduction/test-plan",permalink:"/docs/1.x.x/introduction/test-plan",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/test-plan.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"},next:{title:"Concepts",permalink:"/docs/1.x.x/concepts"}},c={},x=[{value:"DUT and Endpoints Configuration",id:"dut-and-endpoints-configuration",level:2},{value:"Test Case Summary",id:"test-case-summary",level:2},{value:"Test Cases",id:"test-cases",level:2},{value:"Test Case 1.1.1: Registration Setup",id:"test-case-111-registration-setup",level:3}];function h(t){const e={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"test-plan",children:"Test Plan"}),"\n",(0,n.jsx)(e.h2,{id:"dut-and-endpoints-configuration",children:"DUT and Endpoints Configuration"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:"Routr has a Gateway resource configured to use TCP transport."}),"\n",(0,n.jsx)(e.li,{children:"The Gateway resource is configured with a range of E.164 numbers."}),"\n",(0,n.jsx)(e.li,{children:"Routr is configured to support Registration mode."}),"\n",(0,n.jsxs)(e.li,{children:["A Domain named ",(0,n.jsx)(e.code,{children:"sip.local"})," exist with Agents ",(0,n.jsx)(e.code,{children:"1001@sip.local"})," and ",(0,n.jsx)(e.code,{children:"1002@sip.local"})]}),"\n",(0,n.jsx)(e.li,{children:"The Gateway is capable of handling RFC6140 registrations"}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"test-case-summary",children:"Test Case Summary"}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{children:"Test Case ID"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Title"}),(0,n.jsx)(e.th,{style:{textAlign:"right"},children:"Required"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registration Failure"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Maintaining Registration"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.1.5"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Server Mode"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"DNS Lookup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Static Mode Failure Detection"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Authentication"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.2.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"TLS Certificate Validation"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"No"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.3.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Intra-Domain Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.4.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Ingress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Rejected by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Caller"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.5.4"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Domain-Egress Routing / Invite Cancelled by Callee"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"1.6.1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Peer-Egress Routing / Successful Invite Setup"}),(0,n.jsx)(e.td,{style:{textAlign:"right"},children:"Yes"})]})]})]}),"\n",(0,n.jsx)(e.h2,{id:"test-cases",children:"Test Cases"}),"\n",(0,n.jsx)(e.h3,{id:"test-case-111-registration-setup",children:"Test Case 1.1.1: Registration Setup"}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Objective"}),": This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Procedure"}),":"]}),"\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Description"}),(0,n.jsx)(e.th,{style:{textAlign:"left"},children:"Expected Result"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 1"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Restart Routr to send a REGISTER message to the Gateway"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Routr restarts"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 2"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Wait for the server to restart"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"UAS receives correct registration sequence"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Step 3"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Clear the registration table"}),(0,n.jsx)(e.td,{style:{textAlign:"left"},children:"Registry table is empty"})]})]})]})]})}function o(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},8453:(t,e,s)=>{s.d(e,{R:()=>r,x:()=>d});var n=s(6540);const i={},l=n.createContext(i);function r(t){const e=n.useContext(l);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function d(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:r(t.components),n.createElement(l.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/76273f75.4d9b4425.js b/assets/js/76273f75.4d9b4425.js new file mode 100644 index 000000000..7bad54b8b --- /dev/null +++ b/assets/js/76273f75.4d9b4425.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3578],{7422:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>p});var n=o(4848),i=o(8453);const r={},s="Overview",c={id:"development/components/overview",title:"Overview",description:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.",source:"@site/docs/development/components/overview.md",sourceDirName:"development/components",slug:"/development/components/overview",permalink:"/docs/2.11.5/development/components/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Development with Gitpod",permalink:"/docs/2.11.5/development/development-mode-with-gitpod"},next:{title:"EdgePort",permalink:"/docs/2.11.5/development/components/edgeport"}},a={},p=[];function d(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502EdgePort 001\u2502\u2502EdgePort 002\u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Message Dispatcher \u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502IM Processor \u2502\u2502Connect Processor \u2502\u2502Twilio Processor\u2502\n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Data APIs & External Services\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n"})}),"\n",(0,n.jsx)(t.p,{children:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it."}),"\n",(0,n.jsx)(t.p,{children:"Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>c});var n=o(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76273f75.60924f2a.js b/assets/js/76273f75.60924f2a.js deleted file mode 100644 index 72c775064..000000000 --- a/assets/js/76273f75.60924f2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3578],{9346:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>p});var n=o(4848),i=o(8453);const r={},s="Overview",c={id:"development/components/overview",title:"Overview",description:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.",source:"@site/docs/development/components/overview.md",sourceDirName:"development/components",slug:"/development/components/overview",permalink:"/docs/2.0.0/development/components/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"},next:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"}},a={},p=[];function d(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502EdgePort 001\u2502\u2502EdgePort 002\u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Message Dispatcher \u2502 \n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2518 \n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502IM Processor \u2502\u2502Connect Processor \u2502\u2502Twilio Processor\u2502\n\u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u25bd\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \n\u2502Data APIs & External Services\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \n"})}),"\n",(0,n.jsx)(t.p,{children:"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it."}),"\n",(0,n.jsx)(t.p,{children:"Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>c});var n=o(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7a552015.da354daa.js b/assets/js/7a552015.da354daa.js new file mode 100644 index 000000000..98093544d --- /dev/null +++ b/assets/js/7a552015.da354daa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2913],{210:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=s(4848),r=s(8453);const o={},d="EdgePort",i={id:"development/components/edgeport",title:"EdgePort",description:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.",source:"@site/versioned_docs/version-2.0.0/development/components/edgeport.md",sourceDirName:"development/components",slug:"/development/components/edgeport",permalink:"/docs/2.0.0/development/components/edgeport",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/edgeport.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"},next:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the EdgePort with Docker",id:"launching-the-edgeport-with-docker",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"edgeport",children:"EdgePort"}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop."}),"\n",(0,n.jsx)(t.p,{children:"The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502SIP request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC request \u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502gRPC response\u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502SIP response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502SIP Client\u2502 \u2502EdgePort\u2502 \u2502Message Dispatcher\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,n.jsx)(t.p,{children:"While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware."}),"\n",(0,n.jsx)(t.p,{children:"For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher."}),"\n",(0,n.jsx)(t.p,{children:"If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster."}),"\n",(0,n.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,n.jsx)(t.p,{children:"To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"ref"})}),(0,n.jsx)(t.td,{children:"Reference to the EdgePort"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"metadata.region"})}),(0,n.jsx)(t.td,{children:"Region where the EdgePort is located (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.unknownMethodAction"})}),(0,n.jsx)(t.td,{children:"What to do if an incoming request type is not allowed (reserved for future use)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport"})}),(0,n.jsx)(t.td,{children:"Enabled Transport Protocols"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].protocol"})}),(0,n.jsx)(t.td,{children:"Transport protocol"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.transport[*].port"})}),(0,n.jsx)(t.td,{children:"Port to listen on"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.methods"})}),(0,n.jsx)(t.td,{children:"Acceptable SIP Methods"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor"})}),(0,n.jsx)(t.td,{children:"Adjacent service for message routing"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.processor.addr"})}),(0,n.jsx)(t.td,{children:"Address of the adjacent service"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.localnets"})}),(0,n.jsx)(t.td,{children:"Networks considered to be in the same local network"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.externalAddrs"})}),(0,n.jsx)(t.td,{children:"EdgePort external ip addresses"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.bindAddr"})}),(0,n.jsx)(t.td,{children:"Ipv4 interface to accept requests on"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext"})}),(0,n.jsx)(t.td,{children:"Security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client"})}),(0,n.jsx)(t.td,{children:"Client security context"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.protocols"})}),(0,n.jsx)(t.td,{children:"TLS protocols used by the client (e.g., SSLv3, TLSv1.2)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.client.authType"})}),(0,n.jsx)(t.td,{children:"Client authentication type (e.g., Disabled, DisabledAll, Required, Wanted)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStore"})}),(0,n.jsx)(t.td,{children:"Path to the key store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStore"})}),(0,n.jsx)(t.td,{children:"Path to the trust store file"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the key store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.trustStorePassword"})}),(0,n.jsx)(t.td,{children:"Password for the trust store"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"spec.securityContext.keyStoreType"})}),(0,n.jsx)(t.td,{children:"Type of the key store (e.g., pkcs12)"}),(0,n.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["The security context is required if the EdgePort is configured to use a secure protocol such as ",(0,n.jsx)(t.code,{children:"TLS"})," or ",(0,n.jsx)(t.code,{children:"WSS"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["Please see JAINSIP docs for details on the security context ",(0,n.jsx)(t.a,{href:"https://javadoc.io/doc/javax.sip/jain-sip-ri/1.2.220/gov/nist/javax/sip/SipStackImpl.html",children:"properties."})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Here is an example of a configuration file:"}),"\n",(0,n.jsxs)(t.p,{children:["Filename: ",(0,n.jsx)(t.code,{children:"dispatcher.yaml"})," or ",(0,n.jsx)(t.code,{children:"dispatcher.json"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'kind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n unknownMethodAction: Discard\n processor:\n addr: dispatcher:51901 \n securityContext:\n client:\n protocols:\n - SSLv3\n - TLSv1.2\n authType: DisabledAll\n keyStorePassword: changeme\n trustStorePassword: changeme\n keyStore: "/etc/routr/certs/signaling.p12"\n trustStore: "/etc/routr/certs/signaling.p12"\n keyStoreType: pkcs12\n externalAddrs:\n - 10.111.220.2\n - sip01.edgeport.net\n localnets:\n - 127.0.0.1/8\n - 10.111.221.2/24\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: tcp\n port: 5060\n - protocol: udp\n port: 5060\n - protocol: tls\n port: 5061\n - protocol: ws \n port: 5062\n - protocol: wss\n port: 5063\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort requires the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," field to function properly in NATed environments like Docker. When provided, the ",(0,n.jsx)(t.code,{children:"spec.externalAddrs"})," is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Environment Variables"})}),"\n",(0,n.jsx)(t.p,{children:"The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"PROCESSOR_ADDR"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"spec.processor.addr"})," property"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"HOSTNAME"})," - Overwrites the ",(0,n.jsx)(t.code,{children:"ref"})," property. If running in K8s, ",(0,n.jsx)(t.code,{children:"ref"})," will be set to the pod's hostname."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"IGNORE_LOOPBACK_FROM_LOCALNETS"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will ignore the loopback address from the ",(0,n.jsx)(t.code,{children:"localnets"})," property. In Docker deployments, this is set to ",(0,n.jsx)(t.code,{children:"true"})," by default."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"CONSOLE_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," - If set to ",(0,n.jsx)(t.code,{children:"true"}),", the EdgePort will publish SIP messages to the NATS publisher."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_SUBJECT"})," - Overwrites the default subject the NATS publisher uses. The default subject is ",(0,n.jsx)(t.code,{children:"routr"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_URL"})," - This is required if ",(0,n.jsx)(t.code,{children:"NATS_PUBLISHER_ENABLED"})," is set to ",(0,n.jsx)(t.code,{children:"true"}),". It should contain the NATS server URL. For example: ",(0,n.jsx)(t.code,{children:"nats://nats:4222"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,n.jsx)(t.p,{children:"While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Link to the ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,n.jsx)(t.h2,{id:"launching-the-edgeport-with-docker",children:"Launching the EdgePort with Docker"}),"\n",(0,n.jsxs)(t.p,{children:["The EdgePort is available as a Docker image from ",(0,n.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-edgeport",children:"Docker Hub"}),". To launch the EdgePort with Docker, you can use the following command:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port ",(0,n.jsx)(t.code,{children:"5060"})," for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port ",(0,n.jsx)(t.code,{children:"5061"})," for TLS traffic, you must add the following flag to the ",(0,n.jsx)(t.code,{children:"docker run"})," command: ",(0,n.jsx)(t.code,{children:"-p 5061:5061"}),"."]})]})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>i});var n=s(6540);const r={},o=n.createContext(r);function d(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7b98d5f9.bb163265.js b/assets/js/7b98d5f9.bb163265.js new file mode 100644 index 000000000..a2708e636 --- /dev/null +++ b/assets/js/7b98d5f9.bb163265.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4013],{5113:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var o=t(4848),r=t(8453);const s={},c="Changelog",i={id:"changelog",title:"Changelog",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/changelog.md",sourceDirName:".",slug:"/changelog",permalink:"/docs/2.0.0/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/changelog.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},a={},d=[];function l(e){const n={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"changelog",children:"Changelog"}),"\n",(0,o.jsx)(n.p,{children:"Coming soon."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c32d245.80c5bf10.js b/assets/js/7c32d245.12851d66.js similarity index 99% rename from assets/js/7c32d245.80c5bf10.js rename to assets/js/7c32d245.12851d66.js index f540cd3aa..59e5ace99 100644 --- a/assets/js/7c32d245.80c5bf10.js +++ b/assets/js/7c32d245.12851d66.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[529],{8786:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const o={},i="Routr 1.0RC3 - User Location Lookup Performance Tests",c={id:"introduction/performance-tests/user-location",title:"Routr 1.0RC3 - User Location Lookup Performance Tests",description:"Author:",source:"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",sourceDirName:"introduction/performance-tests",slug:"/introduction/performance-tests/user-location",permalink:"/docs/1.x.x/introduction/performance-tests/user-location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Media",permalink:"/docs/1.x.x/introduction/media"},next:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Scope",id:"scope",level:3},{value:"Software",id:"software",level:3},{value:"Platform",id:"platform",level:3},{value:"Performance Tests",id:"performance-tests",level:2}];function a(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"routr-10rc3---user-location-lookup-performance-tests",children:"Routr 1.0RC3 - User Location Lookup Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Author:\nPedro Sanders"}),"\n",(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"Overview"}),(0,s.jsx)("li",{children:"User Location Performance Tests"}),(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"New registrations"}),(0,s.jsx)("li",{children:"Update registrations"}),(0,s.jsx)("li",{children:"User location lookup"})]}),(0,s.jsx)("li",{children:"Conclusions"}),(0,s.jsx)("li",{children:"Notes"}),(0,s.jsx)("li",{children:"References"})]}),"\n",(0,s.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(t.h3,{id:"scope",children:"Scope"}),"\n",(0,s.jsx)(t.p,{children:"These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3.\nThese can be useful to help you better dimension your Routr installation. For these test the login module\nwas deactivated. The network configuration used during the test is depicted in the following image:"}),"\n",(0,s.jsx)(t.h3,{id:"software",children:"Software"}),"\n",(0,s.jsx)(t.p,{children:"As load generator (UAC side) it was used SIPp."}),"\n",(0,s.jsx)(t.p,{children:"All used SIP-related software was configured to use TCP as the transport protocol for SIP."}),"\n",(0,s.jsx)(t.h3,{id:"platform",children:"Platform"}),"\n",(0,s.jsx)(t.p,{children:"Description of the elements used:"}),"\n",(0,s.jsx)(t.p,{children:"Equipment #1 - [Processor], [Memory] with [Operating system] testing.\nEquipment #2 - [Processor], [Memory] with [Operating system] testing.\nEquipment #x - [Processor], [Memory] with [Operating system] testing."}),"\n",(0,s.jsx)(t.h2,{id:"performance-tests",children:"Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Routr running without any special"}),"\n",(0,s.jsx)(t.p,{children:"SIPp was used to generate [# of interaction] MESSAGE requests via Routr.\nThe results reflect the capacity [General or sub topic] and speed (average response time)."}),"\n",(0,s.jsx)(t.p,{children:"Flow\nSIP entities definition:"}),"\n",(0,s.jsx)(t.p,{children:"UAC - [UAC]:5070\nUAS - [UAS]:5070\nProxy - [PROXY_IP]:5060"}),"\n",(0,s.jsx)(t.p,{children:"SIP messages flow for one complete transaction:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"UAC ---\x3e MESSAGE ---\x3e Routr ---\x3e MESSAGE ---\x3e UAS\nUAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS\n"})}),"\n",(0,s.jsx)(t.p,{children:"Configuration\nSIPP command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"[Used SIPp command config ]\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Results"})}),"\n",(0,s.jsx)(t.p,{children:"Results reported by SIPp on the UAC servers:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Factor"}),(0,s.jsx)(t.th,{children:"Value"}),(0,s.jsx)(t.th,{children:"Note"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Iterations"}),(0,s.jsx)(t.td,{children:"200000"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max concurrent requests"}),(0,s.jsx)(t.td,{children:"70"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max allowed Rate"}),(0,s.jsx)(t.td,{children:"10000"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Average Request Rate"}),(0,s.jsx)(t.td,{children:"8047.966"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Failures"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Retransmissions"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Timeout"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Elapsed Time"}),(0,s.jsx)(t.td,{children:"00:00:24:851"}),(0,s.jsx)(t.td,{children:"00:00:24:851"})]})]})]}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("img",{src:"/docs/assets/images/[DUT Performance Summary]"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)(t.p,{children:"Routr config file:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"[Whatever config applies]\n"})}),"\n",(0,s.jsx)(t.p,{children:"[Graphical results]"}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Conclusions"}),"\n",(0,s.jsx)(t.li,{children:"Notes"}),"\n",(0,s.jsx)(t.li,{children:"References"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(6540);const r={},o=s.createContext(r);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[529],{5475:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(4848),r=n(8453);const o={},i="Routr 1.0RC3 - User Location Lookup Performance Tests",c={id:"introduction/performance-tests/user-location",title:"Routr 1.0RC3 - User Location Lookup Performance Tests",description:"Author:",source:"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",sourceDirName:"introduction/performance-tests",slug:"/introduction/performance-tests/user-location",permalink:"/docs/1.x.x/introduction/performance-tests/user-location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Media",permalink:"/docs/1.x.x/introduction/media"},next:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Scope",id:"scope",level:3},{value:"Software",id:"software",level:3},{value:"Platform",id:"platform",level:3},{value:"Performance Tests",id:"performance-tests",level:2}];function a(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"routr-10rc3---user-location-lookup-performance-tests",children:"Routr 1.0RC3 - User Location Lookup Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Author:\nPedro Sanders"}),"\n",(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"Overview"}),(0,s.jsx)("li",{children:"User Location Performance Tests"}),(0,s.jsxs)("ol",{type:"1",children:[(0,s.jsx)("li",{children:"New registrations"}),(0,s.jsx)("li",{children:"Update registrations"}),(0,s.jsx)("li",{children:"User location lookup"})]}),(0,s.jsx)("li",{children:"Conclusions"}),(0,s.jsx)("li",{children:"Notes"}),(0,s.jsx)("li",{children:"References"})]}),"\n",(0,s.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(t.h3,{id:"scope",children:"Scope"}),"\n",(0,s.jsx)(t.p,{children:"These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3.\nThese can be useful to help you better dimension your Routr installation. For these test the login module\nwas deactivated. The network configuration used during the test is depicted in the following image:"}),"\n",(0,s.jsx)(t.h3,{id:"software",children:"Software"}),"\n",(0,s.jsx)(t.p,{children:"As load generator (UAC side) it was used SIPp."}),"\n",(0,s.jsx)(t.p,{children:"All used SIP-related software was configured to use TCP as the transport protocol for SIP."}),"\n",(0,s.jsx)(t.h3,{id:"platform",children:"Platform"}),"\n",(0,s.jsx)(t.p,{children:"Description of the elements used:"}),"\n",(0,s.jsx)(t.p,{children:"Equipment #1 - [Processor], [Memory] with [Operating system] testing.\nEquipment #2 - [Processor], [Memory] with [Operating system] testing.\nEquipment #x - [Processor], [Memory] with [Operating system] testing."}),"\n",(0,s.jsx)(t.h2,{id:"performance-tests",children:"Performance Tests"}),"\n",(0,s.jsx)(t.p,{children:"Routr running without any special"}),"\n",(0,s.jsx)(t.p,{children:"SIPp was used to generate [# of interaction] MESSAGE requests via Routr.\nThe results reflect the capacity [General or sub topic] and speed (average response time)."}),"\n",(0,s.jsx)(t.p,{children:"Flow\nSIP entities definition:"}),"\n",(0,s.jsx)(t.p,{children:"UAC - [UAC]:5070\nUAS - [UAS]:5070\nProxy - [PROXY_IP]:5060"}),"\n",(0,s.jsx)(t.p,{children:"SIP messages flow for one complete transaction:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"UAC ---\x3e MESSAGE ---\x3e Routr ---\x3e MESSAGE ---\x3e UAS\nUAC <--- 200 OK <--- Routr <--- 200 OK <--- UAS\n"})}),"\n",(0,s.jsx)(t.p,{children:"Configuration\nSIPP command:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"[Used SIPp command config ]\n"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Results"})}),"\n",(0,s.jsx)(t.p,{children:"Results reported by SIPp on the UAC servers:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Factor"}),(0,s.jsx)(t.th,{children:"Value"}),(0,s.jsx)(t.th,{children:"Note"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Iterations"}),(0,s.jsx)(t.td,{children:"200000"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max concurrent requests"}),(0,s.jsx)(t.td,{children:"70"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Max allowed Rate"}),(0,s.jsx)(t.td,{children:"10000"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Average Request Rate"}),(0,s.jsx)(t.td,{children:"8047.966"}),(0,s.jsx)(t.td,{children:"requests per second"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Failures"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Retransmissions"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Timeout"}),(0,s.jsx)(t.td,{children:"0"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Elapsed Time"}),(0,s.jsx)(t.td,{children:"00:00:24:851"}),(0,s.jsx)(t.td,{children:"00:00:24:851"})]})]})]}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("img",{src:"/docs/assets/images/[DUT Performance Summary]"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)(t.p,{children:"Routr config file:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"[Whatever config applies]\n"})}),"\n",(0,s.jsx)(t.p,{children:"[Graphical results]"}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Conclusions"}),"\n",(0,s.jsx)(t.li,{children:"Notes"}),"\n",(0,s.jsx)(t.li,{children:"References"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(6540);const r={},o=s.createContext(r);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7cf72cd4.20e5aef9.js b/assets/js/7cf72cd4.20e5aef9.js new file mode 100644 index 000000000..a926bd6ff --- /dev/null +++ b/assets/js/7cf72cd4.20e5aef9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8937],{7047:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=s(4848),r=s(8453);const i={},d="APIServer",c={id:"development/components/apiserver",title:"APIServer",description:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.",source:"@site/docs/development/components/apiserver.md",sourceDirName:"development/components",slug:"/development/components/apiserver",permalink:"/docs/2.11.5/development/components/apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RTPRelay",permalink:"/docs/2.11.5/development/components/rtprelay"},next:{title:"SimpleAuth Service",permalink:"/docs/2.11.5/development/components/simpleauth"}},o={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the APIServer",id:"launching-the-apiserver",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"apiserver",children:"APIServer"}),"\n",(0,t.jsx)(n.p,{children:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC."}),"\n",(0,t.jsxs)(n.p,{children:["The APIServer has two implementations: the ",(0,t.jsx)(n.code,{children:"pgdata"})," for persistent data storage in a PostgreSQL database and the ",(0,t.jsx)(n.code,{children:"simpledata"})," for storing data in files. The ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation is intended for testing and small deployments."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has several advantages over the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation. The first advantage is that the ",(0,t.jsx)(n.code,{children:"pgdata"})," allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the ",(0,t.jsx)(n.code,{children:"extended"})," attribute, enabling you to store additional data in the database in JSON format\u2014more on this in later sections."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Data Migration"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation uses ",(0,t.jsx)(n.a,{href:"https://www.prisma.io/",children:"Prisma"})," to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DATABASE_URL"})," - The URL of the PostgreSQL database. Example: ",(0,t.jsx)(n.code,{children:"postgresql://postgres:postgres@localhost:5432/routr"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EXTERNAL_SERVER_BIND_ADDR"})," - The address where the APIServer will listen for HTTP requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51908"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TLS_ON"})," - Enables TLS for the gRPC server. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"VERIFY_CLIENT_CERT"})," - Enables client certificate verification. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CACERT"})," - The path to the CA certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/ca.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SERVER_CERT"})," - The path to the server certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/server.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164"})," - Enables E164 validation for Numbers. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164_WITH_MOBILE_PREFIX"})," - Enables E164 validation for Numbers with mobile prefixes. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For details about connecting to the ",(0,t.jsx)(n.code,{children:"pgdata"})," to manage the data, see the ",(0,t.jsx)(n.a,{href:"/docs/2.11.5/connect/command-line/overview",children:"CTL"})," and ",(0,t.jsx)(n.a,{href:"/docs/2.11.5/connect/nodesdk/overview",children:"SDK"})," documentation."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"simpledata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PATH_TO_RESOURCES"})," - The path to the directory where the data will be stored. Example: ",(0,t.jsx)(n.code,{children:"/etc/routr/resources"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components."}),"\n",(0,t.jsx)(n.p,{children:"In your resources directory, you will find the following files:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"agents.yaml"})," - A list of Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"domains.yaml"})," - A list of Domains to which Agents belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"trunks.yaml"})," - Represents the list of Trunks"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"numbers.yaml"})," - A list of Numbers to which Trunks belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"peers.yaml"})," - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"credentials.yaml"})," - A list of Credentials for Peers and Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"acl.yaml"})," - The list of ACLs"]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["You may also provide a ",(0,t.jsx)(n.code,{children:".json"})," file instead of a ",(0,t.jsx)(n.code,{children:".yaml"})," file."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The Agents configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.domainRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.privacy"})}),(0,t.jsxs)(n.td,{children:["The privacy settings of the Agent (",(0,t.jsx)(n.code,{children:"Private"})," or ",(0,t.jsx)(n.code,{children:"None"}),")"]}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.enabled"})}),(0,t.jsx)(n.td,{children:"The enabled status of the Agent (reserved for future use)"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an Agents configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"agents.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n privacy: Private\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Agent ",(0,t.jsx)(n.code,{children:"agent-01"})," has the username ",(0,t.jsx)(n.code,{children:"1001"}),", belongs to the Domain ",(0,t.jsx)(n.code,{children:"domain-01"}),", and uses the Credentials ",(0,t.jsx)(n.code,{children:"credentials-01"}),". Both the Domain and the Credentials are required for the Agent to work."]}),"\n",(0,t.jsx)(n.p,{children:"The Domains configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.domainUri"})}),(0,t.jsx)(n.td,{children:"The domain URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies"})}),(0,t.jsx)(n.td,{children:"The list of egress policies"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].rule"})}),(0,t.jsx)(n.td,{children:"The regular expression to match the number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].numberRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Domains configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"domains.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Domain ",(0,t.jsx)(n.code,{children:"domain-01"})," has the Domain URI ",(0,t.jsx)(n.code,{children:"sip.local"})," and the egress policy ",(0,t.jsx)(n.code,{children:".*"})," that matches all numbers. The egress policy is associated with the Number ",(0,t.jsx)(n.code,{children:"number-01"}),". The Number ",(0,t.jsx)(n.code,{children:"number-01"})," is required for the Domain to work."]}),"\n",(0,t.jsx)(n.p,{children:"Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.city"})}),(0,t.jsx)(n.td,{children:"The city where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.country"})}),(0,t.jsx)(n.td,{children:"The country where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.countryIsoCode"})}),(0,t.jsx)(n.td,{children:"The ISO code of the country"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.trunkRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.telUrl"})}),(0,t.jsx)(n.td,{children:"The tel URL of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.aorLink"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"})}),(0,t.jsx)(n.td,{children:"The session affinity header of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders"})}),(0,t.jsx)(n.td,{children:"The extra headers of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders[*].name"})}),(0,t.jsx)(n.td,{children:"The name of the extra header"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Tthe ' tel: ' scheme is required when setting the ",(0,t.jsx)(n.code,{children:"spec.location.telUrl"})," property. For example, ",(0,t.jsx)(n.code,{children:"tel:+17066041487"}),". Here, ",(0,t.jsx)(n.code,{children:"tel:"})," indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider."]}),"\n",(0,t.jsxs)(n.p,{children:["Another important property is the ",(0,t.jsx)(n.code,{children:"spec.location.aorLink"}),". The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"}),' tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the ',(0,t.jsx)(n.code,{children:"X-Room-Id"})," header to identify the session. The Location Service will use the header's value to identify the session."]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Numbers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"numbers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(706)604-1487"\n geoInfo:\n city: Columbus, GA\n country: USA\n countryIsoCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+17066041487\n aorLink: sip:conference@sip.local\n sessionAffinityHeader: X-Room-Id\n extraHeaders:\n - name: X-Room-Id\n value: jsa-shqm-iyo\n'})}),"\n",(0,t.jsx)(n.p,{children:"Numbers must be associated with a Trunk to work."}),"\n",(0,t.jsx)(n.p,{children:"The Trunks configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.region"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.uri"})}),(0,t.jsx)(n.td,{children:"The inbound URI of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.accessControlListRef"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.sendRegister"})}),(0,t.jsx)(n.td,{children:"Enables outbound registration"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris"})}),(0,t.jsx)(n.td,{children:"The list of outbound URIs"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].uri"})}),(0,t.jsx)(n.td,{children:"The outbound URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].priority"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].weight"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].enabled"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].transport"})}),(0,t.jsx)(n.td,{children:"The transport of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].user"})}),(0,t.jsx)(n.td,{children:"The user of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].host"})}),(0,t.jsx)(n.td,{children:"The host of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].port"})}),(0,t.jsx)(n.td,{children:"The port of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Trunks configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"trunks.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Trunk\n ref: trunk-01\n metadata:\n name: Test Trunk\n region: us-east1\n spec:\n inbound:\n uri: trunk01.acme.com\n accessControlListRef: acl-01\n outbound:\n sendRegister: true\n credentialsRef: credentials-04\n uris:\n - uri:\n user: pbx-1\n host: sip.provider.net\n port: 7060\n transport: udp\n enabled: true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.inbound"})," section, the ",(0,t.jsx)(n.code,{children:"uri"})," property helps Routr to identify the Trunk. Calls from the PSTN using the ",(0,t.jsx)(n.code,{children:"uri"})," will be routed to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," property restricts the access to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," is optional."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.outbound"})," section, the ",(0,t.jsx)(n.code,{children:"sendRegister"})," property enables registration outbound registrations while the ",(0,t.jsx)(n.code,{children:"credentialsRef"})," property for authentication with your trunk provider."]}),"\n",(0,t.jsx)(n.p,{children:"In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.aor"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})}),(0,t.jsx)(n.td,{children:"Enables session affinity"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})}),(0,t.jsx)(n.td,{children:"The load balancing algorithm"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})," property enables session affinity, and the ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})," property sets the load-balancing algorithm. The available algorithms are ",(0,t.jsx)(n.code,{children:"least-sessions"})," and ",(0,t.jsx)(n.code,{children:"round-robin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Remember that for the ",(0,t.jsx)(n.code,{children:"least-sessions"})," algorithm to work, your SIP backend includes the special header ",(0,t.jsx)(n.code,{children:"X-Session-Count"})," with the number of active sessions as part of the registration request."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Peers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"peers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Peer\n ref: peer-01\n metadata:\n name: Asterisk (Media Server)\n spec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-03\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsx)(n.p,{children:"Credentials in Routr help Agents and Peers authenticate with Routr."}),"\n",(0,t.jsx)(n.p,{children:"The Credentials configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.username"})}),(0,t.jsx)(n.td,{children:"The username of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.password"})}),(0,t.jsx)(n.td,{children:"The password of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Credentials configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"credentials.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Credentials\n ref: credentials-01\n metadata:\n name: Agent Credentials\n spec:\n credentials:\n username: "1001"\n password: "1234"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains."}),"\n",(0,t.jsx)(n.p,{children:"The ACLs configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny"})}),(0,t.jsx)(n.td,{children:"The list of deny rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny[*]"})}),(0,t.jsx)(n.td,{children:"The deny rule"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow"})}),(0,t.jsx)(n.td,{children:"The list of allow rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow[*]"})}),(0,t.jsx)(n.td,{children:"The allow rule"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an ACLs configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"acl.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: AccessControlList\n ref: acl-01\n metadata:\n name: Europe ACL\n spec:\n accessControlList:\n deny:\n - 0.0.0.0/1\n allow:\n - 192.168.1.3/31\n - 127.0.0.1/8\n - 10.111.221.22/31\n"})}),"\n",(0,t.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(n.p,{children:"Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc."}),"\n",(0,t.jsx)(n.p,{children:"The following protobuf defines the Agent service interface:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.connect.agents.v2beta1;\n\n// The Agents service definition\nservice Agents {\n // Creates a new Agent\n rpc Create (CreateAgentRequest) returns (Agent) {}\n // Updates an existing Agent\n rpc Update (UpdateAgentRequest) returns (Agent) {}\n // Gets an existing Agent\n rpc Get (GetAgentRequest) returns (Agent) {}\n // Deletes an existing Agent\n rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}\n // Lists all Agents\n rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}\n // Find Agents by field name and value\n rpc FindBy (FindByRequest) returns (FindByResponse) {}\n}\n\nenum Privacy {\n PRIVATE = 0;\n NONE = 1;\n}\n\n// The message for the Agent resource\nmessage Agent {\n // The API version of the Agent\n string api_version = 1;\n // The unique identifier of the Agent\n string ref = 2;\n // The name of the Agent\n string name = 3;\n // The username of the Agent\n string username = 4;\n // The password of the Agent\n Privacy privacy = 5;\n // The enabled status of the Agent\n bool enabled = 6;\n // The created_at timestamp of the Agent\n int32 created_at = 7;\n // The updated_at timestamp of the Agent\n int32 updated_at = 8;\n // The domain of the Agent\n fonoster.routr.connect.domains.v2beta1.Domain domain = 9;\n // The credentials of the Agent\n fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 11; \n}\n\n// The request message for the Agents.Create method\nmessage CreateAgentRequest {\n // The name of the Agent\n string name = 1;\n // The username of the Agent\n string username = 2;\n // The password of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7; \n}\n\n// The request message for the Agents.Update method\nmessage UpdateAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n // The name of the Agent\n string name = 2;\n // The privacy settings of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7;\n}\n\n// The request message for the Agents.Get method\nmessage GetAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.Delete method\nmessage DeleteAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.FindBy method\nmessage FindByRequest {\n // The field name to search\n string field_name = 1;\n // The value to search\n string field_value = 2;\n}\n\n// The response message for the Agents.FindBy method\nmessage FindByResponse {\n // The list of Agents\n repeated Agent items = 1;\n} \n\n// The request message for the Agents.List method\nmessage ListAgentsRequest {\n // The maximum number of items in the list\n int32 page_size = 1;\n\n // The next_page_token value returned from the previous request, if any\n string page_token = 2;\n}\n\n// The response message for the Agents.List method\nmessage ListAgentsResponse {\n // List of Agents\n repeated Agent items = 1;\n\n // Token to retrieve the next page of results or empty if there are no more results in the list\n string next_page_token = 2;\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["To see the complete protobuf spec, please visit the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"protobuf directory."})]}),"\n",(0,t.jsx)(n.h2,{id:"launching-the-apiserver",children:"Launching the APIServer"}),"\n",(0,t.jsxs)(n.p,{children:["Both implementations are available as Docker images from Docker Hub as ",(0,t.jsx)(n.code,{children:"fonoster/routr-pgdata"})," and ",(0,t.jsx)(n.code,{children:"fonoster/routr-simpledata"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run -it \\\n -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \\\n -p 51907:51907 \\\n -p 51908:51908 \\\n fonoster/routr-pgdata\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The port ",(0,t.jsx)(n.code,{children:"51907"})," is used for internal communication, and the port ",(0,t.jsx)(n.code,{children:"51908"})," is used for external communication. The CTL and SDK use the external port to manage the data."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -v /path/to/resources:/etc/routr/resources \\\n -p 51907:51907 \\\n fonoster/routr-simpledata\n"})}),"\n",(0,t.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,t.jsxs)(n.p,{children:["One easy way to interact with the APIServer for testing and development is to use ",(0,t.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Agents service within the APIServer:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto agents.proto -d '{...}' \\\n localhost:51907 \\\n fonoster.routr.connect.agents.v2beta1.Agents/Get\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Please remember that the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation does not accept write operations."]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>c});var t=s(6540);const r={},i=t.createContext(r);function d(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7cf72cd4.cce3242e.js b/assets/js/7cf72cd4.cce3242e.js deleted file mode 100644 index 7347cc791..000000000 --- a/assets/js/7cf72cd4.cce3242e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8937],{1370:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=s(4848),r=s(8453);const i={},d="APIServer",c={id:"development/components/apiserver",title:"APIServer",description:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.",source:"@site/docs/development/components/apiserver.md",sourceDirName:"development/components",slug:"/development/components/apiserver",permalink:"/docs/2.0.0/development/components/apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/apiserver.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"},next:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"}},o={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the APIServer",id:"launching-the-apiserver",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"apiserver",children:"APIServer"}),"\n",(0,t.jsx)(n.p,{children:"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC."}),"\n",(0,t.jsxs)(n.p,{children:["The APIServer has two implementations: the ",(0,t.jsx)(n.code,{children:"pgdata"})," for persistent data storage in a PostgreSQL database and the ",(0,t.jsx)(n.code,{children:"simpledata"})," for storing data in files. The ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation is intended for testing and small deployments."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has several advantages over the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation. The first advantage is that the ",(0,t.jsx)(n.code,{children:"pgdata"})," allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the ",(0,t.jsx)(n.code,{children:"extended"})," attribute, enabling you to store additional data in the database in JSON format\u2014more on this in later sections."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Data Migration"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation uses ",(0,t.jsx)(n.a,{href:"https://www.prisma.io/",children:"Prisma"})," to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily."]}),"\n",(0,t.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"pgdata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DATABASE_URL"})," - The URL of the PostgreSQL database. Example: ",(0,t.jsx)(n.code,{children:"postgresql://postgres:postgres@localhost:5432/routr"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"EXTERNAL_SERVER_BIND_ADDR"})," - The address where the APIServer will listen for HTTP requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51908"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TLS_ON"})," - Enables TLS for the gRPC server. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"VERIFY_CLIENT_CERT"})," - Enables client certificate verification. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"CACERT"})," - The path to the CA certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/ca.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SERVER_CERT"})," - The path to the server certificate. Default to ",(0,t.jsx)(n.code,{children:"/etc/routr/certs/server.crt"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164"})," - Enables E164 validation for Numbers. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ENFORCE_E164_WITH_MOBILE_PREFIX"})," - Enables E164 validation for Numbers with mobile prefixes. Default to ",(0,t.jsx)(n.code,{children:"false"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For details about connecting to the ",(0,t.jsx)(n.code,{children:"pgdata"})," to manage the data, see the ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/command-line/overview",children:"CTL"})," and ",(0,t.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"SDK"})," documentation."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"simpledata"})," has the following environment variables available for configuration:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PATH_TO_RESOURCES"})," - The path to the directory where the data will be stored. Example: ",(0,t.jsx)(n.code,{children:"/etc/routr/resources"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"BIND_ADDR"})," - The address where the APIServer will listen for gRPC requests. Default to ",(0,t.jsx)(n.code,{children:"0.0.0.0:51907"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components."}),"\n",(0,t.jsx)(n.p,{children:"In your resources directory, you will find the following files:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"agents.yaml"})," - A list of Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"domains.yaml"})," - A list of Domains to which Agents belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"trunks.yaml"})," - Represents the list of Trunks"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"numbers.yaml"})," - A list of Numbers to which Trunks belong"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"peers.yaml"})," - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"credentials.yaml"})," - A list of Credentials for Peers and Agents"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"acl.yaml"})," - The list of ACLs"]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["You may also provide a ",(0,t.jsx)(n.code,{children:".json"})," file instead of a ",(0,t.jsx)(n.code,{children:".yaml"})," file."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The Agents configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.domainRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Agent"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.privacy"})}),(0,t.jsxs)(n.td,{children:["The privacy settings of the Agent (",(0,t.jsx)(n.code,{children:"Private"})," or ",(0,t.jsx)(n.code,{children:"None"}),")"]}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.enabled"})}),(0,t.jsx)(n.td,{children:"The enabled status of the Agent (reserved for future use)"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an Agents configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"agents.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n privacy: Private\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Agent ",(0,t.jsx)(n.code,{children:"agent-01"})," has the username ",(0,t.jsx)(n.code,{children:"1001"}),", belongs to the Domain ",(0,t.jsx)(n.code,{children:"domain-01"}),", and uses the Credentials ",(0,t.jsx)(n.code,{children:"credentials-01"}),". Both the Domain and the Credentials are required for the Agent to work."]}),"\n",(0,t.jsx)(n.p,{children:"The Domains configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Domain"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.domainUri"})}),(0,t.jsx)(n.td,{children:"The domain URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies"})}),(0,t.jsx)(n.td,{children:"The list of egress policies"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].rule"})}),(0,t.jsx)(n.td,{children:"The regular expression to match the number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.context.egressPolicies[*].numberRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Domains configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"domains.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,t.jsxs)(n.p,{children:["In the example above, the Domain ",(0,t.jsx)(n.code,{children:"domain-01"})," has the Domain URI ",(0,t.jsx)(n.code,{children:"sip.local"})," and the egress policy ",(0,t.jsx)(n.code,{children:".*"})," that matches all numbers. The egress policy is associated with the Number ",(0,t.jsx)(n.code,{children:"number-01"}),". The Number ",(0,t.jsx)(n.code,{children:"number-01"})," is required for the Domain to work."]}),"\n",(0,t.jsx)(n.p,{children:"Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.city"})}),(0,t.jsx)(n.td,{children:"The city where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.country"})}),(0,t.jsx)(n.td,{children:"The country where the Number is located"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.geoInfo.countryISOCode"})}),(0,t.jsx)(n.td,{children:"The ISO code of the country"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.trunkRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.telUrl"})}),(0,t.jsx)(n.td,{children:"The tel URL of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.aorLink"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Number"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"})}),(0,t.jsx)(n.td,{children:"The session affinity header of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders"})}),(0,t.jsx)(n.td,{children:"The extra headers of the Number"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.location.extraHeaders[*].name"})}),(0,t.jsx)(n.td,{children:"The name of the extra header"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["Tthe ' tel: ' scheme is required when setting the ",(0,t.jsx)(n.code,{children:"spec.location.telUrl"})," property. For example, ",(0,t.jsx)(n.code,{children:"tel:+17066041487"}),". Here, ",(0,t.jsx)(n.code,{children:"tel:"})," indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider."]}),"\n",(0,t.jsxs)(n.p,{children:["Another important property is the ",(0,t.jsx)(n.code,{children:"spec.location.aorLink"}),". The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.location.sessionAffinityHeader"}),' tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the ',(0,t.jsx)(n.code,{children:"X-Room-Id"})," header to identify the session. The Location Service will use the header's value to identify the session."]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Numbers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"numbers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(706)604-1487"\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+17066041487\n aorLink: sip:conference@sip.local\n sessionAffinityHeader: X-Room-Id\n extraHeaders:\n - name: X-Room-Id\n value: jsa-shqm-iyo\n'})}),"\n",(0,t.jsx)(n.p,{children:"Numbers must be associated with a Trunk to work."}),"\n",(0,t.jsx)(n.p,{children:"The Trunks configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.region"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.uri"})}),(0,t.jsx)(n.td,{children:"The inbound URI of the Trunk"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.inbound.accessControlListRef"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.sendRegister"})}),(0,t.jsx)(n.td,{children:"Enables outbound registration"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Trunk"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris"})}),(0,t.jsx)(n.td,{children:"The list of outbound URIs"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].uri"})}),(0,t.jsx)(n.td,{children:"The outbound URI"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].priority"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].weight"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].enabled"})}),(0,t.jsx)(n.td,{children:"Reserved for future use"}),(0,t.jsx)(n.td,{children:"NA"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].transport"})}),(0,t.jsx)(n.td,{children:"The transport of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].user"})}),(0,t.jsx)(n.td,{children:"The user of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].host"})}),(0,t.jsx)(n.td,{children:"The host of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.outbound.uris[*].port"})}),(0,t.jsx)(n.td,{children:"The port of the outbound URI"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Trunks configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"trunks.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Trunk\n ref: trunk-01\n metadata:\n name: Test Trunk\n region: us-east1\n spec:\n inbound:\n uri: trunk01.acme.com\n accessControlListRef: acl-01\n outbound:\n sendRegister: true\n credentialsRef: credentials-04\n uris:\n - uri:\n user: pbx-1\n host: sip.provider.net\n port: 7060\n transport: udp\n enabled: true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.inbound"})," section, the ",(0,t.jsx)(n.code,{children:"uri"})," property helps Routr to identify the Trunk. Calls from the PSTN using the ",(0,t.jsx)(n.code,{children:"uri"})," will be routed to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," property restricts the access to the Trunk. The ",(0,t.jsx)(n.code,{children:"accessControlListRef"})," is optional."]}),"\n",(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"spec.outbound"})," section, the ",(0,t.jsx)(n.code,{children:"sendRegister"})," property enables registration outbound registrations while the ",(0,t.jsx)(n.code,{children:"credentialsRef"})," property for authentication with your trunk provider."]}),"\n",(0,t.jsx)(n.p,{children:"In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.aor"})}),(0,t.jsx)(n.td,{children:"The Address of Record (AOR) of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.username"})}),(0,t.jsx)(n.td,{children:"The username of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentialsRef"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials of the Peer"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})}),(0,t.jsx)(n.td,{children:"Enables session affinity"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})}),(0,t.jsx)(n.td,{children:"The load balancing algorithm"}),(0,t.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.withSessionAffinity"})," property enables session affinity, and the ",(0,t.jsx)(n.code,{children:"spec.loadBalancing.algorithm"})," property sets the load-balancing algorithm. The available algorithms are ",(0,t.jsx)(n.code,{children:"least-sessions"})," and ",(0,t.jsx)(n.code,{children:"round-robin"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Remember that for the ",(0,t.jsx)(n.code,{children:"least-sessions"})," algorithm to work, your SIP backend includes the special header ",(0,t.jsx)(n.code,{children:"X-Session-Count"})," with the number of active sessions as part of the registration request."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Peers configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"peers.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Peer\n ref: peer-01\n metadata:\n name: Asterisk (Media Server)\n spec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-03\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsx)(n.p,{children:"Credentials in Routr help Agents and Peers authenticate with Routr."}),"\n",(0,t.jsx)(n.p,{children:"The Credentials configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.username"})}),(0,t.jsx)(n.td,{children:"The username of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.credentials.password"})}),(0,t.jsx)(n.td,{children:"The password of the Credentials"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of a Credentials configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"credentials.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Credentials\n ref: credentials-01\n metadata:\n name: Agent Credentials\n spec:\n credentials:\n username: "1001"\n password: "1234"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains."}),"\n",(0,t.jsx)(n.p,{children:"The ACLs configuration file has the following structure:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Required"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"apiVersion"})}),(0,t.jsx)(n.td,{children:"The API version of the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"kind"})}),(0,t.jsx)(n.td,{children:"The kind of resource"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ref"})}),(0,t.jsx)(n.td,{children:"Reference to the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"metadata.name"})}),(0,t.jsx)(n.td,{children:"A friendly name for the ACL"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny"})}),(0,t.jsx)(n.td,{children:"The list of deny rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.deny[*]"})}),(0,t.jsx)(n.td,{children:"The deny rule"}),(0,t.jsx)(n.td,{children:"Yes"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow"})}),(0,t.jsx)(n.td,{children:"The list of allow rules"}),(0,t.jsx)(n.td,{children:"No"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"spec.accessControlList.allow[*]"})}),(0,t.jsx)(n.td,{children:"The allow rule"}),(0,t.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"An example of an ACLs configuration file:"}),"\n",(0,t.jsxs)(n.p,{children:["Filename: ",(0,t.jsx)(n.code,{children:"acl.yaml"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: AccessControlList\n ref: acl-01\n metadata:\n name: Europe ACL\n spec:\n accessControlList:\n deny:\n - 0.0.0.0/1\n allow:\n - 192.168.1.3/31\n - 127.0.0.1/8\n - 10.111.221.22/31\n"})}),"\n",(0,t.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(n.p,{children:"Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc."}),"\n",(0,t.jsx)(n.p,{children:"The following protobuf defines the Agent service interface:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.connect.agents.v2beta1;\n\n// The Agents service definition\nservice Agents {\n // Creates a new Agent\n rpc Create (CreateAgentRequest) returns (Agent) {}\n // Updates an existing Agent\n rpc Update (UpdateAgentRequest) returns (Agent) {}\n // Gets an existing Agent\n rpc Get (GetAgentRequest) returns (Agent) {}\n // Deletes an existing Agent\n rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}\n // Lists all Agents\n rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}\n // Find Agents by field name and value\n rpc FindBy (FindByRequest) returns (FindByResponse) {}\n}\n\nenum Privacy {\n PRIVATE = 0;\n NONE = 1;\n}\n\n// The message for the Agent resource\nmessage Agent {\n // The API version of the Agent\n string api_version = 1;\n // The unique identifier of the Agent\n string ref = 2;\n // The name of the Agent\n string name = 3;\n // The username of the Agent\n string username = 4;\n // The password of the Agent\n Privacy privacy = 5;\n // The enabled status of the Agent\n bool enabled = 6;\n // The created_at timestamp of the Agent\n int32 created_at = 7;\n // The updated_at timestamp of the Agent\n int32 updated_at = 8;\n // The domain of the Agent\n fonoster.routr.connect.domains.v2beta1.Domain domain = 9;\n // The credentials of the Agent\n fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 11; \n}\n\n// The request message for the Agents.Create method\nmessage CreateAgentRequest {\n // The name of the Agent\n string name = 1;\n // The username of the Agent\n string username = 2;\n // The password of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7; \n}\n\n// The request message for the Agents.Update method\nmessage UpdateAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n // The name of the Agent\n string name = 2;\n // The privacy settings of the Agent\n Privacy privacy = 3;\n // The enabled status of the Agent\n bool enabled = 4;\n // Reference to the Domain of the Agent\n string domain_ref = 5;\n // Reference to the Credentials of the Agent\n string credentials_ref = 6;\n // The extended attributes of the Agent\n .google.protobuf.Struct extended = 7;\n}\n\n// The request message for the Agents.Get method\nmessage GetAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.Delete method\nmessage DeleteAgentRequest {\n // The unique identifier of the Agent\n string ref = 1;\n}\n\n// The request message for the Agents.FindBy method\nmessage FindByRequest {\n // The field name to search\n string field_name = 1;\n // The value to search\n string field_value = 2;\n}\n\n// The response message for the Agents.FindBy method\nmessage FindByResponse {\n // The list of Agents\n repeated Agent items = 1;\n} \n\n// The request message for the Agents.List method\nmessage ListAgentsRequest {\n // The maximum number of items in the list\n int32 page_size = 1;\n\n // The next_page_token value returned from the previous request, if any\n string page_token = 2;\n}\n\n// The response message for the Agents.List method\nmessage ListAgentsResponse {\n // List of Agents\n repeated Agent items = 1;\n\n // Token to retrieve the next page of results or empty if there are no more results in the list\n string next_page_token = 2;\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["To see the complete protobuf spec, please visit the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"protobuf directory."})]}),"\n",(0,t.jsx)(n.h2,{id:"launching-the-apiserver",children:"Launching the APIServer"}),"\n",(0,t.jsxs)(n.p,{children:["Both implementations are available as Docker images from Docker Hub as ",(0,t.jsx)(n.code,{children:"fonoster/routr-pgdata"})," and ",(0,t.jsx)(n.code,{children:"fonoster/routr-simpledata"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"pgdata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"pgdata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'docker run -it \\\n -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \\\n -p 51907:51907 \\\n -p 51908:51908 \\\n fonoster/routr-pgdata\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The port ",(0,t.jsx)(n.code,{children:"51907"})," is used for internal communication, and the port ",(0,t.jsx)(n.code,{children:"51908"})," is used for external communication. The CTL and SDK use the external port to manage the data."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"simpledata"})}),"\n",(0,t.jsxs)(n.p,{children:["To launch the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -it \\\n -v /path/to/resources:/etc/routr/resources \\\n -p 51907:51907 \\\n fonoster/routr-simpledata\n"})}),"\n",(0,t.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,t.jsxs)(n.p,{children:["One easy way to interact with the APIServer for testing and development is to use ",(0,t.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Agents service within the APIServer:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto agents.proto -d '{...}' \\\n localhost:51907 \\\n fonoster.routr.connect.agents.v2beta1.Agents/Get\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Please remember that the ",(0,t.jsx)(n.code,{children:"simpledata"})," implementation does not accept write operations."]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>c});var t=s(6540);const r={},i=t.createContext(r);function d(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7df8ae3f.46854fda.js b/assets/js/7df8ae3f.fd43e544.js similarity index 98% rename from assets/js/7df8ae3f.46854fda.js rename to assets/js/7df8ae3f.fd43e544.js index a6bb36f31..7e210c318 100644 --- a/assets/js/7df8ae3f.46854fda.js +++ b/assets/js/7df8ae3f.fd43e544.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2405],{5312:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=s(4848),r=s(8453);const i={},d="restartServer",o={id:"api/status/update",title:"restartServer",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/status/update.md",sourceDirName:"api/status",slug:"/api/status/update",permalink:"/docs/1.x.x/api/status/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"},next:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"restartserver",children:"restartServer"}),"\n",(0,n.jsx)(t.p,{children:"This method returns information about the server."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status/{status}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"POST"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"status"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["This accepts either ",(0,n.jsx)(t.code,{children:"down"})," or ",(0,n.jsx)(t.code,{children:"restarting"})," parameters"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"now"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,n.jsx)(t.code,{children:"true"})," it will not wait for current calls to finish"]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method causes the server to change its status."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/system/status/reload\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Request sent to server"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const r={},i=n.createContext(r);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2405],{1751:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=s(4848),r=s(8453);const i={},d="restartServer",o={id:"api/status/update",title:"restartServer",description:"This method returns information about the server.",source:"@site/versioned_docs/version-1.x.x/api/status/update.md",sourceDirName:"api/status",slug:"/api/status/update",permalink:"/docs/1.x.x/api/status/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"checkSystemStatus",permalink:"/docs/1.x.x/api/status/get"},next:{title:"getServerInfo",permalink:"/docs/1.x.x/api/sys/info"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"restartserver",children:"restartServer"}),"\n",(0,n.jsx)(t.p,{children:"This method returns information about the server."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status/{status}"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"POST"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"status"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["This accepts either ",(0,n.jsx)(t.code,{children:"down"})," or ",(0,n.jsx)(t.code,{children:"restarting"})," parameters"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"now"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"boolean"}),(0,n.jsxs)(t.td,{style:{textAlign:"left"},children:["If set to ",(0,n.jsx)(t.code,{children:"true"})," it will not wait for current calls to finish"]})]})]})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method causes the server to change its status."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/system/status/reload\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Request sent to server"\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const r={},i=n.createContext(r);function d(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7efb1a82.15e4652c.js b/assets/js/7efb1a82.c0fa263d.js similarity index 98% rename from assets/js/7efb1a82.15e4652c.js rename to assets/js/7efb1a82.c0fa263d.js index 25490dbcd..a2eea6923 100644 --- a/assets/js/7efb1a82.15e4652c.js +++ b/assets/js/7efb1a82.c0fa263d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[767],{9586:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var n=r(4848),s=r(8453);const o={},i="Numbers",d={id:"configuration/numbers",title:"Numbers",description:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.",source:"@site/versioned_docs/version-1.x.x/configuration/numbers.md",sourceDirName:"configuration",slug:"/configuration/numbers",permalink:"/docs/1.x.x/configuration/numbers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/numbers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"General",permalink:"/docs/1.x.x/configuration/general"},next:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"}},c={},l=[{value:"Number Resource",id:"number-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"numbers",children:"Numbers"}),"\n",(0,n.jsx)(t.p,{children:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways."}),"\n",(0,n.jsxs)(t.p,{children:["The Numbers configuration can be provided using the file ",(0,n.jsx)(t.code,{children:"config/numbers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"number-resource",children:"Number Resource"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"apiVersion"}),(0,n.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"kind"}),(0,n.jsx)(t.td,{children:"Defines the type of resource"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.ref"}),(0,n.jsx)(t.td,{children:"Reference to this resource"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.gwRef"}),(0,n.jsx)(t.td,{children:"Reference to parent Gateway"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.city"}),(0,n.jsx)(t.td,{children:"City of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.country"}),(0,n.jsx)(t.td,{children:"Country of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.countryISOCode"}),(0,n.jsx)(t.td,{children:"The Country ISO code for the Number (i.e., US)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.telUrl"}),(0,n.jsx)(t.td,{children:"Number URI available in the location server"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.aorLink"}),(0,n.jsx)(t.td,{children:"Address of record of SIP device for call routing"}),(0,n.jsx)(t.td,{children:"Yes"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n ref: Number0001\n gwRef: GW0001\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local'\n"})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>d});var n=r(6540);const s={},o=n.createContext(s);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[767],{6385:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var n=r(4848),s=r(8453);const o={},i="Numbers",d={id:"configuration/numbers",title:"Numbers",description:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.",source:"@site/versioned_docs/version-1.x.x/configuration/numbers.md",sourceDirName:"configuration",slug:"/configuration/numbers",permalink:"/docs/1.x.x/configuration/numbers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/numbers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"General",permalink:"/docs/1.x.x/configuration/general"},next:{title:"Peers",permalink:"/docs/1.x.x/configuration/peers"}},c={},l=[{value:"Number Resource",id:"number-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"numbers",children:"Numbers"}),"\n",(0,n.jsx)(t.p,{children:"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways."}),"\n",(0,n.jsxs)(t.p,{children:["The Numbers configuration can be provided using the file ",(0,n.jsx)(t.code,{children:"config/numbers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"number-resource",children:"Number Resource"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Property"}),(0,n.jsx)(t.th,{children:"Description"}),(0,n.jsx)(t.th,{children:"Required"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"apiVersion"}),(0,n.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"kind"}),(0,n.jsx)(t.td,{children:"Defines the type of resource"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.ref"}),(0,n.jsx)(t.td,{children:"Reference to this resource"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.gwRef"}),(0,n.jsx)(t.td,{children:"Reference to parent Gateway"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.city"}),(0,n.jsx)(t.td,{children:"City of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.country"}),(0,n.jsx)(t.td,{children:"Country of the Number"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"metadata.geoInfo.countryISOCode"}),(0,n.jsx)(t.td,{children:"The Country ISO code for the Number (i.e., US)"}),(0,n.jsx)(t.td,{children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.telUrl"}),(0,n.jsx)(t.td,{children:"Number URI available in the location server"}),(0,n.jsx)(t.td,{children:"Yes"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"spec.location.aorLink"}),(0,n.jsx)(t.td,{children:"Address of record of SIP device for call routing"}),(0,n.jsx)(t.td,{children:"Yes"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n ref: Number0001\n gwRef: GW0001\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local'\n"})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>d});var n=r(6540);const s={},o=n.createContext(s);function i(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80948d28.0ae85d03.js b/assets/js/80948d28.0ae85d03.js new file mode 100644 index 000000000..a8ce394ea --- /dev/null +++ b/assets/js/80948d28.0ae85d03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5066],{6910:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var n=o(4848),s=o(8453);const r={},i="Alteration Methods",d={id:"development/alterations/methods",title:"Alteration Methods",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/development/alterations/methods.md",sourceDirName:"development/alterations",slug:"/development/alterations/methods",permalink:"/docs/2.0.0/development/alterations/methods",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/alterations/methods.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/development/alterations/overview"},next:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"}},a={},l=[];function c(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"alteration-methods",children:"Alteration Methods"}),"\n",(0,n.jsx)(t.p,{children:"Coming soon."})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>d});var n=o(6540);const s={},r=n.createContext(s);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80d7fb78.dc10b0bc.js b/assets/js/80d7fb78.dc10b0bc.js new file mode 100644 index 000000000..b1c49b119 --- /dev/null +++ b/assets/js/80d7fb78.dc10b0bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7305],{9447:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),r=t(8453);const s={},i="Location Service",c={id:"development/components/location",title:"Location Service",description:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.",source:"@site/versioned_docs/version-2.0.0/development/components/location.md",sourceDirName:"development/components",slug:"/development/components/location",permalink:"/docs/2.0.0/development/components/location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/location.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"},next:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Location Service with Docker",id:"launching-the-location-service-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"location-service",children:"Location Service"}),"\n",(0,o.jsx)(n.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,o.jsx)(n.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,o.jsx)(n.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,o.jsxs)(n.p,{children:["Two balancing algorithms are available. The first is ",(0,o.jsx)(n.code,{children:"round-robin"}),", and the second is ",(0,o.jsx)(n.code,{children:"least-sessions"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,o.jsx)(n.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that the load balancing section sets the ",(0,o.jsx)(n.code,{children:"withSessionAffinity"})," to ",(0,o.jsx)(n.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every Asterisk server that registers using the ",(0,o.jsx)(n.code,{children:"asterisk"})," username will join the same group under the ",(0,o.jsx)(n.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,o.jsx)(n.p,{children:"To configure the Location Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"region"})}),(0,o.jsx)(n.td,{children:"Reserved for future use"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"bindAddr"})}),(0,o.jsx)(n.td,{children:"IPv4 interface on which to accept requests"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache"})}),(0,o.jsx)(n.td,{children:"Cache configuration"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.provider"})}),(0,o.jsxs)(n.td,{children:["Cache provider (Accepts either ",(0,o.jsx)(n.code,{children:"memory"})," or ",(0,o.jsx)(n.code,{children:"redis"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.parameters"})}),(0,o.jsx)(n.td,{children:"Cache parameters (Comma-separated key-value pairs)"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,o.jsx)(n.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"username"})}),(0,o.jsx)(n.td,{children:"Username (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"password"})}),(0,o.jsx)(n.td,{children:"Password (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"host"})}),(0,o.jsxs)(n.td,{children:["Redis host (Defaults to ",(0,o.jsx)(n.code,{children:"localhost"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"port"})}),(0,o.jsxs)(n.td,{children:["Redis port (Defaults to ",(0,o.jsx)(n.code,{children:"6379"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"secure"})}),(0,o.jsx)(n.td,{children:"Use secure connection for Redis"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Here is an example of a configuration file:"}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.code,{children:"location.yaml"})," or ",(0,o.jsx)(n.code,{children:"location.json"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'kind: Location\napiVersion: v2beta1\nmetadata:\n region: default\nspec:\n bindAddr: 0.0.0.0:51902\n cache:\n provider: redis\n parameters: "host=localhost,port=6379"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that using the ",(0,o.jsx)(n.code,{children:"memory"})," provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the ",(0,o.jsx)(n.code,{children:"least-session"})," algorithm and run multiple instances of the Location Service. In such cases, you will need the ",(0,o.jsx)(n.code,{children:"redis"})," provider."]}),"\n",(0,o.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,o.jsx)(n.p,{children:"Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.location.v2beta1;\n\nimport "google/protobuf/empty.proto";\nimport "common.proto";\nimport "processor.proto";\n\nservice Location {\n rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}\n rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}\n rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}\n}\n\n// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)\nmessage Route {\n string user = 1;\n string host = 2;\n string port = 3;\n string advertised_host = 13;\n string advertised_port = 14;\n fonoster.routr.common.v2beta1.Transport transport = 4;\n int64 registered_on = 5;\n int32 expires = 6;\n int32 session_count = 7;\n string edge_port_ref = 8;\n repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;\n repeated string localnets = 10;\n repeated string external_addrs = 11;\n // During route creation, an endpoint can request to add labels that can later be\n // used as selectors. For example, a Softphone can add a label `priority=1` to indicate\n // that it is the preferred endpoint for the given AOR.\n map<string, string> labels = 12;\n}\n\nmessage AddRouteRequest {\n // Address of record for the endpoint or trunk\n string aor = 1;\n Route route = 2;\n}\n\nmessage FindRoutesRequest {\n message Backend {\n enum Algoritm {\n ROUND_ROBIN = 0;\n LEAST_SESSIONS = 1;\n }\n string ref = 1;\n bool with_session_affinity = 2;\n Algoritm algorithm = 3;\n }\n string call_id = 1;\n string aor = 2;\n string session_affinity_ref = 3;\n Backend backend = 4;\n map<string, string> labels = 5;\n}\n\nmessage FindRoutesResponse {\n repeated Route routes = 1;\n}\n\nmessage RemoveRoutesRequest {\n string aor = 1;\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Upon receiving a valid ",(0,o.jsx)(n.code,{children:"AddRoute"})," request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition."]}),"\n",(0,o.jsxs)(n.p,{children:["Link to the ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/location.proto",children:"protobuf definition."})]}),"\n",(0,o.jsx)(n.h2,{id:"launching-the-location-service-with-docker",children:"Launching the Location Service with Docker"}),"\n",(0,o.jsxs)(n.p,{children:["The Location Service is available as a Docker image from ",(0,o.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-location",children:"Docker Hub"}),". To launch the Location Service with Docker, you can use the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port ",(0,o.jsx)(n.code,{children:"51902"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,o.jsx)(n.code,{children:"51902"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,o.jsxs)(n.p,{children:["One easy way to interact with the Location Service for testing and development is to use ",(0,o.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Location Service using gRPCurl:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto location.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.location.v2beta1.Location/AddRouteRequest\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>c});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81e5f1d0.42495023.js b/assets/js/81e5f1d0.42495023.js new file mode 100644 index 000000000..0fa9bed9a --- /dev/null +++ b/assets/js/81e5f1d0.42495023.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9583],{650:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var i=t(4848),s=t(8453);const r={},o="Domains",d={id:"configuration/domains",title:"Domains",description:"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and",source:"@site/versioned_docs/version-1.x.x/configuration/domains.md",sourceDirName:"configuration",slug:"/configuration/domains",permalink:"/docs/1.x.x/configuration/domains",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/domains.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"},next:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"}},c={},l=[{value:"Domain Resource",id:"domain-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"domains",children:"Domains"}),"\n",(0,i.jsxs)(n.p,{children:["Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and\noutgoing calling. The domains configuration can be provided using the file ",(0,i.jsx)(n.code,{children:"config/domains.yml"})," located at the root of your Routr installation."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"domain-resource",children:"Domain Resource"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"apiVersion"}),(0,i.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"kind"}),(0,i.jsx)(n.td,{children:"Defines the type of resource"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"metadata.name"}),(0,i.jsx)(n.td,{children:"Friendly name for the SIP domain"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.domainUri"}),(0,i.jsx)(n.td,{children:"Domain URI. FQDN is recommended"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.rule"}),(0,i.jsxs)(n.td,{children:["Regular expression indicating when a call will be routed via ",(0,i.jsx)(n.code,{children:"spec.context.egressPolicy.numberRef"})]}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.numberRef"}),(0,i.jsx)(n.td,{children:"Reference to the Number that will route the call"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.allow[*]"}),(0,i.jsx)(n.td,{children:"Traffic allow for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.deny[*]"}),(0,i.jsx)(n.td,{children:"Traffic disabled for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0.0.0.0/1 # all"}),"\n",(0,i.jsx)(n.li,{children:"192.168.1.0/255.255.255.0"}),"\n",(0,i.jsx)(n.li,{children:"192.168.0.1/31"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Server\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: Number0001\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(6540);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81e5f1d0.d7a2877e.js b/assets/js/81e5f1d0.d7a2877e.js deleted file mode 100644 index dd7490ad0..000000000 --- a/assets/js/81e5f1d0.d7a2877e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9583],{4053:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var i=t(4848),s=t(8453);const r={},o="Domains",d={id:"configuration/domains",title:"Domains",description:"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and",source:"@site/versioned_docs/version-1.x.x/configuration/domains.md",sourceDirName:"configuration",slug:"/configuration/domains",permalink:"/docs/1.x.x/configuration/domains",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/domains.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Agents",permalink:"/docs/1.x.x/configuration/agents"},next:{title:"Gateways",permalink:"/docs/1.x.x/configuration/gateways"}},c={},l=[{value:"Domain Resource",id:"domain-resource",level:2},{value:"Example",id:"example",level:2}];function a(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"domains",children:"Domains"}),"\n",(0,i.jsxs)(n.p,{children:["Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and\noutgoing calling. The domains configuration can be provided using the file ",(0,i.jsx)(n.code,{children:"config/domains.yml"})," located at the root of your Routr installation."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"domain-resource",children:"Domain Resource"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"apiVersion"}),(0,i.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"kind"}),(0,i.jsx)(n.td,{children:"Defines the type of resource"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"metadata.name"}),(0,i.jsx)(n.td,{children:"Friendly name for the SIP domain"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.domainUri"}),(0,i.jsx)(n.td,{children:"Domain URI. FQDN is recommended"}),(0,i.jsx)(n.td,{children:"Yes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.rule"}),(0,i.jsxs)(n.td,{children:["Regular expression indicating when a call will be routed via ",(0,i.jsx)(n.code,{children:"spec.context.egressPolicy.numberRef"})]}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.egressPolicy.numberRef"}),(0,i.jsx)(n.td,{children:"Reference to the Number that will route the call"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.allow[*]"}),(0,i.jsx)(n.td,{children:"Traffic allow for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"spec.context.accessControlList.deny[*]"}),(0,i.jsx)(n.td,{children:"Traffic disabled for Network in list"}),(0,i.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0.0.0.0/1 # all"}),"\n",(0,i.jsx)(n.li,{children:"192.168.1.0/255.255.255.0"}),"\n",(0,i.jsx)(n.li,{children:"192.168.0.1/31"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Server\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: Number0001\n accessControlList:\n deny: [0.0.0.0/1] # Deny all\n allow: [192.168.0.1/31]\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(6540);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8613bfde.27bc27a2.js b/assets/js/8613bfde.27bc27a2.js new file mode 100644 index 000000000..d48ecf014 --- /dev/null +++ b/assets/js/8613bfde.27bc27a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3296],{7020:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});var s=t(4848),r=t(8453);const o={},l="Sending Call Events to NATS",i={id:"connect/sending-call-events-to-nats",title:"Sending Call Events to NATS",description:"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:",source:"@site/docs/connect/sending-call-events-to-nats.md",sourceDirName:"connect",slug:"/connect/sending-call-events-to-nats",permalink:"/docs/2.11.5/connect/sending-call-events-to-nats",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/sending-call-events-to-nats.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the Server",permalink:"/docs/2.11.5/connect/securing-the-server"},next:{title:"Community",permalink:"/docs/2.11.5/community"}},c={},a=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sending-call-events-to-nats",children:"Sending Call Events to NATS"}),"\n",(0,s.jsxs)(n.p,{children:["Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_ENABLED"})," to ",(0,s.jsx)(n.code,{children:"true"})," as well as the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_URL"})," to the URL of your NATS server. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3"\nservices:\n routr:\n image: fonoster/routr-one:latest\n ports:\n - 51908:51908\n - 5060:5060/udp\n environment:\n - NATS_PUBLISHER_ENABLED=true\n - NATS_PUBLISHER_URL=nats:4222\n'})}),"\n",(0,s.jsx)(n.p,{children:"Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events.\nAs of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added."}),"\n",(0,s.jsx)(n.p,{children:"To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'nats context add nats \\\n --server demo.nats.io:4222 \\\n --description "nats events" \\\n --select\n'})}),"\n",(0,s.jsx)(n.p,{children:"You should then see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS context add",src:t(2774).A+"",width:"880",height:"430"})}),"\n",(0,s.jsxs)(n.p,{children:["In the previous command, we connected to the ",(0,s.jsx)(n.code,{children:"demo.nats.io"})," server, which is a public NATS server. You can use your own NATS server if you have one."]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.call.started"})," subject by running the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.started\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.started"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"from"}),": The caller's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"to"}),": The callee's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"startTime"}),": The time the call started formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Every header startarting with ",(0,s.jsx)(n.code,{children:"X-"})," is considered an extra header. For example, if you send a call with the following headers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"X-My-Header: my-value\nX-Another-Header: another-value\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Then, the ",(0,s.jsx)(n.code,{children:"extraHeaders"})," field will contain the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "X-My-Header": "my-value",\n "X-Another-Header": "another-value"\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"After subscribing to the subject and making a call, you should see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS call started",src:t(2112).A+"",width:"880",height:"430"})}),"\n",(0,s.jsx)(n.p,{children:"Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.ended\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.ended"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"endTime"}),": The time the call ended formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"hangupCause"}),": The reason the call ended"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/edgeport/src/main/java/io/routr/HangupCauses.java",children:"HangupCause.java"})," class for a list of possible hangup causes."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Lastly, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," subject to receive endpoint registered events."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.endpoint.registered\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"aor"}),": The address of record of the endpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"registeredAt"}),": The time the endpoint registered formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"expires"}),": The time in seconds the endpoint will remain registered"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_SUBJECT"})," environment variable to change the based subject name. For example, you can set it to ",(0,s.jsx)(n.code,{children:"myserver"})," to receive call events in the ",(0,s.jsx)(n.code,{children:"myserver.calls.started"})," subject."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2774:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-context-add-nats-7fe6194a7f1fbc08702107ea126c85fd.png"},2112:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-sub-routr-call-started-c75ef439e4a47b8697930de27b57552b.png"},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function l(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8613bfde.82349e8a.js b/assets/js/8613bfde.82349e8a.js deleted file mode 100644 index 4afc2e544..000000000 --- a/assets/js/8613bfde.82349e8a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3296],{7499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});var s=t(4848),r=t(8453);const o={},l="Sending Call Events to NATS",i={id:"connect/sending-call-events-to-nats",title:"Sending Call Events to NATS",description:"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:",source:"@site/docs/connect/sending-call-events-to-nats.md",sourceDirName:"connect",slug:"/connect/sending-call-events-to-nats",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/sending-call-events-to-nats.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"},next:{title:"Community",permalink:"/docs/2.0.0/community"}},c={},a=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sending-call-events-to-nats",children:"Sending Call Events to NATS"}),"\n",(0,s.jsxs)(n.p,{children:["Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_ENABLED"})," to ",(0,s.jsx)(n.code,{children:"true"})," as well as the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_URL"})," to the URL of your NATS server. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3"\nservices:\n routr:\n image: fonoster/routr-one:latest\n ports:\n - 51908:51908\n - 5060:5060/udp\n environment:\n - NATS_PUBLISHER_ENABLED=true\n - NATS_PUBLISHER_URL=nats:4222\n'})}),"\n",(0,s.jsx)(n.p,{children:"Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events.\nAs of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added."}),"\n",(0,s.jsx)(n.p,{children:"To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'nats context add nats \\\n --server demo.nats.io:4222 \\\n --description "nats events" \\\n --select\n'})}),"\n",(0,s.jsx)(n.p,{children:"You should then see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS context add",src:t(2774).A+"",width:"880",height:"430"})}),"\n",(0,s.jsxs)(n.p,{children:["In the previous command, we connected to the ",(0,s.jsx)(n.code,{children:"demo.nats.io"})," server, which is a public NATS server. You can use your own NATS server if you have one."]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.call.started"})," subject by running the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.started\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.started"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"from"}),": The caller's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"to"}),": The callee's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"startTime"}),": The time the call started formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Every header startarting with ",(0,s.jsx)(n.code,{children:"X-"})," is considered an extra header. For example, if you send a call with the following headers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"X-My-Header: my-value\nX-Another-Header: another-value\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Then, the ",(0,s.jsx)(n.code,{children:"extraHeaders"})," field will contain the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "X-My-Header": "my-value",\n "X-Another-Header": "another-value"\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"After subscribing to the subject and making a call, you should see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS call started",src:t(2112).A+"",width:"880",height:"430"})}),"\n",(0,s.jsx)(n.p,{children:"Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.ended\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.ended"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"endTime"}),": The time the call ended formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"hangupCause"}),": The reason the call ended"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/edgeport/src/main/java/io/routr/HangupCauses.java",children:"HangupCause.java"})," class for a list of possible hangup causes."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Lastly, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," subject to receive endpoint registered events."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.endpoint.registered\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"aor"}),": The address of record of the endpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"registeredAt"}),": The time the endpoint registered formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"expires"}),": The time in seconds the endpoint will remain registered"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_SUBJECT"})," environment variable to change the based subject name. For example, you can set it to ",(0,s.jsx)(n.code,{children:"myserver"})," to receive call events in the ",(0,s.jsx)(n.code,{children:"myserver.calls.started"})," subject."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2774:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-context-add-nats-7fe6194a7f1fbc08702107ea126c85fd.png"},2112:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-sub-routr-call-started-c75ef439e4a47b8697930de27b57552b.png"},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function l(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/876e022a.fec538fd.js b/assets/js/876e022a.c66df33c.js similarity index 98% rename from assets/js/876e022a.fec538fd.js rename to assets/js/876e022a.c66df33c.js index 0185a71c1..90c7302c9 100644 --- a/assets/js/876e022a.fec538fd.js +++ b/assets/js/876e022a.c66df33c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1214],{2481:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="Gateways",a={id:"configuration/gateways",title:"Gateways",description:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.",source:"@site/versioned_docs/version-1.x.x/configuration/gateways.md",sourceDirName:"configuration",slug:"/configuration/gateways",permalink:"/docs/1.x.x/configuration/gateways",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/gateways.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"},next:{title:"General",permalink:"/docs/1.x.x/configuration/general"}},o={},c=[{value:"Gateway Resource",id:"gateway-resource",level:2},{value:"Example of Gateway in <code>Registration Mode</code>",id:"example-of-gateway-in-registration-mode",level:2},{value:"Example if Gateway using <code>Static Mode</code>",id:"example-if-gateway-using-static-mode",level:2}];function l(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"gateways",children:"Gateways"}),"\n",(0,s.jsx)(t.p,{children:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN."}),"\n",(0,s.jsxs)(t.p,{children:["The Gateways configuration can be provided using the file ",(0,s.jsx)(t.code,{children:"config/gateways.yml"}),". The file is located at the root of your Routr installation, or as defined in the environment variable ",(0,s.jsx)(t.code,{children:"CONFIG_FILE."})]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For static IP authentication be sure to properly configure the ",(0,s.jsx)(t.code,{children:"spec.externAddr"})," and ",(0,s.jsx)(t.code,{children:"spec.localnets"})," in ",(0,s.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"gateway-resource",children:"Gateway Resource"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Property"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Required"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"apiVersion"}),(0,s.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"kind"}),(0,s.jsx)(t.td,{children:"Defines the type of resource"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.name"}),(0,s.jsx)(t.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.ref"}),(0,s.jsx)(t.td,{children:"Reference to this resource"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.sendRegister"}),(0,s.jsxs)(t.td,{children:["Send SIP REGISTER package to gateway host. Defaults to ",(0,s.jsx)(t.code,{children:"false"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.username"}),(0,s.jsx)(t.td,{children:"Gateway username. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.secret"}),(0,s.jsx)(t.td,{children:"Gateway secret. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.host"}),(0,s.jsx)(t.td,{children:"Gateway host"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.transport"}),(0,s.jsx)(t.td,{children:"Transport protocol"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.expires"}),(0,s.jsxs)(t.td,{children:["Requested lifespan of the registration in seconds. Defaults to ",(0,s.jsx)(t.code,{children:"600"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.registries.[*]"}),(0,s.jsx)(t.td,{children:"Additional registries for ingress calls"}),(0,s.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,s.jsxs)(t.h2,{id:"example-of-gateway-in-registration-mode",children:["Example of Gateway in ",(0,s.jsx)(t.code,{children:"Registration Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider, Inc\n ref: GW0001\n spec:\n host: sip.provider.com\n transport: tcp\n credentials:\n username: 'user'\n secret: changeit\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"example-if-gateway-using-static-mode",children:["Example if Gateway using ",(0,s.jsx)(t.code,{children:"Static Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider 2, Inc\n ref: GW0002\n spec:\n host: sip2.provider.com\n port: 5080\n transport: tcp\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>a});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1214],{8972:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=n(4848),r=n(8453);const i={},d="Gateways",a={id:"configuration/gateways",title:"Gateways",description:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.",source:"@site/versioned_docs/version-1.x.x/configuration/gateways.md",sourceDirName:"configuration",slug:"/configuration/gateways",permalink:"/docs/1.x.x/configuration/gateways",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/gateways.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"},next:{title:"General",permalink:"/docs/1.x.x/configuration/general"}},o={},c=[{value:"Gateway Resource",id:"gateway-resource",level:2},{value:"Example of Gateway in <code>Registration Mode</code>",id:"example-of-gateway-in-registration-mode",level:2},{value:"Example if Gateway using <code>Static Mode</code>",id:"example-if-gateway-using-static-mode",level:2}];function l(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"gateways",children:"Gateways"}),"\n",(0,s.jsx)(t.p,{children:"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN."}),"\n",(0,s.jsxs)(t.p,{children:["The Gateways configuration can be provided using the file ",(0,s.jsx)(t.code,{children:"config/gateways.yml"}),". The file is located at the root of your Routr installation, or as defined in the environment variable ",(0,s.jsx)(t.code,{children:"CONFIG_FILE."})]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For static IP authentication be sure to properly configure the ",(0,s.jsx)(t.code,{children:"spec.externAddr"})," and ",(0,s.jsx)(t.code,{children:"spec.localnets"})," in ",(0,s.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"gateway-resource",children:"Gateway Resource"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Property"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Required"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"apiVersion"}),(0,s.jsx)(t.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"kind"}),(0,s.jsx)(t.td,{children:"Defines the type of resource"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.name"}),(0,s.jsx)(t.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"metadata.ref"}),(0,s.jsx)(t.td,{children:"Reference to this resource"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.sendRegister"}),(0,s.jsxs)(t.td,{children:["Send SIP REGISTER package to gateway host. Defaults to ",(0,s.jsx)(t.code,{children:"false"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.username"}),(0,s.jsx)(t.td,{children:"Gateway username. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.credentials.secret"}),(0,s.jsx)(t.td,{children:"Gateway secret. No required for static IP authentication"}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.host"}),(0,s.jsx)(t.td,{children:"Gateway host"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.transport"}),(0,s.jsx)(t.td,{children:"Transport protocol"}),(0,s.jsx)(t.td,{children:"Yes"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.expires"}),(0,s.jsxs)(t.td,{children:["Requested lifespan of the registration in seconds. Defaults to ",(0,s.jsx)(t.code,{children:"600"})]}),(0,s.jsx)(t.td,{children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"spec.registries.[*]"}),(0,s.jsx)(t.td,{children:"Additional registries for ingress calls"}),(0,s.jsx)(t.td,{children:"No"})]})]})]}),"\n",(0,s.jsxs)(t.h2,{id:"example-of-gateway-in-registration-mode",children:["Example of Gateway in ",(0,s.jsx)(t.code,{children:"Registration Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider, Inc\n ref: GW0001\n spec:\n host: sip.provider.com\n transport: tcp\n credentials:\n username: 'user'\n secret: changeit\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"example-if-gateway-using-static-mode",children:["Example if Gateway using ",(0,s.jsx)(t.code,{children:"Static Mode"})]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider 2, Inc\n ref: GW0002\n spec:\n host: sip2.provider.com\n port: 5080\n transport: tcp\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>a});var s=n(6540);const r={},i=s.createContext(r);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a5aafb8.0d0a405f.js b/assets/js/8a5aafb8.0d0a405f.js new file mode 100644 index 000000000..47486f6c9 --- /dev/null +++ b/assets/js/8a5aafb8.0d0a405f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6531],{8039:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});var o=t(4848),i=t(8453);const l={},s="Extending the Command-Line Tool",r={id:"development/extending-the-ctl",title:"Extending the Command-Line Tool",description:"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.",source:"@site/versioned_docs/version-2.0.0/development/extending-the-ctl.md",sourceDirName:"development",slug:"/development/extending-the-ctl",permalink:"/docs/2.0.0/development/extending-the-ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/extending-the-ctl.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"},next:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"}},a={},c=[{value:"Installing the Command-Line Tool",id:"installing-the-command-line-tool",level:2},{value:"Using the Command-Line Tool",id:"using-the-command-line-tool",level:2},{value:"Creating a plugin",id:"creating-a-plugin",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"extending-the-command-line-tool",children:"Extending the Command-Line Tool"}),"\n",(0,o.jsxs)(n.p,{children:["Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with ",(0,o.jsx)(n.a,{href:"https://oclif.io/",children:"Oclif"}),", a framework for creating command-line tools in Node.js."]}),"\n",(0,o.jsx)(n.p,{children:"You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins."}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-command-line-tool",children:"Installing the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL comes as an npm package. To install it, you run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.h2,{id:"using-the-command-line-tool",children:"Using the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands."}),"\n",(0,o.jsxs)(n.p,{children:["Most commands adopt the ",(0,o.jsx)(n.code,{children:"{substantive} {verb}"})," pattern. For instance, ",(0,o.jsx)(n.code,{children:"rctl agents get"})," retrieves a list of agents."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins."}),"\n",(0,o.jsx)(n.h2,{id:"creating-a-plugin",children:"Creating a plugin"}),"\n",(0,o.jsx)(n.p,{children:"To create a new plugin, you start by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npx oclif generate mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The system will prompt you for some information about your plugin. For this example, let's choose ",(0,o.jsx)(n.code,{children:"mycommand"})," as the name."]}),"\n",(0,o.jsx)(n.p,{children:"In your mycommand directory, you'll find the following structure:"}),"\n",(0,o.jsx)(n.p,{children:"[Directory structure omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["Looking at the ",(0,o.jsx)(n.code,{children:"src/commands/hello/index.ts"})," file, you see the following code:"]}),"\n",(0,o.jsx)(n.p,{children:"[Sample TypeScript code omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["This code defines a simple command that takes two arguments, ",(0,o.jsx)(n.code,{children:"person"})," and ",(0,o.jsx)(n.code,{children:"from,"})," and then prints a greeting to the console."]}),"\n",(0,o.jsx)(n.p,{children:"After you update your plugin, you install and test it by running the following command from within the plugin directory:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins link . # Installing in development mode\n"})}),"\n",(0,o.jsx)(n.p,{children:"For production mode installation of your plugin, you use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install .\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you have published your plugin to ",(0,o.jsx)(n.a,{href:"https://npmjs.com",children:"NPM"}),", you can install it with this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["To see your new command in action, you run the command with the ",(0,o.jsx)(n.code,{children:"--help"})," flag and follow the instructions."]}),"\n",(0,o.jsxs)(n.p,{children:["With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the ",(0,o.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node.js SDK"})," to interact with the server."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var o=t(6540);const i={},l=o.createContext(i);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a9effda.5b2b876e.js b/assets/js/8a9effda.b93ab4e7.js similarity index 98% rename from assets/js/8a9effda.5b2b876e.js rename to assets/js/8a9effda.b93ab4e7.js index 09f91ef24..b76c202ae 100644 --- a/assets/js/8a9effda.5b2b876e.js +++ b/assets/js/8a9effda.b93ab4e7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3741],{8662:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var s=n(4848),i=n(8453);const r={},l="listDomains",o={id:"api/domains/list",title:"listDomains",description:"This method returns a list of Domain resources.",source:"@site/versioned_docs/version-1.x.x/api/domains/list.md",sourceDirName:"api/domains",slug:"/api/domains/list",permalink:"/docs/1.x.x/api/domains/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"},next:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"}},d={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listdomains",children:"listDomains"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3741],{9499:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var s=n(4848),i=n(8453);const r={},l="listDomains",o={id:"api/domains/list",title:"listDomains",description:"This method returns a list of Domain resources.",source:"@site/versioned_docs/version-1.x.x/api/domains/list.md",sourceDirName:"api/domains",slug:"/api/domains/list",permalink:"/docs/1.x.x/api/domains/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getDomain",permalink:"/docs/1.x.x/api/domains/get"},next:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"}},d={},a=[];function c(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"listdomains",children:"listDomains"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"filter"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"page"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"itemsPerPage"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,s.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,s.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a list of Domain resources."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ac6f1f4.56eaa81a.js b/assets/js/8ac6f1f4.56eaa81a.js deleted file mode 100644 index 2a09f27be..000000000 --- a/assets/js/8ac6f1f4.56eaa81a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[620],{7001:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const s={},a="Overview",c={id:"connect/nodesdk/overview",title:"Overview",description:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.",source:"@site/docs/connect/nodesdk/overview.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/overview",permalink:"/docs/2.0.0/connect/nodesdk/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"},next:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"}},i={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server."}),"\n",(0,t.jsx)(n.p,{children:"This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server."}),"\n",(0,t.jsx)(n.p,{children:"The following example demonstrates how you can use the Node.js SDK to create a new Domain."}),"\n",(0,t.jsx)(n.p,{children:"To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK."}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s begin by creating a new project:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir my-project \ncd my-project \nnpm init -y\n"})}),"\n",(0,t.jsx)(n.p,{children:'The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings.\nNext, install the SDK width:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --save @routr/sdk\n"})}),"\n",(0,t.jsx)(n.p,{children:"The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:"}),"\n",(0,t.jsx)(n.p,{children:"Filename: index.js"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-javascript",children:'const SDK = require("@routr/sdk");\nconst domains = new SDK.Domains();\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3", \n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: { "key": "value" } \n};\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,t.jsx)(n.p,{children:"In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool."}),"\n",(0,t.jsx)(n.p,{children:"The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)"}),"\n",(0,t.jsx)(n.p,{children:"Now, go ahead and run the code:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"node index.js\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/sdk",children:"https://www.npmjs.com/package/@routr/sdk"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ac6f1f4.f2cbc7ba.js b/assets/js/8ac6f1f4.f2cbc7ba.js new file mode 100644 index 000000000..c1e72bcd6 --- /dev/null +++ b/assets/js/8ac6f1f4.f2cbc7ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[620],{164:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const s={},a="Overview",c={id:"connect/nodesdk/overview",title:"Overview",description:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.",source:"@site/docs/connect/nodesdk/overview.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/overview",permalink:"/docs/2.11.5/connect/nodesdk/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/nodesdk/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CTL",permalink:"/docs/2.11.5/connect/command-line/ctl"},next:{title:"SDK",permalink:"/docs/2.11.5/connect/nodesdk/sdk"}},i={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server."}),"\n",(0,t.jsx)(n.p,{children:"This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server."}),"\n",(0,t.jsx)(n.p,{children:"The following example demonstrates how you can use the Node.js SDK to create a new Domain."}),"\n",(0,t.jsx)(n.p,{children:"To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK."}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s begin by creating a new project:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir my-project \ncd my-project \nnpm init -y\n"})}),"\n",(0,t.jsx)(n.p,{children:'The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings.\nNext, install the SDK width:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --save @routr/sdk\n"})}),"\n",(0,t.jsx)(n.p,{children:"The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:"}),"\n",(0,t.jsx)(n.p,{children:"Filename: index.js"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-javascript",children:'const SDK = require("@routr/sdk");\nconst domains = new SDK.Domains();\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3", \n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: { "key": "value" } \n};\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,t.jsx)(n.p,{children:"In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool."}),"\n",(0,t.jsx)(n.p,{children:"The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)"}),"\n",(0,t.jsx)(n.p,{children:"Now, go ahead and run the code:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"node index.js\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/sdk",children:"https://www.npmjs.com/package/@routr/sdk"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d7e75fb.639e4c36.js b/assets/js/8d7e75fb.639e4c36.js deleted file mode 100644 index 75a24e20f..000000000 --- a/assets/js/8d7e75fb.639e4c36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4719],{6102:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var r=o(4848),i=o(8453);const n={id:"introduction",sidebar_label:"Introduction",hide_title:!0},s=void 0,a={id:"overview/introduction",title:"introduction",description:"Community banner",source:"@site/docs/overview/introduction.md",sourceDirName:"overview",slug:"/overview/introduction",permalink:"/docs/2.0.0/overview/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",sidebar_label:"Introduction",hide_title:!0},sidebar:"tutorialSidebar",next:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"}},c={},d=[{value:"Welcome",id:"welcome",level:2},{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Why Routr?",id:"why-routr",level:2},{value:"Who is Routr for?",id:"who-is-routr-for",level:2},{value:"What is the difference between Routr and other SIP servers?",id:"what-is-the-difference-between-routr-and-other-sip-servers",level:2}];function u(e){const t={h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("br",{}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Community banner",src:o(496).A+"",width:"1600",height:"400"})}),"\n",(0,r.jsx)(t.h2,{id:"welcome",children:"Welcome"}),"\n",(0,r.jsx)(t.p,{children:"On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,r.jsx)(t.h2,{id:"why-routr",children:"Why Routr?"}),"\n",(0,r.jsx)(t.p,{children:"At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr."}),"\n",(0,r.jsx)(t.p,{children:"We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow."}),"\n",(0,r.jsx)(t.h2,{id:"who-is-routr-for",children:"Who is Routr for?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-the-difference-between-routr-and-other-sip-servers",children:"What is the difference between Routr and other SIP servers?"}),"\n",(0,r.jsx)(t.p,{children:"Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze."}),"\n",(0,r.jsx)(t.p,{children:"We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},496:(e,t,o)=>{o.d(t,{A:()=>r});const r=o.p+"assets/images/community-8d918291304e0da9dc2ce1fa68832947.png"},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var r=o(6540);const i={},n=r.createContext(i);function s(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d7e75fb.cc8ad6d8.js b/assets/js/8d7e75fb.cc8ad6d8.js new file mode 100644 index 000000000..a4cda70c6 --- /dev/null +++ b/assets/js/8d7e75fb.cc8ad6d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4719],{1453:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var r=o(4848),i=o(8453);const n={id:"introduction",sidebar_label:"Introduction",hide_title:!0},s=void 0,a={id:"overview/introduction",title:"introduction",description:"Community banner",source:"@site/docs/overview/introduction.md",sourceDirName:"overview",slug:"/overview/introduction",permalink:"/docs/2.11.5/overview/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",sidebar_label:"Introduction",hide_title:!0},sidebar:"tutorialSidebar",next:{title:"Architecture",permalink:"/docs/2.11.5/overview/architecture"}},c={},d=[{value:"Welcome",id:"welcome",level:2},{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Why Routr?",id:"why-routr",level:2},{value:"Who is Routr for?",id:"who-is-routr-for",level:2},{value:"What is the difference between Routr and other SIP servers?",id:"what-is-the-difference-between-routr-and-other-sip-servers",level:2}];function u(e){const t={h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("br",{}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Community banner",src:o(496).A+"",width:"1600",height:"400"})}),"\n",(0,r.jsx)(t.h2,{id:"welcome",children:"Welcome"}),"\n",(0,r.jsx)(t.p,{children:"On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,r.jsx)(t.h2,{id:"why-routr",children:"Why Routr?"}),"\n",(0,r.jsx)(t.p,{children:"At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr."}),"\n",(0,r.jsx)(t.p,{children:"We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow."}),"\n",(0,r.jsx)(t.h2,{id:"who-is-routr-for",children:"Who is Routr for?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-the-difference-between-routr-and-other-sip-servers",children:"What is the difference between Routr and other SIP servers?"}),"\n",(0,r.jsx)(t.p,{children:"Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze."}),"\n",(0,r.jsx)(t.p,{children:"We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},496:(e,t,o)=>{o.d(t,{A:()=>r});const r=o.p+"assets/images/community-8d918291304e0da9dc2ce1fa68832947.png"},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var r=o(6540);const i={},n=r.createContext(i);function s(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8f5f22a9.b0c4d9ca.js b/assets/js/8f5f22a9.b0c4d9ca.js deleted file mode 100644 index b30a96c75..000000000 --- a/assets/js/8f5f22a9.b0c4d9ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5362],{2556:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"1.x.x","label":"1.x.x","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-1.x.x","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Welcome","href":"/docs/1.x.x/welcome","docId":"welcome","unlisted":false},{"type":"category","label":"Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/1.x.x/introduction/overview","docId":"introduction/overview","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/introduction/installation","docId":"introduction/installation","unlisted":false},{"type":"link","label":"Comparison","href":"/docs/1.x.x/introduction/comparison","docId":"introduction/comparison","unlisted":false},{"type":"link","label":"Community","href":"/docs/1.x.x/introduction/community","docId":"introduction/community","unlisted":false},{"type":"link","label":"Roadmap","href":"/docs/1.x.x/introduction/roadmap","docId":"introduction/roadmap","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/1.x.x/introduction/faq","docId":"introduction/faq","unlisted":false},{"type":"link","label":"Glossary","href":"/docs/1.x.x/introduction/glossary","docId":"introduction/glossary","unlisted":false},{"type":"link","label":"Media","href":"/docs/1.x.x/introduction/media","docId":"introduction/media","unlisted":false},{"type":"link","label":"Routr 1.0RC3 - User Location Lookup Performance Tests","href":"/docs/1.x.x/introduction/performance-tests/user-location","docId":"introduction/performance-tests/user-location","unlisted":false},{"type":"link","label":"Test Plan","href":"/docs/1.x.x/introduction/test-plan","docId":"introduction/test-plan","unlisted":false}]},{"type":"link","label":"Concepts","href":"/docs/1.x.x/concepts","docId":"concepts","unlisted":false},{"type":"category","label":"Administration","items":[{"type":"link","label":"Cheatsheet","href":"/docs/1.x.x/administration/cli/cheatsheet","docId":"administration/cli/cheatsheet","unlisted":false},{"type":"link","label":"Installation","href":"/docs/1.x.x/administration/cli/installation","docId":"administration/cli/installation","unlisted":false},{"type":"link","label":"Remote Access","href":"/docs/1.x.x/administration/cli/remote-access","docId":"administration/cli/remote-access","unlisted":false},{"type":"link","label":"WebUI","href":"/docs/1.x.x/administration/webconsole","docId":"administration/webconsole","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Configuration","items":[{"type":"link","label":"Agents","href":"/docs/1.x.x/configuration/agents","docId":"configuration/agents","unlisted":false},{"type":"link","label":"Domains","href":"/docs/1.x.x/configuration/domains","docId":"configuration/domains","unlisted":false},{"type":"link","label":"Gateways","href":"/docs/1.x.x/configuration/gateways","docId":"configuration/gateways","unlisted":false},{"type":"link","label":"General","href":"/docs/1.x.x/configuration/general","docId":"configuration/general","unlisted":false},{"type":"link","label":"Numbers","href":"/docs/1.x.x/configuration/numbers","docId":"configuration/numbers","unlisted":false},{"type":"link","label":"Peers","href":"/docs/1.x.x/configuration/peers","docId":"configuration/peers","unlisted":false},{"type":"link","label":"Users","href":"/docs/1.x.x/configuration/users","docId":"configuration/users","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Guides","items":[{"type":"link","label":"Basic Setup","href":"/docs/1.x.x/guides/basic-setup","docId":"guides/basic-setup","unlisted":false},{"type":"link","label":"Routr as Asterisk frontend","href":"/docs/1.x.x/guides/routr-as-asterisk-frontend","docId":"guides/routr-as-asterisk-frontend","unlisted":false},{"type":"link","label":"Running on Kubernetes","href":"/docs/1.x.x/guides/running-on-kubernetes","docId":"guides/running-on-kubernetes","unlisted":false},{"type":"link","label":"Running with Docker","href":"/docs/1.x.x/guides/running-with-docker-or-compose","docId":"guides/running-with-docker-or-compose","unlisted":false},{"type":"link","label":"Securing the signaling path","href":"/docs/1.x.x/guides/securing-the-signaling-path","docId":"guides/securing-the-signaling-path","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"API Docs","items":[{"type":"link","label":"overview","href":"/docs/1.x.x/api/overview","docId":"api/overview","unlisted":false},{"type":"link","label":"createAgent","href":"/docs/1.x.x/api/agents/create","docId":"api/agents/create","unlisted":false},{"type":"link","label":"deleteAgent","href":"/docs/1.x.x/api/agents/delete","docId":"api/agents/delete","unlisted":false},{"type":"link","label":"getAgent","href":"/docs/1.x.x/api/agents/get","docId":"api/agents/get","unlisted":false},{"type":"link","label":"listAgents","href":"/docs/1.x.x/api/agents/list","docId":"api/agents/list","unlisted":false},{"type":"link","label":"updateAgent","href":"/docs/1.x.x/api/agents/update","docId":"api/agents/update","unlisted":false},{"type":"link","label":"getConfiguration","href":"/docs/1.x.x/api/config/get","docId":"api/config/get","unlisted":false},{"type":"link","label":"updateConfiguration","href":"/docs/1.x.x/api/config/update","docId":"api/config/update","unlisted":false},{"type":"link","label":"createDomain","href":"/docs/1.x.x/api/domains/create","docId":"api/domains/create","unlisted":false},{"type":"link","label":"deleteDomain","href":"/docs/1.x.x/api/domains/delete","docId":"api/domains/delete","unlisted":false},{"type":"link","label":"getDomain","href":"/docs/1.x.x/api/domains/get","docId":"api/domains/get","unlisted":false},{"type":"link","label":"listDomains","href":"/docs/1.x.x/api/domains/list","docId":"api/domains/list","unlisted":false},{"type":"link","label":"updateDomain","href":"/docs/1.x.x/api/domains/update","docId":"api/domains/update","unlisted":false},{"type":"link","label":"createGateway","href":"/docs/1.x.x/api/gateways/create","docId":"api/gateways/create","unlisted":false},{"type":"link","label":"deleteGateway","href":"/docs/1.x.x/api/gateways/delete","docId":"api/gateways/delete","unlisted":false},{"type":"link","label":"getGateway","href":"/docs/1.x.x/api/gateways/get","docId":"api/gateways/get","unlisted":false},{"type":"link","label":"listGateways","href":"/docs/1.x.x/api/gateways/list","docId":"api/gateways/list","unlisted":false},{"type":"link","label":"updateGateways","href":"/docs/1.x.x/api/gateways/update","docId":"api/gateways/update","unlisted":false},{"type":"link","label":"addEndpoint","href":"/docs/1.x.x/api/location/create","docId":"api/location/create","unlisted":false},{"type":"link","label":"evictEndpoint","href":"/docs/1.x.x/api/location/delete","docId":"api/location/delete","unlisted":false},{"type":"link","label":"listEndpoints","href":"/docs/1.x.x/api/location/list","docId":"api/location/list","unlisted":false},{"type":"link","label":"createNumber","href":"/docs/1.x.x/api/numbers/create","docId":"api/numbers/create","unlisted":false},{"type":"link","label":"deleteNumber","href":"/docs/1.x.x/api/numbers/delete","docId":"api/numbers/delete","unlisted":false},{"type":"link","label":"getNumber","href":"/docs/1.x.x/api/numbers/get","docId":"api/numbers/get","unlisted":false},{"type":"link","label":"listNumbers","href":"/docs/1.x.x/api/numbers/list","docId":"api/numbers/list","unlisted":false},{"type":"link","label":"updateNumber","href":"/docs/1.x.x/api/numbers/update","docId":"api/numbers/update","unlisted":false},{"type":"link","label":"createPeer","href":"/docs/1.x.x/api/peers/create","docId":"api/peers/create","unlisted":false},{"type":"link","label":"deletePeer","href":"/docs/1.x.x/api/peers/delete","docId":"api/peers/delete","unlisted":false},{"type":"link","label":"getPeer","href":"/docs/1.x.x/api/peers/get","docId":"api/peers/get","unlisted":false},{"type":"link","label":"listPeers","href":"/docs/1.x.x/api/peers/list","docId":"api/peers/list","unlisted":false},{"type":"link","label":"updatePeer","href":"/docs/1.x.x/api/peers/update","docId":"api/peers/update","unlisted":false},{"type":"link","label":"registry","href":"/docs/1.x.x/api/registry","docId":"api/registry","unlisted":false},{"type":"link","label":"checkSystemStatus","href":"/docs/1.x.x/api/status/get","docId":"api/status/get","unlisted":false},{"type":"link","label":"restartServer","href":"/docs/1.x.x/api/status/update","docId":"api/status/update","unlisted":false},{"type":"link","label":"getServerInfo","href":"/docs/1.x.x/api/sys/info","docId":"api/sys/info","unlisted":false},{"type":"link","label":"getServerLogs","href":"/docs/1.x.x/api/sys/logs","docId":"api/sys/logs","unlisted":false},{"type":"link","label":"token","href":"/docs/1.x.x/api/token","docId":"api/token","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"administration/cli/cheatsheet":{"id":"administration/cli/cheatsheet","title":"Cheatsheet","description":"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.","sidebar":"tutorialSidebar"},"administration/cli/installation":{"id":"administration/cli/installation","title":"Installation","description":"To get the Routr Command-Line Tool run the following command:","sidebar":"tutorialSidebar"},"administration/cli/remote-access":{"id":"administration/cli/remote-access","title":"Remote Access","description":"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.","sidebar":"tutorialSidebar"},"administration/webconsole":{"id":"administration/webconsole","title":"WebUI","description":"The Web Console \u2014 WC for short \u2014 is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.","sidebar":"tutorialSidebar"},"api/agents/create":{"id":"api/agents/create","title":"createAgent","description":"Creates a new Agent resource. The Domain must exist before creating the Agent.","sidebar":"tutorialSidebar"},"api/agents/delete":{"id":"api/agents/delete","title":"deleteAgent","description":"Removes an Agent resource from a persistent database.","sidebar":"tutorialSidebar"},"api/agents/get":{"id":"api/agents/get","title":"getAgent","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/agents/list":{"id":"api/agents/list","title":"listAgents","description":"This method returns a list of Agent resources.","sidebar":"tutorialSidebar"},"api/agents/update":{"id":"api/agents/update","title":"updateAgent","description":"Updates an existing Agent resource.","sidebar":"tutorialSidebar"},"api/config/get":{"id":"api/config/get","title":"getConfiguration","description":"This method returns the servers\' configuration.","sidebar":"tutorialSidebar"},"api/config/update":{"id":"api/config/update","title":"updateConfiguration","description":"This method updates the servers\' configuration.","sidebar":"tutorialSidebar"},"api/domains/create":{"id":"api/domains/create","title":"createDomain","description":"Creates a new Domain resource.","sidebar":"tutorialSidebar"},"api/domains/delete":{"id":"api/domains/delete","title":"deleteDomain","description":"Removes a Domain resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/domains/get":{"id":"api/domains/get","title":"getDomain","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/domains/list":{"id":"api/domains/list","title":"listDomains","description":"This method returns a list of Domain resources.","sidebar":"tutorialSidebar"},"api/domains/update":{"id":"api/domains/update","title":"updateDomain","description":"Updates an existing Domain resource.","sidebar":"tutorialSidebar"},"api/gateways/create":{"id":"api/gateways/create","title":"createGateway","description":"Creates a new Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/delete":{"id":"api/gateways/delete","title":"deleteGateway","description":"Removes a Gateway resource from a persistent database. Before removing","sidebar":"tutorialSidebar"},"api/gateways/get":{"id":"api/gateways/get","title":"getGateway","description":"This method returns a Gateway resource.","sidebar":"tutorialSidebar"},"api/gateways/list":{"id":"api/gateways/list","title":"listGateways","description":"This method returns a list of Gateways resources.","sidebar":"tutorialSidebar"},"api/gateways/update":{"id":"api/gateways/update","title":"updateGateways","description":"Updates an existing Gateway resource.","sidebar":"tutorialSidebar"},"api/location/create":{"id":"api/location/create","title":"addEndpoint","description":"Adds an entry into the location table","sidebar":"tutorialSidebar"},"api/location/delete":{"id":"api/location/delete","title":"evictEndpoint","description":"Evicts an entry from the location table","sidebar":"tutorialSidebar"},"api/location/list":{"id":"api/location/list","title":"listEndpoints","description":"Gets a list of registered devices.","sidebar":"tutorialSidebar"},"api/numbers/create":{"id":"api/numbers/create","title":"createNumber","description":"Creates a new Number. The Gateway must exist before creating the Number.","sidebar":"tutorialSidebar"},"api/numbers/delete":{"id":"api/numbers/delete","title":"deleteNumber","description":"Removes a Number from a persistent database.","sidebar":"tutorialSidebar"},"api/numbers/get":{"id":"api/numbers/get","title":"getNumber","description":"This method returns an Agent resource.","sidebar":"tutorialSidebar"},"api/numbers/list":{"id":"api/numbers/list","title":"listNumbers","description":"This method returns a list of Numbers.","sidebar":"tutorialSidebar"},"api/numbers/update":{"id":"api/numbers/update","title":"updateNumber","description":"Updates an existing Number.","sidebar":"tutorialSidebar"},"api/overview":{"id":"api/overview","title":"overview","description":"Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.","sidebar":"tutorialSidebar"},"api/peers/create":{"id":"api/peers/create","title":"createPeer","description":"Creates a new Peer resource.","sidebar":"tutorialSidebar"},"api/peers/delete":{"id":"api/peers/delete","title":"deletePeer","description":"Removes a Peer resource from a persistent database.","sidebar":"tutorialSidebar"},"api/peers/get":{"id":"api/peers/get","title":"getPeer","description":"This method returns a Peer resource.","sidebar":"tutorialSidebar"},"api/peers/list":{"id":"api/peers/list","title":"listPeers","description":"This method returns a list of Peer resources.","sidebar":"tutorialSidebar"},"api/peers/update":{"id":"api/peers/update","title":"updatePeer","description":"Updates an existing Peer resource.","sidebar":"tutorialSidebar"},"api/registry":{"id":"api/registry","title":"registry","description":"This method gets a list of available(online) gateways.","sidebar":"tutorialSidebar"},"api/status/get":{"id":"api/status/get","title":"checkSystemStatus","description":"Pings an instance of Routr engine.","sidebar":"tutorialSidebar"},"api/status/update":{"id":"api/status/update","title":"restartServer","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/info":{"id":"api/sys/info","title":"getServerInfo","description":"This method returns information about the server.","sidebar":"tutorialSidebar"},"api/sys/logs":{"id":"api/sys/logs","title":"getServerLogs","description":"This method returns logs from the server","sidebar":"tutorialSidebar"},"api/token":{"id":"api/token","title":"token","description":"This method gets a token for subsequent API calls.","sidebar":"tutorialSidebar"},"concepts":{"id":"concepts","title":"Concepts","description":"The following are some key concepts, including some of the essential routing strategies implemented in Routr.","sidebar":"tutorialSidebar"},"configuration/agents":{"id":"configuration/agents","title":"Agents","description":"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.","sidebar":"tutorialSidebar"},"configuration/domains":{"id":"configuration/domains","title":"Domains","description":"Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and","sidebar":"tutorialSidebar"},"configuration/gateways":{"id":"configuration/gateways","title":"Gateways","description":"Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.","sidebar":"tutorialSidebar"},"configuration/general":{"id":"configuration/general","title":"General","description":"The general configuration affects your entire Routr instance. The general configuration","sidebar":"tutorialSidebar"},"configuration/numbers":{"id":"configuration/numbers","title":"Numbers","description":"Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.","sidebar":"tutorialSidebar"},"configuration/peers":{"id":"configuration/peers","title":"Peers","description":"Like Agents, Peers represent SIP endpoints such as Media Servers.","sidebar":"tutorialSidebar"},"configuration/users":{"id":"configuration/users","title":"Users","description":"Users exist in Routr to perform administrative actions on a Routr instance.","sidebar":"tutorialSidebar"},"guides/basic-setup":{"id":"guides/basic-setup","title":"Basic Setup","description":"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.","sidebar":"tutorialSidebar"},"guides/routr-as-asterisk-frontend":{"id":"guides/routr-as-asterisk-frontend","title":"Routr as Asterisk frontend","description":"This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:","sidebar":"tutorialSidebar"},"guides/running-on-kubernetes":{"id":"guides/running-on-kubernetes","title":"Running on Kubernetes","description":"This document is a short guide about running the dockerized version of Routr Server on Kubernetes.","sidebar":"tutorialSidebar"},"guides/running-with-docker-or-compose":{"id":"guides/running-with-docker-or-compose","title":"Running with Docker","description":"Please refer to Docker Hub for a detail guide on how to use Routr\'s docker image.","sidebar":"tutorialSidebar"},"guides/securing-the-signaling-path":{"id":"guides/securing-the-signaling-path","title":"Securing the signaling path","description":"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.","sidebar":"tutorialSidebar"},"introduction/community":{"id":"introduction/community","title":"Community","description":"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:","sidebar":"tutorialSidebar"},"introduction/comparison":{"id":"introduction/comparison","title":"Comparison","description":"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.","sidebar":"tutorialSidebar"},"introduction/faq":{"id":"introduction/faq","title":"FAQ","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/glossary":{"id":"introduction/glossary","title":"Glossary","description":"This following table features some essential concepts, including the different routing types implemented by the server.","sidebar":"tutorialSidebar"},"introduction/installation":{"id":"introduction/installation","title":"Installation","description":"Instant Server Installation with Snaps","sidebar":"tutorialSidebar"},"introduction/media":{"id":"introduction/media","title":"Media","description":"There is a subreddit collecting all Routr-related resources on the internet.","sidebar":"tutorialSidebar"},"introduction/overview":{"id":"introduction/overview","title":"Overview","description":"What is Routr?","sidebar":"tutorialSidebar"},"introduction/performance-tests/user-location":{"id":"introduction/performance-tests/user-location","title":"Routr 1.0RC3 - User Location Lookup Performance Tests","description":"Author:","sidebar":"tutorialSidebar"},"introduction/roadmap":{"id":"introduction/roadmap","title":"Roadmap","description":"The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.","sidebar":"tutorialSidebar"},"introduction/test-plan":{"id":"introduction/test-plan","title":"Test Plan","description":"DUT and Endpoints Configuration","sidebar":"tutorialSidebar"},"welcome":{"id":"welcome","title":"Welcome","description":"Use the left-hand to navigate to find topics of interest.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/918bfdcb.982771c7.js b/assets/js/918bfdcb.2efdd5be.js similarity index 98% rename from assets/js/918bfdcb.982771c7.js rename to assets/js/918bfdcb.2efdd5be.js index 36ae2c438..98c7ea891 100644 --- a/assets/js/918bfdcb.982771c7.js +++ b/assets/js/918bfdcb.2efdd5be.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1870],{1264:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var i=t(4848),r=t(8453);const s={},o="Glossary",a={id:"introduction/glossary",title:"Glossary",description:"This following table features some essential concepts, including the different routing types implemented by the server.",source:"@site/versioned_docs/version-1.x.x/introduction/glossary.md",sourceDirName:"introduction",slug:"/introduction/glossary",permalink:"/docs/1.x.x/introduction/glossary",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/glossary.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"},next:{title:"Media",permalink:"/docs/1.x.x/introduction/media"}},d={},l=[{value:"User",id:"user",level:3},{value:"Agent",id:"agent",level:3},{value:"Domain",id:"domain",level:3},{value:"Peer",id:"peer",level:3},{value:"Gateway",id:"gateway",level:3},{value:"Number",id:"number",level:3},{value:"Intra-Domain Routing (IDR)",id:"intra-domain-routing-idr",level:3},{value:"Domain Ingress Routing (DIR)",id:"domain-ingress-routing-dir",level:3},{value:"Domain Egress Routing (DER)",id:"domain-egress-routing-der",level:3},{value:"Peer Egress Routing (PER)",id:"peer-egress-routing-per",level:3}];function u(e){const n={em:"em",h1:"h1",h3:"h3",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"glossary",children:"Glossary"}),"\n",(0,i.jsx)(n.p,{children:"This following table features some essential concepts, including the different routing types implemented by the server."}),"\n",(0,i.jsx)(n.h3,{id:"user",children:"User"}),"\n",(0,i.jsx)(n.p,{children:"Users perform administrative actions on the server."}),"\n",(0,i.jsx)(n.h3,{id:"agent",children:"Agent"}),"\n",(0,i.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones and IP phones, or paging speakers."}),"\n",(0,i.jsx)(n.h3,{id:"domain",children:"Domain"}),"\n",(0,i.jsx)(n.p,{children:"Enables the creation of isolated groups of Agents"}),"\n",(0,i.jsx)(n.h3,{id:"peer",children:"Peer"}),"\n",(0,i.jsx)(n.p,{children:"Similar to Agents but without Domain boundaries"}),"\n",(0,i.jsx)(n.h3,{id:"gateway",children:"Gateway"}),"\n",(0,i.jsx)(n.p,{children:"IP entity that allows call termination"}),"\n",(0,i.jsx)(n.h3,{id:"number",children:"Number"}),"\n",(0,i.jsx)(n.p,{children:"Routes and translate calls between the PSTN and Routr"}),"\n",(0,i.jsx)(n.h3,{id:"intra-domain-routing-idr",children:"Intra-Domain Routing (IDR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy for signaling within the same Domain"}),"\n",(0,i.jsx)(n.h3,{id:"domain-ingress-routing-dir",children:"Domain Ingress Routing (DIR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy used when an Agent or Peer must go outside the Domain using\na Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"domain-egress-routing-der",children:"Domain Egress Routing (DER)"}),"\n",(0,i.jsx)(n.p,{children:"Calling from an Agent to the PSTN thru a Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"peer-egress-routing-per",children:"Peer Egress Routing (PER)"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to ",(0,i.jsx)(n.em,{children:"DER"})," but applies only to Peers."]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(6540);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1870],{5103:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var i=t(4848),r=t(8453);const s={},o="Glossary",a={id:"introduction/glossary",title:"Glossary",description:"This following table features some essential concepts, including the different routing types implemented by the server.",source:"@site/versioned_docs/version-1.x.x/introduction/glossary.md",sourceDirName:"introduction",slug:"/introduction/glossary",permalink:"/docs/1.x.x/introduction/glossary",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/glossary.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/docs/1.x.x/introduction/faq"},next:{title:"Media",permalink:"/docs/1.x.x/introduction/media"}},d={},l=[{value:"User",id:"user",level:3},{value:"Agent",id:"agent",level:3},{value:"Domain",id:"domain",level:3},{value:"Peer",id:"peer",level:3},{value:"Gateway",id:"gateway",level:3},{value:"Number",id:"number",level:3},{value:"Intra-Domain Routing (IDR)",id:"intra-domain-routing-idr",level:3},{value:"Domain Ingress Routing (DIR)",id:"domain-ingress-routing-dir",level:3},{value:"Domain Egress Routing (DER)",id:"domain-egress-routing-der",level:3},{value:"Peer Egress Routing (PER)",id:"peer-egress-routing-per",level:3}];function u(e){const n={em:"em",h1:"h1",h3:"h3",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"glossary",children:"Glossary"}),"\n",(0,i.jsx)(n.p,{children:"This following table features some essential concepts, including the different routing types implemented by the server."}),"\n",(0,i.jsx)(n.h3,{id:"user",children:"User"}),"\n",(0,i.jsx)(n.p,{children:"Users perform administrative actions on the server."}),"\n",(0,i.jsx)(n.h3,{id:"agent",children:"Agent"}),"\n",(0,i.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones and IP phones, or paging speakers."}),"\n",(0,i.jsx)(n.h3,{id:"domain",children:"Domain"}),"\n",(0,i.jsx)(n.p,{children:"Enables the creation of isolated groups of Agents"}),"\n",(0,i.jsx)(n.h3,{id:"peer",children:"Peer"}),"\n",(0,i.jsx)(n.p,{children:"Similar to Agents but without Domain boundaries"}),"\n",(0,i.jsx)(n.h3,{id:"gateway",children:"Gateway"}),"\n",(0,i.jsx)(n.p,{children:"IP entity that allows call termination"}),"\n",(0,i.jsx)(n.h3,{id:"number",children:"Number"}),"\n",(0,i.jsx)(n.p,{children:"Routes and translate calls between the PSTN and Routr"}),"\n",(0,i.jsx)(n.h3,{id:"intra-domain-routing-idr",children:"Intra-Domain Routing (IDR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy for signaling within the same Domain"}),"\n",(0,i.jsx)(n.h3,{id:"domain-ingress-routing-dir",children:"Domain Ingress Routing (DIR)"}),"\n",(0,i.jsx)(n.p,{children:"Routing strategy used when an Agent or Peer must go outside the Domain using\na Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"domain-egress-routing-der",children:"Domain Egress Routing (DER)"}),"\n",(0,i.jsx)(n.p,{children:"Calling from an Agent to the PSTN thru a Gateway"}),"\n",(0,i.jsx)(n.h3,{id:"peer-egress-routing-per",children:"Peer Egress Routing (PER)"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to ",(0,i.jsx)(n.em,{children:"DER"})," but applies only to Peers."]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(6540);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/921a01ce.7f413b4c.js b/assets/js/921a01ce.7f413b4c.js new file mode 100644 index 000000000..15e47096c --- /dev/null +++ b/assets/js/921a01ce.7f413b4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4101],{1599:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=n(4848),s=n(8453);const r={},i="Building a SCAIP Processor",c={id:"development/building-a-scaip-processor",title:"Building a SCAIP Processor",description:"Comin soon.",source:"@site/versioned_docs/version-2.0.0/development/building-a-scaip-processor.md",sourceDirName:"development",slug:"/development/building-a-scaip-processor",permalink:"/docs/2.0.0/development/building-a-scaip-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/building-a-scaip-processor.md",tags:[],version:"2.0.0",frontMatter:{}},d={},a=[];function p(e){const o={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"building-a-scaip-processor",children:"Building a SCAIP Processor"}),"\n",(0,t.jsx)(o.p,{children:"Comin soon."})]})}function u(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>c});var t=n(6540);const s={},r=t.createContext(s);function i(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/92394f36.07670fd3.js b/assets/js/92394f36.07670fd3.js new file mode 100644 index 000000000..ebc424894 --- /dev/null +++ b/assets/js/92394f36.07670fd3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8847],{6783:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/versioned_docs/version-2.0.0/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/rtprelay.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51903 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/92a92b88.2c0f2381.js b/assets/js/92a92b88.2c0f2381.js deleted file mode 100644 index 1e0f03dee..000000000 --- a/assets/js/92a92b88.2c0f2381.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7940],{7149:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=s(4848),t=s(8453);const a={},o="Building a Processor",i={id:"development/building-a-processor",title:"Building a Processor",description:"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.",source:"@site/docs/development/building-a-processor.md",sourceDirName:"development",slug:"/development/building-a-processor",permalink:"/docs/2.0.0/development/building-a-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-processor.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"},next:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"}},l={},c=[{value:"Processor Contract",id:"processor-contract",level:2},{value:"Building a Processor from a Template",id:"building-a-processor-from-a-template",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"building-a-processor",children:"Building a Processor"}),"\n",(0,r.jsxs)(n.p,{children:["Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the ",(0,r.jsx)(n.a,{href:"/docs/2.0.0/overview/concepts#alterations",children:"Alterations API"})," to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network."]}),"\n",(0,r.jsx)(n.p,{children:"Here is a non-exhaustive list of things you can do with a Processor:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Build an instant messaging application"}),"\n",(0,r.jsx)(n.li,{children:"Create a custom logic for a SCAIP system"}),"\n",(0,r.jsx)(n.li,{children:"Build a SIP Recorder when combined with RTPEngine"}),"\n",(0,r.jsx)(n.li,{children:"Doorbell Camera System integration"}),"\n",(0,r.jsx)(n.li,{children:"Custom logic for a SIP IoT system"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"processor-contract",children:"Processor Contract"}),"\n",(0,r.jsxs)(n.p,{children:["A Processor is a gRPC service that implements the ",(0,r.jsx)(n.code,{children:"Processor"})," interface. The interface is defined in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"processor.proto"})," file."]}),"\n",(0,r.jsx)(n.p,{children:"Here is the definition of the Processor interface:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly."}),"\n",(0,r.jsx)(n.p,{children:"You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS."}),"\n",(0,r.jsx)(n.p,{children:"One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript."}),"\n",(0,r.jsx)(n.p,{children:"As an example, here is the JSON representation of a SIP REGISTER message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "ref": "AynhXaFtbdXwHrUEzt_rUQ..",\n "edgePortRef": "edgeport-01",\n "method": "REGISTER",\n "externalAddrs": ["200.22.21.42"],\n "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],\n "listeningPoints": [\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "TCP"\n },\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "UDP"\n }\n ],\n "sender": {\n "host": "127.0.0.1",\n "port": 36214,\n "transport": "TCP"\n },\n "message": {\n "via": [\n {\n "host": "proxy",\n "port": 5060,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n },\n {\n "host": "127.0.0.1",\n "port": 36214,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n }\n ],\n "extensions": [\n {\n "name": "CSeq",\n "value": "14 REGISTER"\n },\n {\n "name": "Allow",\n "value": "INVITE"\n },\n {\n "name": "User-Agent",\n "value": "Z 5.4.12 v2.10.13.2"\n },\n {\n "name": "Allow-Events",\n "value": "presence"\n }\n ],\n "from": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "UDP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "John Doe",\n "wildcard": false\n },\n "tag": "9041462a"\n },\n "to": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "tag": ""\n },\n "contact": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "127.0.0.1",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 36214,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "expires": -1,\n "qValue": -1\n },\n "callId": {\n "callId": "AynhXaFtbdXwHrUEzt_rUQ.."\n },\n "contentLength": {\n "contentLength": 0\n },\n "maxForwards": {\n "maxForwards": 70\n },\n "expires": {\n "expires": 60\n },\n "recordRoute": [\n {\n "parameters": {\n "a": "1",\n "b": "2"\n },\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "route": [\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.127",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n },\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.128",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "authorization": {\n "realm": "sip.local",\n "scheme": "Digest",\n "cNonce": "acbcc60094edde23f49b01e18bafd34e",\n "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",\n "algorithm": "MD5",\n "qop": "",\n "opaque": "",\n "response": "227fe247ff0b9fa4fcf2706b587bf995",\n "username": "1001",\n "uri": "sip:sip.local;transport=TCP",\n "nonceCount": 13\n },\n "requestUri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "messageType": "REQUEST"\n }\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"building-a-processor-from-a-template",children:"Building a Processor from a Template"}),"\n",(0,r.jsxs)(n.p,{children:["To make it easier to build processors, we provide a template you can use to get started. The template is available in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/nodejs-processor",children:"routr-processor-template."})]}),"\n",(0,r.jsxs)(n.p,{children:["To use the template, you must have ",(0,r.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"})," installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"npx degit fonoster/nodejs-processor my-processor\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The previous command will create a new folder called ",(0,r.jsx)(n.code,{children:"my-processor"})," with the following structure:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:".\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 commitlint.config.js\n\u251c\u2500\u2500 compose.yaml\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 src\n\u2502 \u251c\u2500\u2500 envs.ts\n\u2502 \u251c\u2500\u2500 handlers.ts\n\u2502 \u2514\u2500\u2500 index.ts\n\u251c\u2500\u2500 test\n\u2502 \u2514\u2500\u2500 unit.test.ts\n\u2514\u2500\u2500 tsconfig.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The most important file is the ",(0,r.jsx)(n.code,{children:"handlers.ts"})," file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor."]}),"\n",(0,r.jsx)(n.p,{children:"From there, you can install the dependencies and start the processor:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd my-processor\nnpm install\nnpm start\n"})}),"\n",(0,r.jsx)(n.p,{children:"You may now start sending SIP messages to your processor from EdgePort or Dispatcher."})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/92a92b88.d146bab7.js b/assets/js/92a92b88.d146bab7.js new file mode 100644 index 000000000..a079ada84 --- /dev/null +++ b/assets/js/92a92b88.d146bab7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7940],{8304:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=s(4848),t=s(8453);const a={},o="Building a Processor",i={id:"development/building-a-processor",title:"Building a Processor",description:"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.",source:"@site/docs/development/building-a-processor.md",sourceDirName:"development",slug:"/development/building-a-processor",permalink:"/docs/2.11.5/development/building-a-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-processor.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Alteration Methods",permalink:"/docs/2.11.5/development/alterations/methods"},next:{title:"Building a Middleware",permalink:"/docs/2.11.5/development/building-a-middleware"}},l={},c=[{value:"Processor Contract",id:"processor-contract",level:2},{value:"Building a Processor from a Template",id:"building-a-processor-from-a-template",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"building-a-processor",children:"Building a Processor"}),"\n",(0,r.jsxs)(n.p,{children:["Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the ",(0,r.jsx)(n.a,{href:"/docs/2.11.5/overview/concepts#alterations",children:"Alterations API"})," to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network."]}),"\n",(0,r.jsx)(n.p,{children:"Here is a non-exhaustive list of things you can do with a Processor:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Build an instant messaging application"}),"\n",(0,r.jsx)(n.li,{children:"Create a custom logic for a SCAIP system"}),"\n",(0,r.jsx)(n.li,{children:"Build a SIP Recorder when combined with RTPEngine"}),"\n",(0,r.jsx)(n.li,{children:"Doorbell Camera System integration"}),"\n",(0,r.jsx)(n.li,{children:"Custom logic for a SIP IoT system"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"processor-contract",children:"Processor Contract"}),"\n",(0,r.jsxs)(n.p,{children:["A Processor is a gRPC service that implements the ",(0,r.jsx)(n.code,{children:"Processor"})," interface. The interface is defined in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"processor.proto"})," file."]}),"\n",(0,r.jsx)(n.p,{children:"Here is the definition of the Processor interface:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly."}),"\n",(0,r.jsx)(n.p,{children:"You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS."}),"\n",(0,r.jsx)(n.p,{children:"One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript."}),"\n",(0,r.jsx)(n.p,{children:"As an example, here is the JSON representation of a SIP REGISTER message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "ref": "AynhXaFtbdXwHrUEzt_rUQ..",\n "edgePortRef": "edgeport-01",\n "method": "REGISTER",\n "externalAddrs": ["200.22.21.42"],\n "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],\n "listeningPoints": [\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "TCP"\n },\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "UDP"\n }\n ],\n "sender": {\n "host": "127.0.0.1",\n "port": 36214,\n "transport": "TCP"\n },\n "message": {\n "via": [\n {\n "host": "proxy",\n "port": 5060,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n },\n {\n "host": "127.0.0.1",\n "port": 36214,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n }\n ],\n "extensions": [\n {\n "name": "CSeq",\n "value": "14 REGISTER"\n },\n {\n "name": "Allow",\n "value": "INVITE"\n },\n {\n "name": "User-Agent",\n "value": "Z 5.4.12 v2.10.13.2"\n },\n {\n "name": "Allow-Events",\n "value": "presence"\n }\n ],\n "from": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "UDP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "John Doe",\n "wildcard": false\n },\n "tag": "9041462a"\n },\n "to": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "tag": ""\n },\n "contact": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "127.0.0.1",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 36214,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "expires": -1,\n "qValue": -1\n },\n "callId": {\n "callId": "AynhXaFtbdXwHrUEzt_rUQ.."\n },\n "contentLength": {\n "contentLength": 0\n },\n "maxForwards": {\n "maxForwards": 70\n },\n "expires": {\n "expires": 60\n },\n "recordRoute": [\n {\n "parameters": {\n "a": "1",\n "b": "2"\n },\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "route": [\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.127",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n },\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.128",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "authorization": {\n "realm": "sip.local",\n "scheme": "Digest",\n "cNonce": "acbcc60094edde23f49b01e18bafd34e",\n "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",\n "algorithm": "MD5",\n "qop": "",\n "opaque": "",\n "response": "227fe247ff0b9fa4fcf2706b587bf995",\n "username": "1001",\n "uri": "sip:sip.local;transport=TCP",\n "nonceCount": 13\n },\n "requestUri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "messageType": "REQUEST"\n }\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"building-a-processor-from-a-template",children:"Building a Processor from a Template"}),"\n",(0,r.jsxs)(n.p,{children:["To make it easier to build processors, we provide a template you can use to get started. The template is available in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/nodejs-processor",children:"routr-processor-template."})]}),"\n",(0,r.jsxs)(n.p,{children:["To use the template, you must have ",(0,r.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"})," installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"npx degit fonoster/nodejs-processor my-processor\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The previous command will create a new folder called ",(0,r.jsx)(n.code,{children:"my-processor"})," with the following structure:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:".\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 commitlint.config.js\n\u251c\u2500\u2500 compose.yaml\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 src\n\u2502 \u251c\u2500\u2500 envs.ts\n\u2502 \u251c\u2500\u2500 handlers.ts\n\u2502 \u2514\u2500\u2500 index.ts\n\u251c\u2500\u2500 test\n\u2502 \u2514\u2500\u2500 unit.test.ts\n\u2514\u2500\u2500 tsconfig.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The most important file is the ",(0,r.jsx)(n.code,{children:"handlers.ts"})," file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor."]}),"\n",(0,r.jsx)(n.p,{children:"From there, you can install the dependencies and start the processor:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd my-processor\nnpm install\nnpm start\n"})}),"\n",(0,r.jsx)(n.p,{children:"You may now start sending SIP messages to your processor from EdgePort or Dispatcher."})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.9b7d34d8.js b/assets/js/935f2afb.9b7d34d8.js deleted file mode 100644 index 11f2f56eb..000000000 --- a/assets/js/935f2afb.9b7d34d8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"2.0.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Overview","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/overview/introduction","docId":"overview/introduction","unlisted":false},{"type":"link","label":"Architecture","href":"/docs/2.0.0/overview/architecture","docId":"overview/architecture","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/overview/concepts","docId":"overview/concepts","unlisted":false},{"type":"link","label":"Deploy with Docker","href":"/docs/2.0.0/overview/deploy-with-docker","docId":"overview/deploy-with-docker","unlisted":false}]},{"type":"category","label":"Development","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/development/introduction","docId":"development/introduction","unlisted":false},{"type":"link","label":"Quick Start","href":"/docs/2.0.0/development/quick-start","docId":"development/quick-start","unlisted":false},{"type":"link","label":"Development with Gitpod","href":"/docs/2.0.0/development/development-mode-with-gitpod","docId":"development/development-mode-with-gitpod","unlisted":false},{"type":"category","label":"Components","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/components/overview","docId":"development/components/overview","unlisted":false},{"type":"link","label":"EdgePort","href":"/docs/2.0.0/development/components/edgeport","docId":"development/components/edgeport","unlisted":false},{"type":"link","label":"Message Dispatcher","href":"/docs/2.0.0/development/components/dispatcher","docId":"development/components/dispatcher","unlisted":false},{"type":"link","label":"Location Service","href":"/docs/2.0.0/development/components/location","docId":"development/components/location","unlisted":false},{"type":"link","label":"Registry Service","href":"/docs/2.0.0/development/components/registry","docId":"development/components/registry","unlisted":false},{"type":"link","label":"Requester","href":"/docs/2.0.0/development/components/requester","docId":"development/components/requester","unlisted":false},{"type":"link","label":"RTPRelay","href":"/docs/2.0.0/development/components/rtprelay","docId":"development/components/rtprelay","unlisted":false},{"type":"link","label":"APIServer","href":"/docs/2.0.0/development/components/apiserver","docId":"development/components/apiserver","unlisted":false},{"type":"link","label":"SimpleAuth Service","href":"/docs/2.0.0/development/components/simpleauth","docId":"development/components/simpleauth","unlisted":false}]},{"type":"category","label":"Alterations API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/development/alterations/overview","docId":"development/alterations/overview","unlisted":false},{"type":"link","label":"Alteration Methods","href":"/docs/2.0.0/development/alterations/methods","docId":"development/alterations/methods","unlisted":false}]},{"type":"link","label":"Building a Processor","href":"/docs/2.0.0/development/building-a-processor","docId":"development/building-a-processor","unlisted":false},{"type":"link","label":"Building a Middleware","href":"/docs/2.0.0/development/building-a-middleware","docId":"development/building-a-middleware","unlisted":false},{"type":"link","label":"Custom data with the APIServer","href":"/docs/2.0.0/development/custom-data-with-the-apiserver","docId":"development/custom-data-with-the-apiserver","unlisted":false},{"type":"link","label":"Extending the Command-Line Tool","href":"/docs/2.0.0/development/extending-the-ctl","docId":"development/extending-the-ctl","unlisted":false}]},{"type":"category","label":"Connect Mode","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/docs/2.0.0/connect/introduction","docId":"connect/introduction","unlisted":false},{"type":"link","label":"Concepts","href":"/docs/2.0.0/connect/concepts","docId":"connect/concepts","unlisted":false},{"type":"category","label":"Quick Start","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker installation","href":"/docs/2.0.0/connect/quick-start/docker","docId":"connect/quick-start/docker","unlisted":false},{"type":"link","label":"Installing in Kubernetes","href":"/docs/2.0.0/connect/quick-start/kubernetes","docId":"connect/quick-start/kubernetes","unlisted":false}]},{"type":"category","label":"Command-Line Tool","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/command-line/overview","docId":"connect/command-line/overview","unlisted":false},{"type":"link","label":"CTL","href":"/docs/2.0.0/connect/command-line/ctl","docId":"connect/command-line/ctl","unlisted":false}]},{"type":"category","label":"Node.js SDK","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/2.0.0/connect/nodesdk/overview","docId":"connect/nodesdk/overview","unlisted":false},{"type":"link","label":"SDK","href":"/docs/2.0.0/connect/nodesdk/sdk","docId":"connect/nodesdk/sdk","unlisted":false}]},{"type":"link","label":"Home or Office Setup","href":"/docs/2.0.0/connect/home-or-office-setup","docId":"connect/home-or-office-setup","unlisted":false},{"type":"link","label":"WebRTC Support","href":"/docs/2.0.0/connect/webrtc-support","docId":"connect/webrtc-support","unlisted":false},{"type":"link","label":"Securing the Server","href":"/docs/2.0.0/connect/securing-the-server","docId":"connect/securing-the-server","unlisted":false},{"type":"link","label":"Sending Call Events to NATS","href":"/docs/2.0.0/connect/sending-call-events-to-nats","docId":"connect/sending-call-events-to-nats","unlisted":false}]},{"type":"link","label":"Community","href":"/docs/2.0.0/community","docId":"community","unlisted":false},{"type":"link","label":"Contributing Guide","href":"/docs/2.0.0/contributing","docId":"contributing","unlisted":false},{"type":"link","label":"FAQs","href":"/docs/2.0.0/faqs","docId":"faqs","unlisted":false},{"type":"link","label":"Changelog","href":"/docs/2.0.0/changelog","docId":"changelog","unlisted":false}]},"docs":{"changelog":{"id":"changelog","title":"Changelog","description":"Coming soon.","sidebar":"tutorialSidebar"},"community":{"id":"community","title":"Community","description":"We are developing Routr in the open. These are the channels we use for communication and contribution:","sidebar":"tutorialSidebar"},"connect/command-line/ctl":{"id":"connect/command-line/ctl","title":"CTL","description":"Command-Line for Routr server.","sidebar":"tutorialSidebar"},"connect/command-line/overview":{"id":"connect/command-line/overview","title":"Overview","description":"The command-line tool contains all commands you will need to manage your Routr Connect server.","sidebar":"tutorialSidebar"},"connect/concepts":{"id":"connect/concepts","title":"Concepts","description":"The Connect Mode is Routr\'s implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.","sidebar":"tutorialSidebar"},"connect/home-or-office-setup":{"id":"connect/home-or-office-setup","title":"Home or Office Setup","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/introduction":{"id":"connect/introduction","title":"Introduction","description":"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.","sidebar":"tutorialSidebar"},"connect/nodesdk/overview":{"id":"connect/nodesdk/overview","title":"Overview","description":"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.","sidebar":"tutorialSidebar"},"connect/nodesdk/sdk":{"id":"connect/nodesdk/sdk","title":"SDK","description":"* Installation","sidebar":"tutorialSidebar"},"connect/quick-start/docker":{"id":"connect/quick-start/docker","title":"Docker installation","description":"First, create a directory named \\"routr\\". Navigate into the new folder, and then copy the content below:","sidebar":"tutorialSidebar"},"connect/quick-start/kubernetes":{"id":"connect/quick-start/kubernetes","title":"Installing in Kubernetes","description":"Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.","sidebar":"tutorialSidebar"},"connect/securing-the-server":{"id":"connect/securing-the-server","title":"Securing the Server","description":"Coming soon.","sidebar":"tutorialSidebar"},"connect/sending-call-events-to-nats":{"id":"connect/sending-call-events-to-nats","title":"Sending Call Events to NATS","description":"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:","sidebar":"tutorialSidebar"},"connect/webrtc-support":{"id":"connect/webrtc-support","title":"WebRTC Support","description":"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.","sidebar":"tutorialSidebar"},"contributing":{"id":"contributing","title":"Contributing Guide","description":"* New Contributor Guide","sidebar":"tutorialSidebar"},"development/alterations/methods":{"id":"development/alterations/methods","title":"Alteration Methods","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/alterations/overview":{"id":"development/alterations/overview","title":"Overview","description":"Coming soon.","sidebar":"tutorialSidebar"},"development/building-a-chat-application":{"id":"development/building-a-chat-application","title":"Building a Chat Application","description":"Comin soon."},"development/building-a-middleware":{"id":"development/building-a-middleware","title":"Building a Middleware","description":"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.","sidebar":"tutorialSidebar"},"development/building-a-processor":{"id":"development/building-a-processor","title":"Building a Processor","description":"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.","sidebar":"tutorialSidebar"},"development/building-a-scaip-processor":{"id":"development/building-a-scaip-processor","title":"Building a SCAIP Processor","description":"Comin soon."},"development/components/apiserver":{"id":"development/components/apiserver","title":"APIServer","description":"The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.","sidebar":"tutorialSidebar"},"development/components/dispatcher":{"id":"development/components/dispatcher","title":"Message Dispatcher","description":"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.","sidebar":"tutorialSidebar"},"development/components/edgeport":{"id":"development/components/edgeport","title":"EdgePort","description":"The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.","sidebar":"tutorialSidebar"},"development/components/location":{"id":"development/components/location","title":"Location Service","description":"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.","sidebar":"tutorialSidebar"},"development/components/overview":{"id":"development/components/overview","title":"Overview","description":"This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.","sidebar":"tutorialSidebar"},"development/components/registry":{"id":"development/components/registry","title":"Registry Service","description":"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.","sidebar":"tutorialSidebar"},"development/components/requester":{"id":"development/components/requester","title":"Requester","description":"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.","sidebar":"tutorialSidebar"},"development/components/rtprelay":{"id":"development/components/rtprelay","title":"RTPRelay","description":"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.","sidebar":"tutorialSidebar"},"development/components/simpleauth":{"id":"development/components/simpleauth","title":"SimpleAuth Service","description":"The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.","sidebar":"tutorialSidebar"},"development/custom-data-with-the-apiserver":{"id":"development/custom-data-with-the-apiserver","title":"Custom data with the APIServer","description":"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.","sidebar":"tutorialSidebar"},"development/development-mode-with-gitpod":{"id":"development/development-mode-with-gitpod","title":"Development with Gitpod","description":"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.","sidebar":"tutorialSidebar"},"development/extending-the-ctl":{"id":"development/extending-the-ctl","title":"Extending the Command-Line Tool","description":"Routr\'s command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.","sidebar":"tutorialSidebar"},"development/introduction":{"id":"development/introduction","title":"Introduction","description":"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you\'ll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.","sidebar":"tutorialSidebar"},"development/metrics-events-logs-and-traces":{"id":"development/metrics-events-logs-and-traces","title":"Everything about MELT","description":"Comin soon."},"development/orchestration-with-docker":{"id":"development/orchestration-with-docker","title":"Orchestration with Docker","description":"Coming soon."},"development/orchestration-with-kubernetes":{"id":"development/orchestration-with-kubernetes","title":"Orchestration with Kubernetes","description":"Coming soon."},"development/quick-start":{"id":"development/quick-start","title":"Quick Start","description":"Before starting the development, you need to install the following tools:","sidebar":"tutorialSidebar"},"development/testing-with-seet":{"id":"development/testing-with-seet","title":"Testing with SEET","description":"Coming soon."},"faqs":{"id":"faqs","title":"FAQs","description":"What is Routr?","sidebar":"tutorialSidebar"},"overview/architecture":{"id":"overview/architecture","title":"Architecture","description":"Routr\'s architecture diagram","sidebar":"tutorialSidebar"},"overview/concepts":{"id":"overview/concepts","title":"Concepts","description":"Routr\'s approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.","sidebar":"tutorialSidebar"},"overview/deploy-with-docker":{"id":"overview/deploy-with-docker","title":"Deploy with Docker","description":"Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.","sidebar":"tutorialSidebar"},"overview/introduction":{"id":"overview/introduction","title":"introduction","description":"Community banner","sidebar":"tutorialSidebar"},"tutorials/deploying-to-civo-with-helm":{"id":"tutorials/deploying-to-civo-with-helm","title":"Deploying to Civo with Helm","description":"Coming soon."},"tutorials/ephemeral-agents-in-the-browser":{"id":"tutorials/ephemeral-agents-in-the-browser","title":"Ephemeral Agents in the Browser","description":"Coming soon."},"tutorials/intercom-system-with-routr-and-kubernetes":{"id":"tutorials/intercom-system-with-routr-and-kubernetes","title":"Intercom System with Routr and Kubernetes","description":"Coming soon."},"tutorials/load-balancing-asterisk-with-routr":{"id":"tutorials/load-balancing-asterisk-with-routr","title":"Load-balancing Asterisk with Routr","description":"Coming soon."}}}')}}]); \ No newline at end of file diff --git a/assets/js/943e77c3.c18b42bc.js b/assets/js/943e77c3.8361664d.js similarity index 97% rename from assets/js/943e77c3.c18b42bc.js rename to assets/js/943e77c3.8361664d.js index 7d7fdc5fd..8d0f7ca5a 100644 --- a/assets/js/943e77c3.c18b42bc.js +++ b/assets/js/943e77c3.8361664d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1224],{9334:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const a={},o="createGateway",c={id:"api/gateways/create",title:"createGateway",description:"Creates a new Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/create.md",sourceDirName:"api/gateways",slug:"/api/gateways/create",permalink:"/docs/1.x.x/api/gateways/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"},next:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"}},i={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"creategateway",children:"createGateway"}),"\n",(0,r.jsx)(t.p,{children:"Creates a new Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/gateways"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/gateways\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc."\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "gw5c77t2"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},a=r.createContext(s);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1224],{1585:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const a={},o="createGateway",c={id:"api/gateways/create",title:"createGateway",description:"Creates a new Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/create.md",sourceDirName:"api/gateways",slug:"/api/gateways/create",permalink:"/docs/1.x.x/api/gateways/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateDomain",permalink:"/docs/1.x.x/api/domains/update"},next:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"}},i={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"creategateway",children:"createGateway"}),"\n",(0,r.jsx)(t.p,{children:"Creates a new Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/gateways"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Gateway resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/gateways\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc."\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "gw5c77t2"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},a=r.createContext(s);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9462.7d4144d6.js b/assets/js/9462.4d9f6c47.js similarity index 77% rename from assets/js/9462.7d4144d6.js rename to assets/js/9462.4d9f6c47.js index 63d42f331..57b8330dd 100644 --- a/assets/js/9462.7d4144d6.js +++ b/assets/js/9462.4d9f6c47.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9462],{9462:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];r&&clearTimeout(r),r=setTimeout((function(){return e.apply(void 0,o)}),t)}}function o(e){return e!==Object(e)}function i(e,t){if(e===t)return!0;if(o(e)||o(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var r=0,n=Object.keys(e);r<n.length;r++){var a=n[r];if(!(a in t))return!1;if(!i(e[a],t[a]))return!1}return!0}r.r(t),r.d(t,{DocSearchModal:()=>pn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var s=["items"],f=["items"];function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function p(e){return function(e){if(Array.isArray(e))return v(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function d(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?y(Object(r),!0).forEach((function(t){b(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function b(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==m(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===m(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g(e){return e.map((function(e){var t=e.items,r=d(e,s);return h(h({},r),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||r.objectIDs})}))}function O(e){var t,r,n,o=(t=l((e.version||"").split(".").map(Number),2),r=t[0],n=t[1],r>=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n<e.objectIDs.length;n+=t)r.push(h(h({},e),{},{objectIDs:e.objectIDs.slice(n,n+t)}));return r}(h(h({},n),{},{objectIDs:(null==r?void 0:r.map((function(e){return e.objectID})))||n.objectIDs})).map((function(e){return{items:r,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function I(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?I(Object(r),!0).forEach((function(t){A(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):I(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function A(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==w(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==w(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===w(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k="2.6.0",x="https://cdn.jsdelivr.net/npm/search-insights@".concat(k,"/dist/search-insights.min.js"),C=n((function(e){var t=e.onItemsChange,r=e.items,n=e.insights,o=e.state;t({insights:n,insightsEvents:S({items:r}).map((function(e){return D({eventName:"Items Viewed"},e)})),state:o})}),400);function _(e){var t=function(e){return D({onItemsChange:function(e){var t=e.insights,r=e.insightsEvents;t.viewedObjectIDs.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onSelect:function(e){var t=e.insights,r=e.insightsEvents;t.clickedObjectIDsAfterSearch.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onActive:a},e)}(e),r=t.insightsClient,o=t.onItemsChange,l=t.onSelect,u=t.onActive,s=r;r||function(e){if("undefined"!=typeof window)e({window:window})}((function(e){var t=e.window,r=t.AlgoliaAnalyticsObject||"aa";"string"==typeof r&&(s=t[r]),s||(t.AlgoliaAnalyticsObject=r,t[r]||(t[r]=function(){t[r].queue||(t[r].queue=[]);for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];t[r].queue.push(n)}),t[r].version=k,s=t[r],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var r=e.document.createElement("script");r.async=!0,r.src=x,r.onerror=function(){console.error(t)},document.body.appendChild(r)}catch(n){console.error(t)}}(t))}));var f=O(s),m={current:[]},p=n((function(e){var t=e.state;if(t.isOpen){var r=t.collections.reduce((function(e,t){return[].concat(E(e),E(t.items))}),[]).filter(j);i(m.current.map((function(e){return e.objectID})),r.map((function(e){return e.objectID})))||(m.current=r,r.length>0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==N(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===N(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){q(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({},o);o=e(o,{type:n,props:t,payload:i}),r({state:o,prevState:a})},pendingRequests:(n=[],{add:function(e){return n.push(e),e.finally((function(){n=n.filter((function(t){return t!==e}))}))},cancelAll:function(){n.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===n.length}})}}function L(e){return e.reduce((function(e,t){return e.concat(t)}),[])}function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?H(Object(r),!0).forEach((function(t){U(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):H(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function U(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==M(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==M(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===M(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var V=0;function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){J(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function J(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==z(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===z(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function z(e){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},z(e)}function W(e){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(e)}function Q(e){return function(e){if(Array.isArray(e))return Z(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Z(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?G(Object(r),!0).forEach((function(t){Y(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):G(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Y(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==W(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===W(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ee(e,t){var r,n="undefined"!=typeof window?window:{},o=e.plugins||[];return X(X({debug:!1,openOnFocus:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:!1,environment:n,shouldPanelOpen:function(e){return B(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?re(Object(r),!0).forEach((function(t){oe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):re(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function oe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==te(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ce(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ae(Object(r),!0).forEach((function(t){le(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ae(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function le(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ie(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ie(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ie(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ue(e){return function(e){if(Array.isArray(e))return se(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return se(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function fe(e){return Boolean(e.execute)}function me(e,t,r){if(o=e,Boolean(null==o?void 0:o.execute)){var n="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(ue(Object.keys(r.context).map((function(e){var t;return null===(t=r.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return ce(ce({},e),{},{requests:e.queries.map((function(r){return{query:"algolia"===e.requesterId?ce(ce({},r),{},{params:ce(ce({},n),r.params)}):r,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}function pe(e){var t=e.reduce((function(e,t){if(!fe(t))return e.push(t),e;var r=t.searchClient,n=t.execute,o=t.requesterId,i=t.requests,a=e.find((function(e){return fe(t)&&fe(e)&&e.searchClient===r&&Boolean(o)&&e.requesterId===o}));if(a){var c;(c=a.items).push.apply(c,ue(i))}else{var l={execute:n,requesterId:o,items:i,searchClient:r};e.push(l)}return e}),[]).map((function(e){if(!fe(e))return Promise.resolve(e);var t=e,r=t.execute,n=t.items;return r({searchClient:t.searchClient,requests:n})}));return Promise.all(t).then((function(e){return L(e)}))}function ve(e,t,r){return t.map((function(t){var n,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),a=o[0].transformResponse,c=a?a({results:n=i,hits:n.map((function(e){return e.hits})).filter(Boolean),facetHits:n.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:c,state:r.getState()}),Array.isArray(c),c.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:c}}))}function de(e,t){var r=t;return{then:function(t,n){return de(e.then(be(t,r,e),be(n,r,e)),r)},catch:function(t){return de(e.catch(be(t,r,e)),r)},finally:function(t){return t&&r.onCancelList.push(t),de(e.finally(be(t&&function(){return r.onCancelList=[],t()},r,e)),r)},cancel:function(){r.isCanceled=!0;var e=r.onCancelList;r.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===r.isCanceled}}}function ye(e){return de(new Promise((function(t,r){return e(t,r)})),{isCanceled:!1,onCancelList:[]})}function he(e){return de(e,{isCanceled:!1,onCancelList:[]})}function be(e,t,r){return e?function(r){return t.isCanceled?r:e(r)}:r}function ge(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,r){var n=(e[r-1]||0)+t;return e.push(n),e}),[]).reduce((function(t,r){return r<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var r=t.items[function(e){for(var t=e.state,r=e.collection,n=!1,o=0,i=0;!1===n;){var a=t.collections[o];if(a===r){n=!0;break}i+=a.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],n=t.source;return{item:r,itemInputValue:n.getItemInputValue({item:r,state:e}),itemUrl:n.getItemUrl({item:r,state:e}),source:n}}function Oe(e){return Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oe(e)}ye.resolve=function(e){return he(Promise.resolve(e))},ye.reject=function(e){return he(Promise.reject(e))};var Se=["event","nextState","props","query","refresh","store"];function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function we(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?je(Object(r),!0).forEach((function(t){Ee(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):je(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Ee(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Oe(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Oe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Pe(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t<De?Ae:(De=t,Ae=e,e)}))});function Ce(e){var t=e.event,r=e.nextState,n=void 0===r?{}:r,o=e.props,i=e.query,a=e.refresh,c=e.store,l=Pe(e,Se);ke&&o.environment.clearTimeout(ke);var u=l.setCollections,s=l.setIsOpen,f=l.setQuery,m=l.setActiveItemId,p=l.setStatus;if(f(i),m(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=c.getState().collections.map((function(e){return we(we({},e),{},{items:[]})}));p("idle"),u(d),s(null!==(v=n.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:c.getState()}));var y=he(xe(d).then((function(){return Promise.resolve()})));return c.pendingRequests.add(y)}p("loading"),ke=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var h=he(xe(o.getSources(we({query:i,refresh:a,state:c.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(we({query:i,refresh:a,state:c.getState()},l))).then((function(t){return me(t,e.sourceId,c.getState())}))}))).then(pe).then((function(t){return ve(t,e,c)})).then((function(e){return function(e){var t=e.collections,r=e.props,n=e.state,o=t.reduce((function(e,t){return ne(ne({},e),{},oe({},t.source.sourceId,ne(ne({},t.source),{},{getItems:function(){return L(t.items)}})))}),{}),i=r.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:o,state:n}).sourcesBySourceId;return L(r.reshape({sourcesBySourceId:i,sources:Object.values(i),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:c.getState()})}))})))).then((function(e){var r;p("idle"),u(e);var f=o.shouldPanelOpen({state:c.getState()});s(null!==(r=n.isOpen)&&void 0!==r?r:o.openOnFocus&&!i&&f||f);var m=ge(c.getState());if(null!==c.getState().activeItemId&&m){var v=m.item,d=m.itemInputValue,y=m.itemUrl,h=m.source;h.onActive(we({event:t,item:v,itemInputValue:d,itemUrl:y,refresh:a,source:h,state:c.getState()},l))}})).finally((function(){p("idle"),ke&&o.environment.clearTimeout(ke)}));return c.pendingRequests.add(h)}function _e(e){return _e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_e(e)}var Ne=["event","props","refresh","store"];function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function qe(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(r),!0).forEach((function(t){Re(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Te(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Re(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_e(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_e(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_e(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Le(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ze(Object(r),!0).forEach((function(t){Qe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ze(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Qe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==He(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===He(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ze(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,Ne);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?et(Object(r),!0).forEach((function(t){rt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):et(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function rt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nt(e){var t,r,n,o,i=e.plugins,a=e.options,c=null===(t=((null===(r=a.__autocomplete_metadata)||void 0===r?void 0:r.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=c?rt({},c,Object.keys((null===(n=a.__autocomplete_metadata)||void 0===n?void 0:n.options)||{})):{};return{plugins:i.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:tt({"autocomplete-core":Object.keys(a)},l),ua:Xe.concat((null===(o=a.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function ot(e){var t,r=e.state;return!1===r.isOpen||null===r.activeItemId?null:(null===(t=ge(r))||void 0===t?void 0:t.itemInputValue)||null}function it(e,t,r,n){if(!r)return null;if(e<0&&(null===t||null!==n&&0===t))return r+e;var o=(null===t?-1:t)+e;return o<=-1||o>=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ct(Object(r),!0).forEach((function(t){ut(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ct(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ut(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==at(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var st=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return lt(lt({},e),{},{activeItemId:t.payload});case"setQuery":return lt(lt({},e),{},{query:t.payload,completion:null});case"setCollections":return lt(lt({},e),{},{collections:t.payload});case"setIsOpen":return lt(lt({},e),{},{isOpen:t.payload});case"setStatus":return lt(lt({},e),{},{status:t.payload});case"setContext":return lt(lt({},e),{},{context:lt(lt({},e.context),t.payload)});case"ArrowDown":var r=lt(lt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:it(1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},r),{},{completion:ot({state:r})});case"ArrowUp":var n=lt(lt({},e),{},{activeItemId:it(-1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},n),{},{completion:ot({state:n})});case"Escape":return e.isOpen?lt(lt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):lt(lt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return lt(lt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return lt(lt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",query:""});case"focus":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:lt(lt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function ft(e){return ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ft(e)}function mt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function pt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?mt(Object(r),!0).forEach((function(t){vt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function vt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ft(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ft(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ft(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function dt(e){var t=[],r=ee(e,t),n=R(st,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(pt({prevState:t,state:n,refresh:a,navigator:r.navigator},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return F(F({},e),{},{items:L(e.items).map((function(e){return F(F({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=Ge(pt({props:r,refresh:a,store:n,navigator:r.navigator},o));function a(){return Ce(pt({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,navigator:r.navigator,query:n.getState().query,refresh:a,store:n},o))}if(e.insights&&!r.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var c="boolean"==typeof e.insights?{}:e.insights;r.plugins.push(_(c))}return r.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,pt(pt({},o),{},{navigator:r.navigator,refresh:a,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var i=o.document.createElement("meta"),a=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(n),a.appendChild(i)}),0)}}({metadata:nt({plugins:r.plugins,options:e}),environment:r.environment}),pt(pt({refresh:a,navigator:r.navigator},i),o)}var yt=r(6540),ht=64;function bt(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return yt.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},yt.createElement("span",{className:"DocSearch-Label"},n),yt.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},yt.createElement("defs",null,yt.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),yt.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),yt.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),yt.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),yt.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),yt.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function gt(e){return yt.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},yt.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ot(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,i=r.selectKeyAriaLabel,a=void 0===i?"Enter key":i,c=r.navigateText,l=void 0===c?"to navigate":c,u=r.navigateUpKeyAriaLabel,s=void 0===u?"Arrow up":u,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,v=void 0===p?"to close":p,d=r.closeKeyAriaLabel,y=void 0===d?"Escape key":d,h=r.searchByText,b=void 0===h?"Search by":h;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Logo"},yt.createElement(bt,{translations:{searchByText:b}})),yt.createElement("ul",{className:"DocSearch-Commands"},yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:a},yt.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),yt.createElement("span",{className:"DocSearch-Label"},o)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:m},yt.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:s},yt.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),yt.createElement("span",{className:"DocSearch-Label"},l)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:y},yt.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),yt.createElement("span",{className:"DocSearch-Label"},v))))}function St(e){var t=e.hit,r=e.children;return yt.createElement("a",{href:t.url},r)}function jt(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function wt(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,i=r.helpText,a=void 0===i?"You might want to check your network connection.":i;return yt.createElement("div",{className:"DocSearch-ErrorScreen"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(jt,null)),yt.createElement("p",{className:"DocSearch-Title"},o),yt.createElement("p",{className:"DocSearch-Help"},a))}function Et(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Pt=["translations"];function It(e){return function(e){if(Array.isArray(e))return Dt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Dt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Dt(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function At(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(Nt,null);default:return yt.createElement(_t,null)}}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Rt(Object(r),!0).forEach((function(t){Mt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Rt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Mt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ht(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Kt(){return Kt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Kt.apply(this,arguments)}function $t(e){return e.collection&&0!==e.collection.items.length?yt.createElement("section",{className:"DocSearch-Hits"},yt.createElement("div",{className:"DocSearch-Hit-source"},e.title),yt.createElement("ul",e.getListProps(),e.collection.items.map((function(t,r){return yt.createElement(Jt,Kt({key:[e.title,t.objectID].join(":"),item:t,index:r},e))})))):null}function Jt(e){var t=e.item,r=e.index,n=e.renderIcon,o=e.renderAction,i=e.getItemProps,a=e.onItemClick,c=e.collection,l=e.hitComponent,u=Bt(yt.useState(!1),2),s=u[0],f=u[1],m=Bt(yt.useState(!1),2),p=m[0],v=m[1],d=yt.useRef(null),y=l;return yt.createElement("li",Kt({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",s&&"DocSearch-Hit--deleting",p&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){d.current&&d.current()}},i({item:t,source:c.source,onClick:function(e){a(t,e)}})),yt.createElement(y,{hit:t},yt.createElement("div",{className:"DocSearch-Hit-Container"},n({item:t,index:r}),t.hierarchy[t.type]&&"lvl1"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),o({item:t,runDeleteTransition:function(e){f(!0),d.current=e},runFavoriteTransition:function(e){v(!0),d.current=e}}))))}var zt=/(<mark>|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Zt.apply(this,arguments)}function Gt(e){return yt.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var r=Qt(t.items[0]);return yt.createElement($t,Zt({},e,{key:t.source.sourceId,title:r,collection:t,renderIcon:function(e){var r,n=e.item,o=e.index;return yt.createElement(yt.Fragment,null,n.__docsearch_parent&&yt.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},n.__docsearch_parent!==(null===(r=t.items[o+1])||void 0===r?void 0:r.__docsearch_parent)?yt.createElement("path",{d:"M8 6v21M20 27H8.3"}):yt.createElement("path",{d:"M8 6v42M20 27H8.3"}))),yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Ct,{type:n.type})))},renderAction:function(){return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement(Tt,null))}}))})),e.resultsFooterComponent&&yt.createElement("section",{className:"DocSearch-HitsFooter"},yt.createElement(e.resultsFooterComponent,{state:e.state})))}function Xt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),yt.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Yt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function er(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var tr=["translations"];function rr(){return rr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},rr.apply(this,arguments)}function nr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ar.apply(this,arguments)}function cr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(9188),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},mr.apply(this,arguments)}function pr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+t<r)})));i(a)})();const r=JSON.stringify(t);return o()[r]})).then((e=>Promise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.22.1",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function _r(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const Nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>_r(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===Nr.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==Nr.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>_r(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===Nr.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.5.2";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},an.apply(this,arguments)}function cn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ln(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?cn(Object(r),!0).forEach((function(t){un(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):cn(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function un(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function sn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return fn(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return fn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function fn(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function mn(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,_=mn(I,on),N=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=N[0],q=N[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length<Object.keys(p).length&&l({searchSuggestions:Object.keys(p)}),l({nbHits:s});var v={};return m&&(v={__autocomplete_indexName:n,__autocomplete_queryID:o.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:r}}),Object.values(p).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(nn(e,(function(e){return e.hierarchy.lvl1}),c)).map(f).map((function(e){return e.map((function(t){var r=null,n=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&n&&(r=n),ln(ln({},t),{},{__docsearch_parent:r},v)}))})).flat()}}}))}))}})}),[n,a,c,K,u,J,$,z,V,i,y,f,j,k,t,r]),Z=Q.getEnvironmentProps,G=Q.getRootProps,X=Q.refresh;return function(e){var t=e.getEnvironmentProps,r=e.panelElement,n=e.formElement,o=e.inputElement;yt.useEffect((function(){if(r&&n&&o){var e=t({panelElement:r,formElement:n,inputElement:o}),i=e.onTouchStart,a=e.onTouchMove;return window.addEventListener("touchstart",i),window.addEventListener("touchmove",a),function(){window.removeEventListener("touchstart",i),window.removeEventListener("touchmove",a)}}}),[t,r,n,o])}({getEnvironmentProps:Z,panelElement:H.current,formElement:M.current,inputElement:F.current}),function(e){var t=e.container;yt.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}}),[t])}({container:R.current}),yt.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,b)}}),[]),yt.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(U.current=5)}),[]),yt.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[T.query]),yt.useEffect((function(){V.length>0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:_,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9462],{9462:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];r&&clearTimeout(r),r=setTimeout((function(){return e.apply(void 0,o)}),t)}}function o(e){return e!==Object(e)}function i(e,t){if(e===t)return!0;if(o(e)||o(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var r=0,n=Object.keys(e);r<n.length;r++){var a=n[r];if(!(a in t))return!1;if(!i(e[a],t[a]))return!1}return!0}r.r(t),r.d(t,{DocSearchModal:()=>vn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var s=["items"],f=["items"];function m(e){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m(e)}function p(e){return function(e){if(Array.isArray(e))return v(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function d(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?y(Object(r),!0).forEach((function(t){b(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function b(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==m(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===m(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g(e){return e.map((function(e){var t=e.items,r=d(e,s);return h(h({},r),{},{objectIDs:(null==t?void 0:t.map((function(e){return e.objectID})))||r.objectIDs})}))}function O(e){var t,r,n,o=(t=l((e.version||"").split(".").map(Number),2),r=t[0],n=t[1],r>=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];t.length>0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n<e.objectIDs.length;n+=t)r.push(h(h({},e),{},{objectIDs:e.objectIDs.slice(n,n+t)}));return r}(h(h({},n),{},{objectIDs:(null==r?void 0:r.map((function(e){return e.objectID})))||n.objectIDs})).map((function(e){return{items:r,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];r.length>0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function I(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?I(Object(r),!0).forEach((function(t){A(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):I(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function A(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==w(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==w(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===w(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var k="2.6.0",x="https://cdn.jsdelivr.net/npm/search-insights@".concat(k,"/dist/search-insights.min.js"),C=n((function(e){var t=e.onItemsChange,r=e.items,n=e.insights,o=e.state;t({insights:n,insightsEvents:S({items:r}).map((function(e){return D({eventName:"Items Viewed"},e)})),state:o})}),400);function _(e){var t=function(e){return D({onItemsChange:function(e){var t=e.insights,r=e.insightsEvents;t.viewedObjectIDs.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onSelect:function(e){var t=e.insights,r=e.insightsEvents;t.clickedObjectIDsAfterSearch.apply(t,E(r.map((function(e){return D(D({},e),{},{algoliaSource:[].concat(E(e.algoliaSource||[]),["autocomplete-internal"])})}))))},onActive:a},e)}(e),r=t.insightsClient,o=t.onItemsChange,l=t.onSelect,u=t.onActive,s=r;r||function(e){if("undefined"!=typeof window)e({window:window})}((function(e){var t=e.window,r=t.AlgoliaAnalyticsObject||"aa";"string"==typeof r&&(s=t[r]),s||(t.AlgoliaAnalyticsObject=r,t[r]||(t[r]=function(){t[r].queue||(t[r].queue=[]);for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];t[r].queue.push(n)}),t[r].version=k,s=t[r],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var r=e.document.createElement("script");r.async=!0,r.src=x,r.onerror=function(){console.error(t)},document.body.appendChild(r)}catch(n){console.error(t)}}(t))}));var f=O(s),m={current:[]},p=n((function(e){var t=e.state;if(t.isOpen){var r=t.collections.reduce((function(e,t){return[].concat(E(e),E(t.items))}),[]).filter(j);i(m.current.map((function(e){return e.objectID})),r.map((function(e){return e.objectID})))||(m.current=r,r.length>0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function N(e){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},N(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==N(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===N(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){q(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({},o);o=e(o,{type:n,props:t,payload:i}),r({state:o,prevState:a})},pendingRequests:(n=[],{add:function(e){return n.push(e),e.finally((function(){n=n.filter((function(t){return t!==e}))}))},cancelAll:function(){n.forEach((function(e){return e.cancel()}))},isEmpty:function(){return 0===n.length}})}}function L(e){return e.reduce((function(e,t){return e.concat(t)}),[])}function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function H(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?H(Object(r),!0).forEach((function(t){U(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):H(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function U(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==M(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==M(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===M(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B(e){return 0===e.collections.length?0:e.collections.reduce((function(e,t){return e+t.items.length}),0)}var V=0;function K(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function $(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?K(Object(r),!0).forEach((function(t){J(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):K(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function J(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==z(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===z(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function z(e){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},z(e)}function W(e){return W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(e)}function Q(e){return function(e){if(Array.isArray(e))return Z(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Z(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function G(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?G(Object(r),!0).forEach((function(t){Y(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):G(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Y(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==W(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==W(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===W(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ee(e,t){var r,n="undefined"!=typeof window?window:{},o=e.plugins||[];return X(X({debug:!1,openOnFocus:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:!1,environment:n,shouldPanelOpen:function(e){return B(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?re(Object(r),!0).forEach((function(t){oe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):re(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function oe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==te(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==te(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===te(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ie(e){return ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ie(e)}function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ce(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ae(Object(r),!0).forEach((function(t){le(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ae(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function le(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ie(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ie(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ie(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ue(e){return function(e){if(Array.isArray(e))return se(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return se(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function fe(e){return Boolean(e.execute)}function me(e,t,r){if(o=e,Boolean(null==o?void 0:o.execute)){var n="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(ue(Object.keys(r.context).map((function(e){var t;return null===(t=r.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return ce(ce({},e),{},{requests:e.queries.map((function(r){return{query:"algolia"===e.requesterId?ce(ce({},r),{},{params:ce(ce({},n),r.params)}):r,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}function pe(e){var t=e.reduce((function(e,t){if(!fe(t))return e.push(t),e;var r=t.searchClient,n=t.execute,o=t.requesterId,i=t.requests,a=e.find((function(e){return fe(t)&&fe(e)&&e.searchClient===r&&Boolean(o)&&e.requesterId===o}));if(a){var c;(c=a.items).push.apply(c,ue(i))}else{var l={execute:n,requesterId:o,items:i,searchClient:r};e.push(l)}return e}),[]).map((function(e){if(!fe(e))return Promise.resolve(e);var t=e,r=t.execute,n=t.items;return r({searchClient:t.searchClient,requests:n})}));return Promise.all(t).then((function(e){return L(e)}))}function ve(e,t,r){return t.map((function(t){var n,o=e.filter((function(e){return e.sourceId===t.sourceId})),i=o.map((function(e){return e.items})),a=o[0].transformResponse,c=a?a({results:n=i,hits:n.map((function(e){return e.hits})).filter(Boolean),facetHits:n.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):i;return t.onResolve({source:t,results:i,items:c,state:r.getState()}),Array.isArray(c),c.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:c}}))}function de(e,t){var r=t;return{then:function(t,n){return de(e.then(be(t,r,e),be(n,r,e)),r)},catch:function(t){return de(e.catch(be(t,r,e)),r)},finally:function(t){return t&&r.onCancelList.push(t),de(e.finally(be(t&&function(){return r.onCancelList=[],t()},r,e)),r)},cancel:function(){r.isCanceled=!0;var e=r.onCancelList;r.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===r.isCanceled}}}function ye(e){return de(new Promise((function(t,r){return e(t,r)})),{isCanceled:!1,onCancelList:[]})}function he(e){return de(e,{isCanceled:!1,onCancelList:[]})}function be(e,t,r){return e?function(r){return t.isCanceled?r:e(r)}:r}function ge(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,r){var n=(e[r-1]||0)+t;return e.push(n),e}),[]).reduce((function(t,r){return r<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var r=t.items[function(e){for(var t=e.state,r=e.collection,n=!1,o=0,i=0;!1===n;){var a=t.collections[o];if(a===r){n=!0;break}i+=a.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],n=t.source;return{item:r,itemInputValue:n.getItemInputValue({item:r,state:e}),itemUrl:n.getItemUrl({item:r,state:e}),source:n}}function Oe(e){return Oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Oe(e)}ye.resolve=function(e){return he(Promise.resolve(e))},ye.reject=function(e){return he(Promise.reject(e))};var Se=["event","nextState","props","query","refresh","store"];function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function we(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?je(Object(r),!0).forEach((function(t){Ee(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):je(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Ee(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Oe(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Oe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Oe(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Pe(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t<De?Ae:(De=t,Ae=e,e)}))});function Ce(e){var t=e.event,r=e.nextState,n=void 0===r?{}:r,o=e.props,i=e.query,a=e.refresh,c=e.store,l=Pe(e,Se);ke&&o.environment.clearTimeout(ke);var u=l.setCollections,s=l.setIsOpen,f=l.setQuery,m=l.setActiveItemId,p=l.setStatus;if(f(i),m(o.defaultActiveItemId),!i&&!1===o.openOnFocus){var v,d=c.getState().collections.map((function(e){return we(we({},e),{},{items:[]})}));p("idle"),u(d),s(null!==(v=n.isOpen)&&void 0!==v?v:o.shouldPanelOpen({state:c.getState()}));var y=he(xe(d).then((function(){return Promise.resolve()})));return c.pendingRequests.add(y)}p("loading"),ke=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var h=he(xe(o.getSources(we({query:i,refresh:a,state:c.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(we({query:i,refresh:a,state:c.getState()},l))).then((function(t){return me(t,e.sourceId,c.getState())}))}))).then(pe).then((function(t){return ve(t,e,c)})).then((function(e){return function(e){var t=e.collections,r=e.props,n=e.state,o=t.reduce((function(e,t){return ne(ne({},e),{},oe({},t.source.sourceId,ne(ne({},t.source),{},{getItems:function(){return L(t.items)}})))}),{}),i=r.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:o,state:n}).sourcesBySourceId;return L(r.reshape({sourcesBySourceId:i,sources:Object.values(i),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:c.getState()})}))})))).then((function(e){var r;p("idle"),u(e);var f=o.shouldPanelOpen({state:c.getState()});s(null!==(r=n.isOpen)&&void 0!==r?r:o.openOnFocus&&!i&&f||f);var m=ge(c.getState());if(null!==c.getState().activeItemId&&m){var v=m.item,d=m.itemInputValue,y=m.itemUrl,h=m.source;h.onActive(we({event:t,item:v,itemInputValue:d,itemUrl:y,refresh:a,source:h,state:c.getState()},l))}})).finally((function(){p("idle"),ke&&o.environment.clearTimeout(ke)}));return c.pendingRequests.add(h)}function _e(e){return _e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_e(e)}var Ne=["event","props","refresh","store"];function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function qe(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(r),!0).forEach((function(t){Re(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Te(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Re(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_e(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_e(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_e(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Le(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ze(Object(r),!0).forEach((function(t){Qe(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ze(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Qe(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==He(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===He(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ze(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,Ne);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?et(Object(r),!0).forEach((function(t){rt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):et(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function rt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==Ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nt(e){var t,r,n,o,i=e.plugins,a=e.options,c=null===(t=((null===(r=a.__autocomplete_metadata)||void 0===r?void 0:r.userAgents)||[])[0])||void 0===t?void 0:t.segment,l=c?rt({},c,Object.keys((null===(n=a.__autocomplete_metadata)||void 0===n?void 0:n.options)||{})):{};return{plugins:i.map((function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}})),options:tt({"autocomplete-core":Object.keys(a)},l),ua:Xe.concat((null===(o=a.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function ot(e){var t,r=e.state;return!1===r.isOpen||null===r.activeItemId?null:(null===(t=ge(r))||void 0===t?void 0:t.itemInputValue)||null}function it(e,t,r,n){if(!r)return null;if(e<0&&(null===t||null!==n&&0===t))return r+e;var o=(null===t?-1:t)+e;return o<=-1||o>=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ct(Object(r),!0).forEach((function(t){ut(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ct(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function ut(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==at(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var st=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return lt(lt({},e),{},{activeItemId:t.payload});case"setQuery":return lt(lt({},e),{},{query:t.payload,completion:null});case"setCollections":return lt(lt({},e),{},{collections:t.payload});case"setIsOpen":return lt(lt({},e),{},{isOpen:t.payload});case"setStatus":return lt(lt({},e),{},{status:t.payload});case"setContext":return lt(lt({},e),{},{context:lt(lt({},e.context),t.payload)});case"ArrowDown":var r=lt(lt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:it(1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},r),{},{completion:ot({state:r})});case"ArrowUp":var n=lt(lt({},e),{},{activeItemId:it(-1,e.activeItemId,B(e),t.props.defaultActiveItemId)});return lt(lt({},n),{},{completion:ot({state:n})});case"Escape":return e.isOpen?lt(lt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):lt(lt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return lt(lt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return lt(lt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",query:""});case"focus":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:lt(lt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return lt(lt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function ft(e){return ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ft(e)}function mt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function pt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?mt(Object(r),!0).forEach((function(t){vt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function vt(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==ft(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==ft(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ft(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function dt(e){var t=[],r=ee(e,t),n=R(st,r,(function(e){var t=e.prevState,n=e.state;r.onStateChange(pt({prevState:t,state:n,refresh:a,navigator:r.navigator},o))})),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var r=0,n=e.map((function(e){return F(F({},e),{},{items:L(e.items).map((function(e){return F(F({},e),{},{__autocomplete_id:r++})}))})}));t.dispatch("setCollections",n)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:n}),i=Ge(pt({props:r,refresh:a,store:n,navigator:r.navigator},o));function a(){return Ce(pt({event:new Event("input"),nextState:{isOpen:n.getState().isOpen},props:r,navigator:r.navigator,query:n.getState().query,refresh:a,store:n},o))}if(e.insights&&!r.plugins.some((function(e){return"aa.algoliaInsightsPlugin"===e.name}))){var c="boolean"==typeof e.insights?{}:e.insights;r.plugins.push(_(c))}return r.plugins.forEach((function(e){var n;return null===(n=e.subscribe)||void 0===n?void 0:n.call(e,pt(pt({},o),{},{navigator:r.navigator,refresh:a,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})),function(e){var t,r,n=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(r=t.userAgent)||void 0===r?void 0:r.includes("Algolia Crawler")){var i=o.document.createElement("meta"),a=o.document.querySelector("head");i.name="algolia:metadata",setTimeout((function(){i.content=JSON.stringify(n),a.appendChild(i)}),0)}}({metadata:nt({plugins:r.plugins,options:e}),environment:r.environment}),pt(pt({refresh:a,navigator:r.navigator},i),o)}var yt=r(6540),ht=64;function bt(e){var t=e.translations,r=(void 0===t?{}:t).searchByText,n=void 0===r?"Search by":r;return yt.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},yt.createElement("span",{className:"DocSearch-Label"},n),yt.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},yt.createElement("defs",null,yt.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),yt.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),yt.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),yt.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),yt.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),yt.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),yt.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),yt.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function gt(e){return yt.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},yt.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Ot(e){var t=e.translations,r=void 0===t?{}:t,n=r.selectText,o=void 0===n?"to select":n,i=r.selectKeyAriaLabel,a=void 0===i?"Enter key":i,c=r.navigateText,l=void 0===c?"to navigate":c,u=r.navigateUpKeyAriaLabel,s=void 0===u?"Arrow up":u,f=r.navigateDownKeyAriaLabel,m=void 0===f?"Arrow down":f,p=r.closeText,v=void 0===p?"to close":p,d=r.closeKeyAriaLabel,y=void 0===d?"Escape key":d,h=r.searchByText,b=void 0===h?"Search by":h;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Logo"},yt.createElement(bt,{translations:{searchByText:b}})),yt.createElement("ul",{className:"DocSearch-Commands"},yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:a},yt.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),yt.createElement("span",{className:"DocSearch-Label"},o)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:m},yt.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:s},yt.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),yt.createElement("span",{className:"DocSearch-Label"},l)),yt.createElement("li",null,yt.createElement("kbd",{className:"DocSearch-Commands-Key"},yt.createElement(gt,{ariaLabel:y},yt.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),yt.createElement("span",{className:"DocSearch-Label"},v))))}function St(e){var t=e.hit,r=e.children;return yt.createElement("a",{href:t.url},r)}function jt(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function wt(e){var t=e.translations,r=void 0===t?{}:t,n=r.titleText,o=void 0===n?"Unable to fetch results":n,i=r.helpText,a=void 0===i?"You might want to check your network connection.":i;return yt.createElement("div",{className:"DocSearch-ErrorScreen"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(jt,null)),yt.createElement("p",{className:"DocSearch-Title"},o),yt.createElement("p",{className:"DocSearch-Help"},a))}function Et(){return yt.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}var Pt=["translations"];function It(e){return function(e){if(Array.isArray(e))return Dt(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Dt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Dt(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function At(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(Nt,null);default:return yt.createElement(_t,null)}}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Rt(Object(r),!0).forEach((function(t){Mt(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Rt(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function Mt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ht(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function Kt(){return Kt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Kt.apply(this,arguments)}function $t(e){return e.collection&&0!==e.collection.items.length?yt.createElement("section",{className:"DocSearch-Hits"},yt.createElement("div",{className:"DocSearch-Hit-source"},e.title),yt.createElement("ul",e.getListProps(),e.collection.items.map((function(t,r){return yt.createElement(Jt,Kt({key:[e.title,t.objectID].join(":"),item:t,index:r},e))})))):null}function Jt(e){var t=e.item,r=e.index,n=e.renderIcon,o=e.renderAction,i=e.getItemProps,a=e.onItemClick,c=e.collection,l=e.hitComponent,u=Bt(yt.useState(!1),2),s=u[0],f=u[1],m=Bt(yt.useState(!1),2),p=m[0],v=m[1],d=yt.useRef(null),y=l;return yt.createElement("li",Kt({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",s&&"DocSearch-Hit--deleting",p&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){d.current&&d.current()}},i({item:t,source:c.source,onClick:function(e){a(t,e)}})),yt.createElement(y,{hit:t},yt.createElement("div",{className:"DocSearch-Hit-Container"},n({item:t,index:r}),t.hierarchy[t.type]&&"lvl1"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&yt.createElement("div",{className:"DocSearch-Hit-content-wrapper"},yt.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),yt.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),o({item:t,runDeleteTransition:function(e){f(!0),d.current=e},runFavoriteTransition:function(e){v(!0),d.current=e}}))))}var zt=/(<mark>|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Zt.apply(this,arguments)}function Gt(e){return yt.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var r=Qt(t.items[0]);return yt.createElement($t,Zt({},e,{key:t.source.sourceId,title:r,collection:t,renderIcon:function(e){var r,n=e.item,o=e.index;return yt.createElement(yt.Fragment,null,n.__docsearch_parent&&yt.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},n.__docsearch_parent!==(null===(r=t.items[o+1])||void 0===r?void 0:r.__docsearch_parent)?yt.createElement("path",{d:"M8 6v21M20 27H8.3"}):yt.createElement("path",{d:"M8 6v42M20 27H8.3"}))),yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Ct,{type:n.type})))},renderAction:function(){return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement(Tt,null))}}))})),e.resultsFooterComponent&&yt.createElement("section",{className:"DocSearch-HitsFooter"},yt.createElement(e.resultsFooterComponent,{state:e.state})))}function Xt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),yt.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Yt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function er(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var tr=["translations"];function rr(){return rr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},rr.apply(this,arguments)}function nr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ar.apply(this,arguments)}function cr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(9188),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},mr.apply(this,arguments)}function pr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=r.searchInputLabel,p=void 0===m?"Search":m,v=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:v},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null),yt.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},p)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+t<r)})));i(a)})();const r=JSON.stringify(t);return o()[r]})).then((e=>Promise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.23.3",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function _r(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const Nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>_r(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&!~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===Nr.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==Nr.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>_r(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>!!(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>!!(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===Nr.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:Nr.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};const Gr=e=>(t,r)=>{const n=t.map((e=>({...e,threshold:e.threshold||0})));return e.transporter.read({method:Nr.Post,path:"1/indexes/*/recommendations",data:{requests:n},cacheable:!0},r)};function Xr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}}),getRecommendations:Gr}})}Xr.version=Pr;const Yr=Xr;var en="3.6.0";function tn(){}function rn(e){return e}function nn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function on(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var an=["footer","searchBox"];function cn(){return cn=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},cn.apply(this,arguments)}function ln(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function un(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ln(Object(r),!0).forEach((function(t){sn(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ln(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function sn(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function fn(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return mn(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return mn(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function mn(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function pn(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?tn:l,s=e.transformItems,f=void 0===s?rn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?rn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,_=pn(I,an),N=fn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=N[0],q=N[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Yr(e,t);return n.addAlgoliaAgent("docsearch",en),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",en),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),nn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),nn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:un({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=on(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length<Object.keys(p).length&&l({searchSuggestions:Object.keys(p)}),l({nbHits:s});var v={};return m&&(v={__autocomplete_indexName:n,__autocomplete_queryID:o.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:r}}),Object.values(p).map((function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,r=e.event;z(t),nn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(on(e,(function(e){return e.hierarchy.lvl1}),c)).map(f).map((function(e){return e.map((function(t){var r=null,n=e.find((function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1}));return"lvl1"!==t.type&&n&&(r=n),un(un({},t),{},{__docsearch_parent:r},v)}))})).flat()}}}))}))}})}),[n,a,c,K,u,J,$,z,V,i,y,f,j,k,t,r]),Z=Q.getEnvironmentProps,G=Q.getRootProps,X=Q.refresh;return function(e){var t=e.getEnvironmentProps,r=e.panelElement,n=e.formElement,o=e.inputElement;yt.useEffect((function(){if(r&&n&&o){var e=t({panelElement:r,formElement:n,inputElement:o}),i=e.onTouchStart,a=e.onTouchMove;return window.addEventListener("touchstart",i),window.addEventListener("touchmove",a),function(){window.removeEventListener("touchstart",i),window.removeEventListener("touchmove",a)}}}),[t,r,n,o])}({getEnvironmentProps:Z,panelElement:H.current,formElement:M.current,inputElement:F.current}),function(e){var t=e.container;yt.useEffect((function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}}),[t])}({container:R.current}),yt.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,b)}}),[]),yt.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(U.current=5)}),[]),yt.useEffect((function(){H.current&&(H.current.scrollTop=0)}),[T.query]),yt.useEffect((function(){V.length>0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",cn({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,cn({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,cn({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:_,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),nn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file diff --git a/assets/js/95069fb2.b3b4552d.js b/assets/js/95069fb2.d553b08e.js similarity index 97% rename from assets/js/95069fb2.b3b4552d.js rename to assets/js/95069fb2.d553b08e.js index 4df64667c..784277e84 100644 --- a/assets/js/95069fb2.b3b4552d.js +++ b/assets/js/95069fb2.d553b08e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2358],{5203:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updatePeer",c={id:"api/peers/update",title:"updatePeer",description:"Updates an existing Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/update.md",sourceDirName:"api/peers",slug:"/api/peers/update",permalink:"/docs/1.x.x/api/peers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"},next:{title:"registry",permalink:"/docs/1.x.x/api/registry"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updatepeer",children:"updatePeer"}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method updates a Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/peers/pr2c77f4\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2358],{2026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updatePeer",c={id:"api/peers/update",title:"updatePeer",description:"Updates an existing Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/update.md",sourceDirName:"api/peers",slug:"/api/peers/update",permalink:"/docs/1.x.x/api/peers/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"},next:{title:"registry",permalink:"/docs/1.x.x/api/registry"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updatepeer",children:"updatePeer"}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/peers",children:"Peer"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method updates a Peer resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/peers/pr2c77f4\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Peer",\n\t"metadata": {\n\t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n\t},\n\t"spec": {\n\t\t"credentials": {\n\t\t\t"username": "ast",\n\t\t\t"secret": "1234"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/956a4ea6.60c96be8.js b/assets/js/956a4ea6.60c96be8.js new file mode 100644 index 000000000..496dc9d4f --- /dev/null +++ b/assets/js/956a4ea6.60c96be8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4050],{874:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(4848),i=n(8453);const o={},d="Building a Middleware",s={id:"development/building-a-middleware",title:"Building a Middleware",description:"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.",source:"@site/docs/development/building-a-middleware.md",sourceDirName:"development",slug:"/development/building-a-middleware",permalink:"/docs/2.11.5/development/building-a-middleware",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-middleware.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Processor",permalink:"/docs/2.11.5/development/building-a-processor"},next:{title:"Custom data with the APIServer",permalink:"/docs/2.11.5/development/custom-data-with-the-apiserver"}},a={},l=[];function c(e){const t={a:"a",h1:"h1",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"building-a-middleware",children:"Building a Middleware"}),"\n",(0,r.jsxs)(t.p,{children:["Building a Middleware is the same as ",(0,r.jsx)(t.a,{href:"/docs/2.11.5/development/building-a-processor",children:"building a Processor"}),". Both share the same protobuf definition. Please refer to the ",(0,r.jsx)(t.a,{href:"/docs/2.11.5/overview/concepts",children:"Concepts Overview"})," for more information on the differences between a Processor and a Middleware."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var r=n(6540);const i={},o=r.createContext(i);function d(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/956a4ea6.65e6eb8e.js b/assets/js/956a4ea6.65e6eb8e.js deleted file mode 100644 index 393661e69..000000000 --- a/assets/js/956a4ea6.65e6eb8e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4050],{6009:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=n(4848),i=n(8453);const o={},d="Building a Middleware",s={id:"development/building-a-middleware",title:"Building a Middleware",description:"Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.",source:"@site/docs/development/building-a-middleware.md",sourceDirName:"development",slug:"/development/building-a-middleware",permalink:"/docs/2.0.0/development/building-a-middleware",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-middleware.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Processor",permalink:"/docs/2.0.0/development/building-a-processor"},next:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"}},a={},l=[];function c(e){const t={a:"a",h1:"h1",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"building-a-middleware",children:"Building a Middleware"}),"\n",(0,r.jsxs)(t.p,{children:["Building a Middleware is the same as ",(0,r.jsx)(t.a,{href:"/docs/2.0.0/development/building-a-processor",children:"building a Processor"}),". Both share the same protobuf definition. Please refer to the ",(0,r.jsx)(t.a,{href:"/docs/2.0.0/overview/concepts",children:"Concepts Overview"})," for more information on the differences between a Processor and a Middleware."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var r=n(6540);const i={},o=r.createContext(i);function d(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9799683e.8030dda4.js b/assets/js/9799683e.0db4c008.js similarity index 97% rename from assets/js/9799683e.8030dda4.js rename to assets/js/9799683e.0db4c008.js index 3daedca22..0b9053c70 100644 --- a/assets/js/9799683e.8030dda4.js +++ b/assets/js/9799683e.0db4c008.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6695],{1721:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=s(4848),r=s(8453);const i={},o="checkSystemStatus",c={id:"api/status/get",title:"checkSystemStatus",description:"Pings an instance of Routr engine.",source:"@site/versioned_docs/version-1.x.x/api/status/get.md",sourceDirName:"api/status",slug:"/api/status/get",permalink:"/docs/1.x.x/api/status/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"registry",permalink:"/docs/1.x.x/api/registry"},next:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"}},a={},d=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"checksystemstatus",children:"checkSystemStatus"}),"\n",(0,n.jsx)(t.p,{children:"Pings an instance of Routr engine."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsxs)(t.p,{children:["If successful, this method will return a ",(0,n.jsx)(t.code,{children:"status = 200"}),'. A client implementing\nthis method can assumed that no answer or a bad answer means that the server\nus down or "unhealthy."']}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/status\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data": "up"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>c});var n=s(6540);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6695],{7432:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var n=s(4848),r=s(8453);const i={},o="checkSystemStatus",c={id:"api/status/get",title:"checkSystemStatus",description:"Pings an instance of Routr engine.",source:"@site/versioned_docs/version-1.x.x/api/status/get.md",sourceDirName:"api/status",slug:"/api/status/get",permalink:"/docs/1.x.x/api/status/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/status/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"registry",permalink:"/docs/1.x.x/api/registry"},next:{title:"restartServer",permalink:"/docs/1.x.x/api/status/update"}},a={},d=[];function u(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"checksystemstatus",children:"checkSystemStatus"}),"\n",(0,n.jsx)(t.p,{children:"Pings an instance of Routr engine."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/system/status"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsxs)(t.p,{children:["If successful, this method will return a ",(0,n.jsx)(t.code,{children:"status = 200"}),'. A client implementing\nthis method can assumed that no answer or a bad answer means that the server\nus down or "unhealthy."']}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/system/status\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data": "up"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>c});var n=s(6540);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97b3c809.65679d89.js b/assets/js/97b3c809.65679d89.js new file mode 100644 index 000000000..c8d7f6fe7 --- /dev/null +++ b/assets/js/97b3c809.65679d89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5366],{3872:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=o(4848),r=o(8453);const a={},s="Custom data with the APIServer",d={id:"development/custom-data-with-the-apiserver",title:"Custom data with the APIServer",description:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.",source:"@site/versioned_docs/version-2.0.0/development/custom-data-with-the-apiserver.md",sourceDirName:"development",slug:"/development/custom-data-with-the-apiserver",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/custom-data-with-the-apiserver.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"},next:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"}},i={},c=[{value:"When to store custom data",id:"when-to-store-custom-data",level:2},{value:"How to store custom data",id:"how-to-store-custom-data",level:2},{value:"How to retrieve custom data",id:"how-to-retrieve-custom-data",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"custom-data-with-the-apiserver",children:"Custom data with the APIServer"}),"\n",(0,n.jsx)(t.p,{children:"Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer."}),"\n",(0,n.jsxs)(t.p,{children:["The APIServer, typically used for Routr Connect, consists of objects with an ",(0,n.jsx)(t.code,{children:"extended"})," property to store custom data. This ",(0,n.jsx)(t.code,{children:"extended"})," property is a JSON object you can use to store any data you want."]}),"\n",(0,n.jsx)(t.h2,{id:"when-to-store-custom-data",children:"When to store custom data"}),"\n",(0,n.jsx)(t.p,{children:"Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system."}),"\n",(0,n.jsxs)(t.p,{children:["You might also need to store information a Processor requires, like the ",(0,n.jsx)(t.code,{children:"User-Agent"})," of a device an Agent uses, and use that information to adjust the signaling process."]}),"\n",(0,n.jsx)(t.h2,{id:"how-to-store-custom-data",children:"How to store custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To store custom data, add a property to the ",(0,n.jsx)(t.code,{children:"extended"})," object. For instance, to add the external identifier of an Agent in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'const request = {\n name: "John Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "externalId": "123456789"\n }\n};\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,n.jsxs)(t.p,{children:["For additional examples of how to store custom data, see the ",(0,n.jsx)(t.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node SDK"}),' and search for "extended."']}),"\n",(0,n.jsx)(t.h2,{id:"how-to-retrieve-custom-data",children:"How to retrieve custom data"}),"\n",(0,n.jsxs)(t.p,{children:["To retrieve custom data, read the ",(0,n.jsx)(t.code,{children:"extended"})," property. For instance, to retrieve the external identifier of a user in your external system, do the following:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-javascript",children:'agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")\n .then(agent => {\n console.log(agent.extended.externalId);\n })\n .catch(console.error); // an error occurred\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>d});var n=o(6540);const r={},a=n.createContext(r);function s(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9840208a.22624fd6.js b/assets/js/9840208a.b0dab497.js similarity index 98% rename from assets/js/9840208a.22624fd6.js rename to assets/js/9840208a.b0dab497.js index d0289f39a..6c1d44ebb 100644 --- a/assets/js/9840208a.22624fd6.js +++ b/assets/js/9840208a.b0dab497.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8167],{4321:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var s=t(4848),r=t(8453);const o={},a="createAgent",i={id:"api/agents/create",title:"createAgent",description:"Creates a new Agent resource. The Domain must exist before creating the Agent.",source:"@site/versioned_docs/version-1.x.x/api/agents/create.md",sourceDirName:"api/agents",slug:"/api/agents/create",permalink:"/docs/1.x.x/api/agents/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"overview",permalink:"/docs/1.x.x/api/overview"},next:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"createagent",children:"createAgent"}),"\n",(0,s.jsxs)(n.p,{children:["Creates a new Agent resource. The Domain must exist before creating the Agent.\nOtherwise, this method responds with a ",(0,s.jsx)(n.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"POST"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method creates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/agents\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "ag3f77f6"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8167],{1206:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var s=t(4848),r=t(8453);const o={},a="createAgent",i={id:"api/agents/create",title:"createAgent",description:"Creates a new Agent resource. The Domain must exist before creating the Agent.",source:"@site/versioned_docs/version-1.x.x/api/agents/create.md",sourceDirName:"api/agents",slug:"/api/agents/create",permalink:"/docs/1.x.x/api/agents/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"overview",permalink:"/docs/1.x.x/api/overview"},next:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"createagent",children:"createAgent"}),"\n",(0,s.jsxs)(n.p,{children:["Creates a new Agent resource. The Domain must exist before creating the Agent.\nOtherwise, this method responds with a ",(0,s.jsx)(n.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/agents"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"POST"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing an ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/agents",children:"Agent"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method creates an Agent resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/agents\n{\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n}\n\nHTTP/1.1 201 Created\n{\n "status": "201",\n "message": "Created",\n "data": "ag3f77f6"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99054fd6.861ba8fb.js b/assets/js/99054fd6.861ba8fb.js new file mode 100644 index 000000000..b28f8d311 --- /dev/null +++ b/assets/js/99054fd6.861ba8fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5912],{3791:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={},i="WebRTC Support",a={id:"connect/webrtc-support",title:"WebRTC Support",description:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.",source:"@site/versioned_docs/version-2.0.0/connect/webrtc-support.md",sourceDirName:"connect",slug:"/connect/webrtc-support",permalink:"/docs/2.0.0/connect/webrtc-support",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/webrtc-support.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"},next:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"}},c={},l=[];function u(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"webrtc-support",children:"WebRTC Support"}),"\n",(0,o.jsx)(n.p,{children:"The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server."}),"\n",(0,o.jsx)(n.p,{children:"Let\u2019s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients."}),"\n",(0,o.jsx)(n.p,{children:"Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step."}),"\n",(0,o.jsxs)(n.p,{children:["To enable WebRTC interoperability, you will need to update your compose.yaml file to include the ",(0,o.jsx)(n.code,{children:"RTPENGINE_HOST"})," environment variable. Here is an example:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n RTPENGINE_HOST: ${RTPE_HOST} \n ports:\n - 51908:51908\n - 5060:5060/udp\n\n-- snip --\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If using Helm, you will need to add the following configuration to your ",(0,o.jsx)(n.code,{children:"values.yaml"})," file:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"rtprelay:\n enabled: true\n rtpeHost: /* rtpengine */ \n rtpPort: 22222\n"})}),"\n",(0,o.jsx)(n.p,{children:"Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99333fd2.36f21441.js b/assets/js/99333fd2.36f21441.js new file mode 100644 index 000000000..6dc656848 --- /dev/null +++ b/assets/js/99333fd2.36f21441.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[898],{1603:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={},i="Quick Start",a={id:"development/quick-start",title:"Quick Start",description:"Before starting the development, you need to install the following tools:",source:"@site/versioned_docs/version-2.0.0/development/quick-start.md",sourceDirName:"development",slug:"/development/quick-start",permalink:"/docs/2.0.0/development/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/quick-start.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"},next:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"}},c={},l=[{value:"Clone and Build the Project",id:"clone-and-build-the-project",level:2},{value:"Run the Project",id:"run-the-project",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"quick-start",children:"Quick Start"}),"\n",(0,o.jsx)(n.p,{children:"Before starting the development, you need to install the following tools:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"NodeJS (>=16.14)"}),"\n",(0,o.jsx)(n.li,{children:"JDK (>=11)"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For NodeJS, we recommend using ",(0,o.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage your NodeJS versions."]}),"\n",(0,o.jsx)(n.h2,{id:"clone-and-build-the-project",children:"Clone and Build the Project"}),"\n",(0,o.jsx)(n.p,{children:"To get started, first, clone the repository:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fonoster/routr\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous command will create a directory called ",(0,o.jsx)(n.code,{children:"routr"})," with the project's source code."]}),"\n",(0,o.jsx)(n.p,{children:"Next, set the JAVA_HOME environment variable to the location of your JDK installation:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export JAVA_HOME=/path/to/jdk\n"})}),"\n",(0,o.jsx)(n.p,{children:"Finally, build the project:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd routr\nnpm run make\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors."}),"\n",(0,o.jsx)(n.h2,{id:"run-the-project",children:"Run the Project"}),"\n",(0,o.jsx)(n.p,{children:"To run all the components, you can use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry."}),"\n",(0,o.jsx)(n.p,{children:"As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart."}),"\n",(0,o.jsx)(n.p,{children:"You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:"}),"\n",(0,o.jsx)(n.p,{children:"In one terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:edgeport\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"> start:edgeport\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh\n\n2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0\n2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]\n2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]\n2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz\n"})}),"\n",(0,o.jsx)(n.p,{children:"In a separate terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:location\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'> start:location\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner\n\n[nodemon] 2.0.20\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching path(s): mods/**/*\n[nodemon] watching extensions: ts\n[nodemon] starting `ts-node mods/location/src/runner.ts`\n2023-09-05 12:41:38.735 [info]: (location) using memory as cache provider {}\n2023-09-05 12:41:38.739 [info]: (common) starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Please see the ",(0,o.jsx)(n.code,{children:"scripts"})," section of ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/package.json",children:"package.json"})," for a complete list of available commands."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99f83bea.e53f7fb4.js b/assets/js/99f83bea.e654339e.js similarity index 98% rename from assets/js/99f83bea.e53f7fb4.js rename to assets/js/99f83bea.e654339e.js index b5fbf021d..e4b85668b 100644 --- a/assets/js/99f83bea.e53f7fb4.js +++ b/assets/js/99f83bea.e654339e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4682],{1079:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const i={},o="createNumber",c={id:"api/numbers/create",title:"createNumber",description:"Creates a new Number. The Gateway must exist before creating the Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/create.md",sourceDirName:"api/numbers",slug:"/api/numbers/create",permalink:"/docs/1.x.x/api/numbers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"},next:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"}},a={},d=[];function l(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"createnumber",children:"createNumber"}),"\n",(0,r.jsxs)(t.p,{children:["Creates a new Number. The Gateway must exist before creating the Number.\nOtherwise, this method responds with a ",(0,r.jsx)(t.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/numbers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Number",\n\t"metadata": {\n\t\t"gwRef": "gweef506",\n\t\t"geoInfo": {\n\t\t\t"city": "City, State",\n\t\t\t"country": "Country",\n\t\t\t"countryISOCode": "US"\n\t\t}\n\t},\n\t"spec": {\n\t\t"location": {\n\t\t\t"telUrl": "tel:0000000000",\n\t\t\t"aorLink": "sip:1001@sip.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dd50baa4"\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4682],{8510:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=n(4848),s=n(8453);const i={},o="createNumber",c={id:"api/numbers/create",title:"createNumber",description:"Creates a new Number. The Gateway must exist before creating the Number.",source:"@site/versioned_docs/version-1.x.x/api/numbers/create.md",sourceDirName:"api/numbers",slug:"/api/numbers/create",permalink:"/docs/1.x.x/api/numbers/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listEndpoints",permalink:"/docs/1.x.x/api/location/list"},next:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"}},a={},d=[];function l(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"createnumber",children:"createNumber"}),"\n",(0,r.jsxs)(t.p,{children:["Creates a new Number. The Gateway must exist before creating the Number.\nOtherwise, this method responds with a ",(0,r.jsx)(t.code,{children:"UNFULFILLED_DEPENDENCY_RESPONSE"}),"."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"POST"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(t.p,{children:["A file containing a ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/configuration/numbers",children:"Number"})," resource in ",(0,r.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method creates a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'POST /api/{apiversion}/numbers\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Number",\n\t"metadata": {\n\t\t"gwRef": "gweef506",\n\t\t"geoInfo": {\n\t\t\t"city": "City, State",\n\t\t\t"country": "Country",\n\t\t\t"countryISOCode": "US"\n\t\t}\n\t},\n\t"spec": {\n\t\t"location": {\n\t\t\t"telUrl": "tel:0000000000",\n\t\t\t"aorLink": "sip:1001@sip.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dd50baa4"\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a4dfeaa.a4107647.js b/assets/js/9a4dfeaa.5fee3fa1.js similarity index 98% rename from assets/js/9a4dfeaa.a4107647.js rename to assets/js/9a4dfeaa.5fee3fa1.js index faebf6ff0..f76026514 100644 --- a/assets/js/9a4dfeaa.a4107647.js +++ b/assets/js/9a4dfeaa.5fee3fa1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7408],{8084:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var r=n(4848),s=n(8453);const i={},c="getPeer",d={id:"api/peers/get",title:"getPeer",description:"This method returns a Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/get.md",sourceDirName:"api/peers",slug:"/api/peers/get",permalink:"/docs/1.x.x/api/peers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"},next:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"}},o={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getpeer",children:"getPeer"}),"\n",(0,r.jsx)(t.p,{children:"This method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function c(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7408],{1267:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var r=n(4848),s=n(8453);const i={},c="getPeer",d={id:"api/peers/get",title:"getPeer",description:"This method returns a Peer resource.",source:"@site/versioned_docs/version-1.x.x/api/peers/get.md",sourceDirName:"api/peers",slug:"/api/peers/get",permalink:"/docs/1.x.x/api/peers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deletePeer",permalink:"/docs/1.x.x/api/peers/delete"},next:{title:"listPeers",permalink:"/docs/1.x.x/api/peers/list"}},o={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getpeer",children:"getPeer"}),"\n",(0,r.jsx)(t.p,{children:"This method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Peer resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function c(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a5a69d5.1e1e317b.js b/assets/js/9a5a69d5.3bd3131b.js similarity index 97% rename from assets/js/9a5a69d5.1e1e317b.js rename to assets/js/9a5a69d5.3bd3131b.js index a08073a9e..ccc4e6e31 100644 --- a/assets/js/9a5a69d5.1e1e317b.js +++ b/assets/js/9a5a69d5.3bd3131b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7337],{1979:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=n(4848),a=n(8453);const r={},o="updateGateways",i={id:"api/gateways/update",title:"updateGateways",description:"Updates an existing Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/update.md",sourceDirName:"api/gateways",slug:"/api/gateways/update",permalink:"/docs/1.x.x/api/gateways/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"},next:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"}},c={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"updategateways",children:"updateGateways"}),"\n",(0,s.jsx)(t.p,{children:"Updates an existing Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"PUT"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(t.p,{children:["A file containing a ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,s.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method updates a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'PUT /api/v1beta1/gateways/gw5c77t2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc.",\n\t\t"ref": "gw5c77t2"\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var s=n(6540);const a={},r=s.createContext(a);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7337],{9352:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=n(4848),a=n(8453);const r={},o="updateGateways",i={id:"api/gateways/update",title:"updateGateways",description:"Updates an existing Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/update.md",sourceDirName:"api/gateways",slug:"/api/gateways/update",permalink:"/docs/1.x.x/api/gateways/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"},next:{title:"addEndpoint",permalink:"/docs/1.x.x/api/location/create"}},c={},d=[];function p(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"updategateways",children:"updateGateways"}),"\n",(0,s.jsx)(t.p,{children:"Updates an existing Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"PUT"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(t.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(t.p,{children:["A file containing a ",(0,s.jsx)(t.a,{href:"/docs/1.x.x/configuration/gateways",children:"Gateway"})," resource in ",(0,s.jsx)(t.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method updates a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'PUT /api/v1beta1/gateways/gw5c77t2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Gateway",\n\t"metadata": {\n\t\t"name": "Provider Inc.",\n\t\t"ref": "gw5c77t2"\n\t},\n\t"spec": {\n\t\t"host": "sip.provider.net",\n\t\t"credentials": {\n\t\t\t"username": "youruser",\n\t\t\t"secret": "yoursecret"\n\t\t},\n\t\t"transport": "udp"\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var s=n(6540);const a={},r=s.createContext(a);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9a5b155b.ff5eacf3.js b/assets/js/9a5b155b.ff5eacf3.js new file mode 100644 index 000000000..1aadacc9f --- /dev/null +++ b/assets/js/9a5b155b.ff5eacf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9515],{2204:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>c,toc:()=>d});var i=r(4848),o=r(8453);const n={},s="Architecture",c={id:"overview/architecture",title:"Architecture",description:"Routr's architecture diagram",source:"@site/versioned_docs/version-2.0.0/overview/architecture.md",sourceDirName:"overview",slug:"/overview/architecture",permalink:"/docs/2.0.0/overview/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/overview/architecture.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/overview/introduction"},next:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"}},a={},d=[];function u(e){const t={a:"a",h1:"h1",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Routr's architecture diagram",src:r(5763).A+"",width:"1155",height:"715"})}),"\n",(0,i.jsx)(t.h1,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(t.p,{children:"Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled."}),"\n",(0,i.jsx)(t.h1,{id:"specification",children:"Specification"}),"\n",(0,i.jsx)(t.p,{children:"With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CORE.md",children:"Core Specification"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CONNECT.md",children:"Connect Specification"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing."}),"\n",(0,i.jsx)(t.p,{children:"The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more."}),"\n",(0,i.jsx)(t.p,{children:"Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},5763:(e,t,r)=>{r.d(t,{A:()=>i});const i=r.p+"assets/images/architecture_v2-8861306d8626ddea399b72e2aa55619e.png"},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>c});var i=r(6540);const o={},n=i.createContext(o);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9bac311e.547b4574.js b/assets/js/9bac311e.547b4574.js new file mode 100644 index 000000000..f2db60db0 --- /dev/null +++ b/assets/js/9bac311e.547b4574.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2172],{4533:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const i={},s="Concepts",a={id:"connect/concepts",title:"Concepts",description:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.",source:"@site/versioned_docs/version-2.0.0/connect/concepts.md",sourceDirName:"connect",slug:"/connect/concepts",permalink:"/docs/2.0.0/connect/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/concepts.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"},next:{title:"Docker installation",permalink:"/docs/2.0.0/connect/quick-start/docker"}},c={},l=[{value:"Agent-to-Agent",id:"agent-to-agent",level:2},{value:"Agent-to-PSTN",id:"agent-to-pstn",level:2},{value:"From-PSTN",id:"from-pstn",level:2},{value:"Peer-to-PSTN",id:"peer-to-pstn",level:2},{value:"Agent-to-Peer",id:"agent-to-peer",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,o.jsx)(n.p,{children:"The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation."}),"\n",(0,o.jsx)(n.p,{children:'The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.'}),"\n",(0,o.jsx)(n.p,{children:"The following routing types are supported:"}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-agent",children:"Agent-to-Agent"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"agent-to-agent"})," routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Agent\n ref: agent-01\n metadata:\n name: John Doe\n spec:\n username: "1001"\n domainRef: domain-01\n credentialsRef: credentials-01\n\n- apiVersion: v2beta1\n kind: Agent\n ref: agent-02\n metadata:\n name: Jane Doe\n spec:\n username: "1002"\n domainRef: domain-01\n credentialsRef: credentials-02\n'})}),"\n",(0,o.jsx)(n.p,{children:"With the configuration above, John and Jane can call each other using their usernames."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-pstn",children:"Agent-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["In the Connect Mode, the ",(0,o.jsx)(n.code,{children:"agent-to-pstn"})," routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"egressPolicies"})," section of the Domain resource handles the routing. The examples below show how these resources relate to each other."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Domain\n ref: domain-01\n metadata:\n name: Local Domain\n spec:\n accessControlListRef: acl-01\n context:\n domainUri: sip.local\n egressPolicies:\n - rule: ".*"\n numberRef: number-01\n'})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Number configuration"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n'})}),"\n",(0,o.jsxs)(n.p,{children:["With the previous configuration, any Agent in the Domain can call the PSTN using the Number ",(0,o.jsx)(n.code,{children:"(910)343-4434"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"from-pstn",children:"From-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"from-pstn"})," routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The ",(0,o.jsx)(n.code,{children:"location"})," section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'- apiVersion: v2beta1\n kind: Number\n ref: number-01\n metadata:\n name: "(910)343-4434"\n geoInfo:\n city: Durham, NC\n country: USA\n countryISOCode: US\n spec:\n trunkRef: trunk-01\n location:\n telUrl: tel:+19103434434\n aorLink: sip:john@sip.local\n'})}),"\n",(0,o.jsx)(n.p,{children:"You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr."}),"\n",(0,o.jsx)(n.h2,{id:"peer-to-pstn",children:"Peer-to-PSTN"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"peer-to-pstn"})," routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike ",(0,o.jsx)(n.code,{children:"agent-to-pstn"}),", this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the ",(0,o.jsx)(n.code,{children:"Trunking"})," resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table."]}),"\n",(0,o.jsx)(n.h2,{id:"agent-to-peer",children:"Agent-to-Peer"}),"\n",(0,o.jsxs)(n.p,{children:['This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain\'s boundaries, the Agent must have a valid JWT token in the ',(0,o.jsx)(n.code,{children:"X-Connect-Token"})," header. Incidentally, required claims in the JWT token include fields similar to the ",(0,o.jsx)(n.code,{children:"Agent"})," resource. Here is an example of the payload of a JWT token:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\n "ref": "agent-01",\n "domainRef": "domain-01",\n "aor": "sip:1001@sip.local",\n "aorLink": "sip:asterisk@default",\n "domain": "sip.local",\n "privacy": "NONE",\n "allowedMethods": ["INVITE", "REGISTER"]\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(6540);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9beb87c2.56f54a8f.js b/assets/js/9beb87c2.56f54a8f.js new file mode 100644 index 000000000..ca14f8974 --- /dev/null +++ b/assets/js/9beb87c2.56f54a8f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3539],{5851:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var o=t(4848),r=t(8453);const s={},c="Changelog",i={id:"changelog",title:"Changelog",description:"Coming soon.",source:"@site/docs/changelog.md",sourceDirName:".",slug:"/changelog",permalink:"/docs/2.11.5/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQs",permalink:"/docs/2.11.5/faqs"}},a={},u=[];function l(e){const n={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"changelog",children:"Changelog"}),"\n",(0,o.jsx)(n.p,{children:"Coming soon."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9beb87c2.5ebf1e1f.js b/assets/js/9beb87c2.5ebf1e1f.js deleted file mode 100644 index d2aa38acb..000000000 --- a/assets/js/9beb87c2.5ebf1e1f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3539],{4520:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>u});var o=t(4848),r=t(8453);const s={},c="Changelog",i={id:"changelog",title:"Changelog",description:"Coming soon.",source:"@site/docs/changelog.md",sourceDirName:".",slug:"/changelog",permalink:"/docs/2.0.0/changelog",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/changelog.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQs",permalink:"/docs/2.0.0/faqs"}},a={},u=[];function l(e){const n={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"changelog",children:"Changelog"}),"\n",(0,o.jsx)(n.p,{children:"Coming soon."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9d10a623.4e6d4ada.js b/assets/js/9d10a623.6537733f.js similarity index 97% rename from assets/js/9d10a623.4e6d4ada.js rename to assets/js/9d10a623.6537733f.js index c200bd6b5..1ef008637 100644 --- a/assets/js/9d10a623.4e6d4ada.js +++ b/assets/js/9d10a623.6537733f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9955],{4374:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var r=t(4848),s=t(8453);const o={},i="createDomain",a={id:"api/domains/create",title:"createDomain",description:"Creates a new Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/create.md",sourceDirName:"api/domains",slug:"/api/domains/create",permalink:"/docs/1.x.x/api/domains/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"},next:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"createdomain",children:"createDomain"}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/domains"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"POST"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method creates a Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/domains\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dm6c87r2"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(6540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9955],{4595:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var r=t(4848),s=t(8453);const o={},i="createDomain",a={id:"api/domains/create",title:"createDomain",description:"Creates a new Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/create.md",sourceDirName:"api/domains",slug:"/api/domains/create",permalink:"/docs/1.x.x/api/domains/create",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/create.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"updateConfiguration",permalink:"/docs/1.x.x/api/config/update"},next:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"}},c={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"createdomain",children:"createDomain"}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/domains"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"POST"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing a ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"If successful this method creates a Domain resource."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'POST /api/{apiversion}/domains\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 201 Created\n{\n\t"status": "201",\n\t"message": "Created",\n\t"data": "dm6c87r2"\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(6540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9fcefd11.cda8e294.js b/assets/js/9fcefd11.cda8e294.js new file mode 100644 index 000000000..b825b9cab --- /dev/null +++ b/assets/js/9fcefd11.cda8e294.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3102],{4833:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const s={},a="Quick Start",i={id:"development/quick-start",title:"Quick Start",description:"Before starting the development, you need to install the following tools:",source:"@site/docs/development/quick-start.md",sourceDirName:"development",slug:"/development/quick-start",permalink:"/docs/2.11.5/development/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/quick-start.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.11.5/development/introduction"},next:{title:"Development with Gitpod",permalink:"/docs/2.11.5/development/development-mode-with-gitpod"}},c={},l=[{value:"Clone and Build the Project",id:"clone-and-build-the-project",level:2},{value:"Run the Project",id:"run-the-project",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"quick-start",children:"Quick Start"}),"\n",(0,o.jsx)(n.p,{children:"Before starting the development, you need to install the following tools:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"NodeJS (>=16.14)"}),"\n",(0,o.jsx)(n.li,{children:"JDK (>=11)"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For NodeJS, we recommend using ",(0,o.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage your NodeJS versions."]}),"\n",(0,o.jsx)(n.h2,{id:"clone-and-build-the-project",children:"Clone and Build the Project"}),"\n",(0,o.jsx)(n.p,{children:"To get started, first, clone the repository:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fonoster/routr\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous command will create a directory called ",(0,o.jsx)(n.code,{children:"routr"})," with the project's source code."]}),"\n",(0,o.jsx)(n.p,{children:"Next, set the JAVA_HOME environment variable to the location of your JDK installation:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export JAVA_HOME=/path/to/jdk\n"})}),"\n",(0,o.jsx)(n.p,{children:"Finally, build the project:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd routr\nnpm run make\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors."}),"\n",(0,o.jsx)(n.h2,{id:"run-the-project",children:"Run the Project"}),"\n",(0,o.jsx)(n.p,{children:"To run all the components, you can use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry."}),"\n",(0,o.jsx)(n.p,{children:"As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart."}),"\n",(0,o.jsx)(n.p,{children:"You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:"}),"\n",(0,o.jsx)(n.p,{children:"In one terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:edgeport\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"> start:edgeport\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh\n\n2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0\n2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]\n2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]\n2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz\n"})}),"\n",(0,o.jsx)(n.p,{children:"In a separate terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:location\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'> start:location\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner\n\n[nodemon] 2.0.20\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching path(s): mods/**/*\n[nodemon] watching extensions: ts\n[nodemon] starting `ts-node mods/location/src/runner.ts`\n2023-09-05 12:41:38.735 [info]: (location) using memory as cache provider {}\n2023-09-05 12:41:38.739 [info]: (common) starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Please see the ",(0,o.jsx)(n.code,{children:"scripts"})," section of ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/package.json",children:"package.json"})," for a complete list of available commands."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9fcefd11.f0fb126c.js b/assets/js/9fcefd11.f0fb126c.js deleted file mode 100644 index 5ae2a050b..000000000 --- a/assets/js/9fcefd11.f0fb126c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3102],{4730:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const s={},a="Quick Start",i={id:"development/quick-start",title:"Quick Start",description:"Before starting the development, you need to install the following tools:",source:"@site/docs/development/quick-start.md",sourceDirName:"development",slug:"/development/quick-start",permalink:"/docs/2.0.0/development/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/quick-start.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/development/introduction"},next:{title:"Development with Gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod"}},c={},l=[{value:"Clone and Build the Project",id:"clone-and-build-the-project",level:2},{value:"Run the Project",id:"run-the-project",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"quick-start",children:"Quick Start"}),"\n",(0,o.jsx)(n.p,{children:"Before starting the development, you need to install the following tools:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"NodeJS (>=16.14)"}),"\n",(0,o.jsx)(n.li,{children:"JDK (>=11)"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For NodeJS, we recommend using ",(0,o.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," to manage your NodeJS versions."]}),"\n",(0,o.jsx)(n.h2,{id:"clone-and-build-the-project",children:"Clone and Build the Project"}),"\n",(0,o.jsx)(n.p,{children:"To get started, first, clone the repository:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fonoster/routr\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous command will create a directory called ",(0,o.jsx)(n.code,{children:"routr"})," with the project's source code."]}),"\n",(0,o.jsx)(n.p,{children:"Next, set the JAVA_HOME environment variable to the location of your JDK installation:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export JAVA_HOME=/path/to/jdk\n"})}),"\n",(0,o.jsx)(n.p,{children:"Finally, build the project:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd routr\nnpm run make\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors."}),"\n",(0,o.jsx)(n.h2,{id:"run-the-project",children:"Run the Project"}),"\n",(0,o.jsx)(n.p,{children:"To run all the components, you can use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start\n"})}),"\n",(0,o.jsx)(n.p,{children:"The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry."}),"\n",(0,o.jsx)(n.p,{children:"As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart."}),"\n",(0,o.jsx)(n.p,{children:"You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:"}),"\n",(0,o.jsx)(n.p,{children:"In one terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:edgeport\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"> start:edgeport\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh\n\n2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0\n2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]\n2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]\n2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz\n"})}),"\n",(0,o.jsx)(n.p,{children:"In a separate terminal:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm run start:location\n"})}),"\n",(0,o.jsx)(n.p,{children:"Example output:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'> start:location\n> cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner\n\n[nodemon] 2.0.20\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching path(s): mods/**/*\n[nodemon] watching extensions: ts\n[nodemon] starting `ts-node mods/location/src/runner.ts`\n2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}\n2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}\n2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Please see the ",(0,o.jsx)(n.code,{children:"scripts"})," section of ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/package.json",children:"package.json"})," for a complete list of available commands."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a0c4fcbf.d6c25c30.js b/assets/js/a0c4fcbf.d6c25c30.js new file mode 100644 index 000000000..4aa5a79d9 --- /dev/null +++ b/assets/js/a0c4fcbf.d6c25c30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[468],{1431:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var r=o(4848),i=o(8453);const n={id:"introduction",sidebar_label:"Introduction",hide_title:!0},s=void 0,a={id:"overview/introduction",title:"introduction",description:"Community banner",source:"@site/versioned_docs/version-2.0.0/overview/introduction.md",sourceDirName:"overview",slug:"/overview/introduction",permalink:"/docs/2.0.0/overview/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/overview/introduction.md",tags:[],version:"2.0.0",frontMatter:{id:"introduction",sidebar_label:"Introduction",hide_title:!0},sidebar:"tutorialSidebar",next:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"}},c={},d=[{value:"Welcome",id:"welcome",level:2},{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Why Routr?",id:"why-routr",level:2},{value:"Who is Routr for?",id:"who-is-routr-for",level:2},{value:"What is the difference between Routr and other SIP servers?",id:"what-is-the-difference-between-routr-and-other-sip-servers",level:2}];function u(e){const t={h2:"h2",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("br",{}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Community banner",src:o(496).A+"",width:"1600",height:"400"})}),"\n",(0,r.jsx)(t.h2,{id:"welcome",children:"Welcome"}),"\n",(0,r.jsx)(t.p,{children:"On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,r.jsx)(t.h2,{id:"why-routr",children:"Why Routr?"}),"\n",(0,r.jsx)(t.p,{children:"At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr."}),"\n",(0,r.jsx)(t.p,{children:"We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow."}),"\n",(0,r.jsx)(t.h2,{id:"who-is-routr-for",children:"Who is Routr for?"}),"\n",(0,r.jsx)(t.p,{children:"Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community."}),"\n",(0,r.jsx)(t.h2,{id:"what-is-the-difference-between-routr-and-other-sip-servers",children:"What is the difference between Routr and other SIP servers?"}),"\n",(0,r.jsx)(t.p,{children:"Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze."}),"\n",(0,r.jsx)(t.p,{children:"We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality."})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},496:(e,t,o)=>{o.d(t,{A:()=>r});const r=o.p+"assets/images/community-8d918291304e0da9dc2ce1fa68832947.png"},8453:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var r=o(6540);const i={},n=r.createContext(i);function s(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a0c5838c.5b15e2b4.js b/assets/js/a0c5838c.5b15e2b4.js deleted file mode 100644 index 3c2eaacb3..000000000 --- a/assets/js/a0c5838c.5b15e2b4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3688],{7757:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a1c2ddfb.f648cfee.js b/assets/js/a1c2ddfb.f648cfee.js new file mode 100644 index 000000000..ee628df26 --- /dev/null +++ b/assets/js/a1c2ddfb.f648cfee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3094],{2986:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>c,metadata:()=>i,toc:()=>p});var n=t(4848),r=t(8453);const c={},s="Home or Office Setup",i={id:"connect/home-or-office-setup",title:"Home or Office Setup",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/connect/home-or-office-setup.md",sourceDirName:"connect",slug:"/connect/home-or-office-setup",permalink:"/docs/2.0.0/connect/home-or-office-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/home-or-office-setup.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"},next:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"}},u={},p=[];function d(e){const o={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"home-or-office-setup",children:"Home or Office Setup"}),"\n",(0,n.jsx)(o.p,{children:"Coming soon."})]})}function f(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>i});var n=t(6540);const r={},c=n.createContext(r);function s(e){const o=n.useContext(c);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(c.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a30498ab.812d55ec.js b/assets/js/a30498ab.d15d93a1.js similarity index 98% rename from assets/js/a30498ab.812d55ec.js rename to assets/js/a30498ab.d15d93a1.js index a85ced401..7e3e89bc5 100644 --- a/assets/js/a30498ab.812d55ec.js +++ b/assets/js/a30498ab.d15d93a1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3857],{4036:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=t(4848),r=t(8453);const i={},o="Agents",d={id:"configuration/agents",title:"Agents",description:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.",source:"@site/versioned_docs/version-1.x.x/configuration/agents.md",sourceDirName:"configuration",slug:"/configuration/agents",permalink:"/docs/1.x.x/configuration/agents",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/agents.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"},next:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"}},c={},a=[{value:"Agent Resource",id:"agent-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"agents",children:"Agents"}),"\n",(0,s.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.\nA Domain binds agents together. An Agent can belong to one or multiple Domains."}),"\n",(0,s.jsxs)(n.p,{children:["The Agents configuration can be provided using the file ",(0,s.jsx)(n.code,{children:"config/agents.yml"})," located at the root of your Routr installation."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"agent-resource",children:"Agent Resource"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Required"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"apiVersion"}),(0,s.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"kind"}),(0,s.jsx)(n.td,{children:"Defines the type of resource"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"metadata.name"}),(0,s.jsx)(n.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.privacy"}),(0,s.jsxs)(n.td,{children:["If set to ",(0,s.jsx)(n.code,{children:"Private"})," the server removes identifiable information for the requests. Defaults to ",(0,s.jsx)(n.code,{children:"None"})]}),(0,s.jsx)(n.td,{children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.username"}),(0,s.jsx)(n.td,{children:"Agent's credential username"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.secret"}),(0,s.jsx)(n.td,{children:"Agent's credential secret"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.domains[*]"}),(0,s.jsx)(n.td,{children:"Context/s in which this Agent is allowed to communicate. FQDN is recommended"}),(0,s.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3857],{4193:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=t(4848),r=t(8453);const i={},o="Agents",d={id:"configuration/agents",title:"Agents",description:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.",source:"@site/versioned_docs/version-1.x.x/configuration/agents.md",sourceDirName:"configuration",slug:"/configuration/agents",permalink:"/docs/1.x.x/configuration/agents",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/agents.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"},next:{title:"Domains",permalink:"/docs/1.x.x/configuration/domains"}},c={},a=[{value:"Agent Resource",id:"agent-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"agents",children:"Agents"}),"\n",(0,s.jsx)(n.p,{children:"Agents represent SIP endpoints such as softphones, IP phones, or paging speakers.\nA Domain binds agents together. An Agent can belong to one or multiple Domains."}),"\n",(0,s.jsxs)(n.p,{children:["The Agents configuration can be provided using the file ",(0,s.jsx)(n.code,{children:"config/agents.yml"})," located at the root of your Routr installation."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"agent-resource",children:"Agent Resource"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Required"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"apiVersion"}),(0,s.jsx)(n.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"kind"}),(0,s.jsx)(n.td,{children:"Defines the type of resource"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"metadata.name"}),(0,s.jsx)(n.td,{children:"Friendly name for the SIP device"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.privacy"}),(0,s.jsxs)(n.td,{children:["If set to ",(0,s.jsx)(n.code,{children:"Private"})," the server removes identifiable information for the requests. Defaults to ",(0,s.jsx)(n.code,{children:"None"})]}),(0,s.jsx)(n.td,{children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.username"}),(0,s.jsx)(n.td,{children:"Agent's credential username"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.credentials.secret"}),(0,s.jsx)(n.td,{children:"Agent's credential secret"}),(0,s.jsx)(n.td,{children:"Yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"spec.domains[*]"}),(0,s.jsx)(n.td,{children:"Context/s in which this Agent is allowed to communicate. FQDN is recommended"}),(0,s.jsx)(n.td,{children:"Yes"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a3b8e457.bd46d496.js b/assets/js/a3b8e457.bd46d496.js new file mode 100644 index 000000000..944d56047 --- /dev/null +++ b/assets/js/a3b8e457.bd46d496.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8998],{3390:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=n(4848),r=n(8453);const s={},i="Orchestration with Kubernetes",c={id:"development/orchestration-with-kubernetes",title:"Orchestration with Kubernetes",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/development/orchestration-with-kubernetes.md",sourceDirName:"development",slug:"/development/orchestration-with-kubernetes",permalink:"/docs/2.0.0/development/orchestration-with-kubernetes",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/orchestration-with-kubernetes.md",tags:[],version:"2.0.0",frontMatter:{}},u={},d=[];function a(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"orchestration-with-kubernetes",children:"Orchestration with Kubernetes"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a40a3312.2b4c3cf4.js b/assets/js/a40a3312.1907314f.js similarity index 98% rename from assets/js/a40a3312.2b4c3cf4.js rename to assets/js/a40a3312.1907314f.js index 7d6ddc11c..09c24df4b 100644 --- a/assets/js/a40a3312.2b4c3cf4.js +++ b/assets/js/a40a3312.1907314f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9922],{2738:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var r=o(4848),n=o(8453);const s={},i="FAQ",d={id:"introduction/faq",title:"FAQ",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/faq.md",sourceDirName:"introduction",slug:"/introduction/faq",permalink:"/docs/1.x.x/introduction/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/faq.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"},next:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"}},a={},u=[{value:"What is Routr?",id:"what-is-routr",level:3},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:3},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:3},{value:"What language is used to develop Routr?",id:"what-language-is-used-to-develop-routr",level:3},{value:"What license does Routr uses?",id:"what-license-does-routr-uses",level:3}];function c(e){const t={a:"a",h1:"h1",h3:"h3",p:"p",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"faq",children:"FAQ"}),"\n",(0,r.jsx)(t.h3,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/overview",children:"overview"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,r.jsx)(t.p,{children:"Routr server runs standalone and has no external dependencies. However,\nyou might need to use Redis depending in the complexity of your requirements."}),"\n",(0,r.jsx)(t.h3,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,r.jsxs)(t.p,{children:["See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/comparison",children:"comparison page"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-language-is-used-to-develop-routr",children:"What language is used to develop Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Most components in Routr are written in Javascript(with Oracle's GraalJS)."}),"\n",(0,r.jsx)(t.h3,{id:"what-license-does-routr-uses",children:"What license does Routr uses?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is released under the ",(0,r.jsx)(t.a,{href:"https://opensource.org/licenses/MIT",children:"MIT"})," license."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>d});var r=o(6540);const n={},s=r.createContext(n);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9922],{5891:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var r=o(4848),n=o(8453);const s={},i="FAQ",d={id:"introduction/faq",title:"FAQ",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/faq.md",sourceDirName:"introduction",slug:"/introduction/faq",permalink:"/docs/1.x.x/introduction/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/faq.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"},next:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"}},a={},u=[{value:"What is Routr?",id:"what-is-routr",level:3},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:3},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:3},{value:"What language is used to develop Routr?",id:"what-language-is-used-to-develop-routr",level:3},{value:"What license does Routr uses?",id:"what-license-does-routr-uses",level:3}];function c(e){const t={a:"a",h1:"h1",h3:"h3",p:"p",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"faq",children:"FAQ"}),"\n",(0,r.jsx)(t.h3,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/overview",children:"overview"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,r.jsx)(t.p,{children:"Routr server runs standalone and has no external dependencies. However,\nyou might need to use Redis depending in the complexity of your requirements."}),"\n",(0,r.jsx)(t.h3,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,r.jsxs)(t.p,{children:["See the ",(0,r.jsx)(t.a,{href:"/docs/1.x.x/introduction/comparison",children:"comparison page"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-language-is-used-to-develop-routr",children:"What language is used to develop Routr?"}),"\n",(0,r.jsx)(t.p,{children:"Most components in Routr are written in Javascript(with Oracle's GraalJS)."}),"\n",(0,r.jsx)(t.h3,{id:"what-license-does-routr-uses",children:"What license does Routr uses?"}),"\n",(0,r.jsxs)(t.p,{children:["Routr is released under the ",(0,r.jsx)(t.a,{href:"https://opensource.org/licenses/MIT",children:"MIT"})," license."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>i,x:()=>d});var r=o(6540);const n={},s=r.createContext(n);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a4cb0559.b622069b.js b/assets/js/a4cb0559.3496d38b.js similarity index 98% rename from assets/js/a4cb0559.b622069b.js rename to assets/js/a4cb0559.3496d38b.js index 5783e9255..e7eee7e8c 100644 --- a/assets/js/a4cb0559.b622069b.js +++ b/assets/js/a4cb0559.3496d38b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9188],{8255:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var n=r(4848),i=r(8453);const o={},s="Overview",a={id:"introduction/overview",title:"Overview",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/overview.md",sourceDirName:"introduction",slug:"/introduction/overview",permalink:"/docs/1.x.x/introduction/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/1.x.x/welcome"},next:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"}},c={},l=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Features",id:"features",level:2},{value:"Components",id:"components",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Use cases",id:"use-cases",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,n.jsxs)(t.p,{children:["Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at ",(0,n.jsx)(t.a,{href:"https://twitter.com/fonoster",children:"@fonoster"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,n.jsx)(t.p,{children:"Routr's main features are:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Typical Sip Server functions; Proxy, Registrar, Location Service"}),"\n",(0,n.jsx)(t.li,{children:"Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List"}),"\n",(0,n.jsx)(t.li,{children:"Transport: TCP, UDP, TLS, WebSocket"}),"\n",(0,n.jsx)(t.li,{children:"Routr currently supports Redis, HTTP Requests, and YAML files as the data source"}),"\n",(0,n.jsx)(t.li,{children:"Server management and monitoring with the RESTful API, CLI, and Web Console"}),"\n",(0,n.jsx)(t.li,{children:"Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"components",children:"Components"}),"\n",(0,n.jsx)(t.p,{children:"The Routr ecosystem consists of three main components:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr",children:"Routr server"})," which is the main component of the ecosystem"]}),"\n",(0,n.jsxs)(t.li,{children:["The command-line interface, ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ctl",children:"rctl"}),", for remote management of the server"]}),"\n",(0,n.jsxs)(t.li,{children:["An optional ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web console"})," for easy management of the server"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"architecture",children:"Architecture"}),"\n",(0,n.jsx)(t.p,{children:"This diagram illustrates the architecture of Routr and some of its ecosystem components:"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("img",{src:"/img/architecture.png"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.p,{children:"At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software."}),"\n",(0,n.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,n.jsxs)(t.p,{children:["Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in ",(0,n.jsx)(t.a,{href:"https://www.docker.com/",children:"Docker"}),", and ",(0,n.jsx)(t.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>a});var n=r(6540);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9188],{3280:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var n=r(4848),i=r(8453);const o={},s="Overview",a={id:"introduction/overview",title:"Overview",description:"What is Routr?",source:"@site/versioned_docs/version-1.x.x/introduction/overview.md",sourceDirName:"introduction",slug:"/introduction/overview",permalink:"/docs/1.x.x/introduction/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/overview.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/1.x.x/welcome"},next:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"}},c={},l=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"Features",id:"features",level:2},{value:"Components",id:"components",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Use cases",id:"use-cases",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,n.jsxs)(t.p,{children:["Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at ",(0,n.jsx)(t.a,{href:"https://twitter.com/fonoster",children:"@fonoster"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"features",children:"Features"}),"\n",(0,n.jsx)(t.p,{children:"Routr's main features are:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Typical Sip Server functions; Proxy, Registrar, Location Service"}),"\n",(0,n.jsx)(t.li,{children:"Per node Multi-Tenancy/Multi-Domain with Domain level Access Control List"}),"\n",(0,n.jsx)(t.li,{children:"Transport: TCP, UDP, TLS, WebSocket"}),"\n",(0,n.jsx)(t.li,{children:"Routr currently supports Redis, HTTP Requests, and YAML files as the data source"}),"\n",(0,n.jsx)(t.li,{children:"Server management and monitoring with the RESTful API, CLI, and Web Console"}),"\n",(0,n.jsx)(t.li,{children:"Configurable routing strategies; Intra-Domain, Domain Ingress, Domain Egress and Peer Egress"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"components",children:"Components"}),"\n",(0,n.jsx)(t.p,{children:"The Routr ecosystem consists of three main components:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr",children:"Routr server"})," which is the main component of the ecosystem"]}),"\n",(0,n.jsxs)(t.li,{children:["The command-line interface, ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ctl",children:"rctl"}),", for remote management of the server"]}),"\n",(0,n.jsxs)(t.li,{children:["An optional ",(0,n.jsx)(t.a,{href:"https://github.com/fonoster/routr-ui",children:"web console"})," for easy management of the server"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"architecture",children:"Architecture"}),"\n",(0,n.jsx)(t.p,{children:"This diagram illustrates the architecture of Routr and some of its ecosystem components:"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("img",{src:"/img/architecture.png"}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)("br",{}),"\n",(0,n.jsx)(t.p,{children:"At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software."}),"\n",(0,n.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,n.jsxs)(t.p,{children:["Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in ",(0,n.jsx)(t.a,{href:"https://www.docker.com/",children:"Docker"}),", and ",(0,n.jsx)(t.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI."})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>a});var n=r(6540);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a552b93b.6326ae55.js b/assets/js/a552b93b.8cf8b24c.js similarity index 98% rename from assets/js/a552b93b.6326ae55.js rename to assets/js/a552b93b.8cf8b24c.js index 5f078d831..e256ff3fa 100644 --- a/assets/js/a552b93b.6326ae55.js +++ b/assets/js/a552b93b.8cf8b24c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5872],{1013:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var s=r(4848),n=r(8453);const i={},d="deletePeer",l={id:"api/peers/delete",title:"deletePeer",description:"Removes a Peer resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/peers/delete.md",sourceDirName:"api/peers",slug:"/api/peers/delete",permalink:"/docs/1.x.x/api/peers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"},next:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"}},c={},o=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletepeer",children:"deletePeer"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Peer resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Peer resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var s=r(6540);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5872],{1472:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var s=r(4848),n=r(8453);const i={},d="deletePeer",l={id:"api/peers/delete",title:"deletePeer",description:"Removes a Peer resource from a persistent database.",source:"@site/versioned_docs/version-1.x.x/api/peers/delete.md",sourceDirName:"api/peers",slug:"/api/peers/delete",permalink:"/docs/1.x.x/api/peers/delete",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/delete.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"createPeer",permalink:"/docs/1.x.x/api/peers/create"},next:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"}},c={},o=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"deletepeer",children:"deletePeer"}),"\n",(0,s.jsx)(t.p,{children:"Removes a Peer resource from a persistent database."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/peers/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"DELETE"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method removes a Peer resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'DELETE /api/v1beta1/peers/pr2c77f4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var s=r(6540);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0abf3980.d6c002e8.js b/assets/js/a7456010.45ffb14c.js similarity index 65% rename from assets/js/0abf3980.d6c002e8.js rename to assets/js/a7456010.45ffb14c.js index ae6432067..cecc2762c 100644 --- a/assets/js/0abf3980.d6c002e8.js +++ b/assets/js/a7456010.45ffb14c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3690],{4061:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1235],{8552:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7c6e145.7ca9bc38.js b/assets/js/a7c6e145.7ca9bc38.js new file mode 100644 index 000000000..02237754e --- /dev/null +++ b/assets/js/a7c6e145.7ca9bc38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1079],{1429:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(4848),i=t(8453);const l={},r="Extending the Command-Line Tool",s={id:"development/extending-the-ctl",title:"Extending the Command-Line Tool",description:"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.",source:"@site/docs/development/extending-the-ctl.md",sourceDirName:"development",slug:"/development/extending-the-ctl",permalink:"/docs/2.11.5/development/extending-the-ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/extending-the-ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Custom data with the APIServer",permalink:"/docs/2.11.5/development/custom-data-with-the-apiserver"},next:{title:"Introduction",permalink:"/docs/2.11.5/connect/introduction"}},a={},c=[{value:"Installing the Command-Line Tool",id:"installing-the-command-line-tool",level:2},{value:"Using the Command-Line Tool",id:"using-the-command-line-tool",level:2},{value:"Creating a plugin",id:"creating-a-plugin",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"extending-the-command-line-tool",children:"Extending the Command-Line Tool"}),"\n",(0,o.jsxs)(n.p,{children:["Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with ",(0,o.jsx)(n.a,{href:"https://oclif.io/",children:"Oclif"}),", a framework for creating command-line tools in Node.js."]}),"\n",(0,o.jsx)(n.p,{children:"You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins."}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-command-line-tool",children:"Installing the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL comes as an npm package. To install it, you run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.h2,{id:"using-the-command-line-tool",children:"Using the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands."}),"\n",(0,o.jsxs)(n.p,{children:["Most commands adopt the ",(0,o.jsx)(n.code,{children:"{substantive} {verb}"})," pattern. For instance, ",(0,o.jsx)(n.code,{children:"rctl agents get"})," retrieves a list of agents."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins."}),"\n",(0,o.jsx)(n.h2,{id:"creating-a-plugin",children:"Creating a plugin"}),"\n",(0,o.jsx)(n.p,{children:"To create a new plugin, you start by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npx oclif generate mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The system will prompt you for some information about your plugin. For this example, let's choose ",(0,o.jsx)(n.code,{children:"mycommand"})," as the name."]}),"\n",(0,o.jsx)(n.p,{children:"In your mycommand directory, you'll find the following structure:"}),"\n",(0,o.jsx)(n.p,{children:"[Directory structure omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["Looking at the ",(0,o.jsx)(n.code,{children:"src/commands/hello/index.ts"})," file, you see the following code:"]}),"\n",(0,o.jsx)(n.p,{children:"[Sample TypeScript code omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["This code defines a simple command that takes two arguments, ",(0,o.jsx)(n.code,{children:"person"})," and ",(0,o.jsx)(n.code,{children:"from,"})," and then prints a greeting to the console."]}),"\n",(0,o.jsx)(n.p,{children:"After you update your plugin, you install and test it by running the following command from within the plugin directory:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins link . # Installing in development mode\n"})}),"\n",(0,o.jsx)(n.p,{children:"For production mode installation of your plugin, you use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install .\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you have published your plugin to ",(0,o.jsx)(n.a,{href:"https://npmjs.com",children:"NPM"}),", you can install it with this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["To see your new command in action, you run the command with the ",(0,o.jsx)(n.code,{children:"--help"})," flag and follow the instructions."]}),"\n",(0,o.jsxs)(n.p,{children:["With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the ",(0,o.jsx)(n.a,{href:"/docs/2.11.5/connect/nodesdk/overview",children:"Node.js SDK"})," to interact with the server."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var o=t(6540);const i={},l=o.createContext(i);function r(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a7c6e145.b8df2a42.js b/assets/js/a7c6e145.b8df2a42.js deleted file mode 100644 index 03f65bdf2..000000000 --- a/assets/js/a7c6e145.b8df2a42.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1079],{5138:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var o=t(4848),i=t(8453);const l={},r="Extending the Command-Line Tool",s={id:"development/extending-the-ctl",title:"Extending the Command-Line Tool",description:"Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.",source:"@site/docs/development/extending-the-ctl.md",sourceDirName:"development",slug:"/development/extending-the-ctl",permalink:"/docs/2.0.0/development/extending-the-ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/extending-the-ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Custom data with the APIServer",permalink:"/docs/2.0.0/development/custom-data-with-the-apiserver"},next:{title:"Introduction",permalink:"/docs/2.0.0/connect/introduction"}},a={},c=[{value:"Installing the Command-Line Tool",id:"installing-the-command-line-tool",level:2},{value:"Using the Command-Line Tool",id:"using-the-command-line-tool",level:2},{value:"Creating a plugin",id:"creating-a-plugin",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"extending-the-command-line-tool",children:"Extending the Command-Line Tool"}),"\n",(0,o.jsxs)(n.p,{children:["Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with ",(0,o.jsx)(n.a,{href:"https://oclif.io/",children:"Oclif"}),", a framework for creating command-line tools in Node.js."]}),"\n",(0,o.jsx)(n.p,{children:"You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins."}),"\n",(0,o.jsx)(n.h2,{id:"installing-the-command-line-tool",children:"Installing the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL comes as an npm package. To install it, you run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.h2,{id:"using-the-command-line-tool",children:"Using the Command-Line Tool"}),"\n",(0,o.jsx)(n.p,{children:"The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands."}),"\n",(0,o.jsxs)(n.p,{children:["Most commands adopt the ",(0,o.jsx)(n.code,{children:"{substantive} {verb}"})," pattern. For instance, ",(0,o.jsx)(n.code,{children:"rctl agents get"})," retrieves a list of agents."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins."}),"\n",(0,o.jsx)(n.h2,{id:"creating-a-plugin",children:"Creating a plugin"}),"\n",(0,o.jsx)(n.p,{children:"To create a new plugin, you start by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npx oclif generate mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The system will prompt you for some information about your plugin. For this example, let's choose ",(0,o.jsx)(n.code,{children:"mycommand"})," as the name."]}),"\n",(0,o.jsx)(n.p,{children:"In your mycommand directory, you'll find the following structure:"}),"\n",(0,o.jsx)(n.p,{children:"[Directory structure omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["Looking at the ",(0,o.jsx)(n.code,{children:"src/commands/hello/index.ts"})," file, you see the following code:"]}),"\n",(0,o.jsx)(n.p,{children:"[Sample TypeScript code omitted for brevity]"}),"\n",(0,o.jsxs)(n.p,{children:["This code defines a simple command that takes two arguments, ",(0,o.jsx)(n.code,{children:"person"})," and ",(0,o.jsx)(n.code,{children:"from,"})," and then prints a greeting to the console."]}),"\n",(0,o.jsx)(n.p,{children:"After you update your plugin, you install and test it by running the following command from within the plugin directory:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins link . # Installing in development mode\n"})}),"\n",(0,o.jsx)(n.p,{children:"For production mode installation of your plugin, you use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install .\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you have published your plugin to ",(0,o.jsx)(n.a,{href:"https://npmjs.com",children:"NPM"}),", you can install it with this command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl plugins install mycommand\n"})}),"\n",(0,o.jsxs)(n.p,{children:["To see your new command in action, you run the command with the ",(0,o.jsx)(n.code,{children:"--help"})," flag and follow the instructions."]}),"\n",(0,o.jsxs)(n.p,{children:["With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the ",(0,o.jsx)(n.a,{href:"/docs/2.0.0/connect/nodesdk/overview",children:"Node.js SDK"})," to interact with the server."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var o=t(6540);const i={},l=o.createContext(i);function r(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a90f077e.5c189ee4.js b/assets/js/a90f077e.5c189ee4.js new file mode 100644 index 000000000..c88f351a9 --- /dev/null +++ b/assets/js/a90f077e.5c189ee4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9572],{8209:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>l,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var o=e(4848),i=e(8453);const a={},c="Building a Chat Application",r={id:"development/building-a-chat-application",title:"Building a Chat Application",description:"Comin soon.",source:"@site/versioned_docs/version-2.0.0/development/building-a-chat-application.md",sourceDirName:"development",slug:"/development/building-a-chat-application",permalink:"/docs/2.0.0/development/building-a-chat-application",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/building-a-chat-application.md",tags:[],version:"2.0.0",frontMatter:{}},s={},p=[];function d(t){const n={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"building-a-chat-application",children:"Building a Chat Application"}),"\n",(0,o.jsx)(n.p,{children:"Comin soon."})]})}function l(t={}){const{wrapper:n}={...(0,i.R)(),...t.components};return n?(0,o.jsx)(n,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>c,x:()=>r});var o=e(6540);const i={},a=o.createContext(i);function c(t){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function r(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:c(t.components),o.createElement(a.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.75b37e51.js b/assets/js/a94703ab.75b37e51.js deleted file mode 100644 index 775a27420..000000000 --- a/assets/js/a94703ab.75b37e51.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(8215),i=n(9024),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),j=n(4581),f=n(6342),_=n(3465);function v(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(v,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:j}}}=(0,f.p)(),_=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),v=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!v&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:v,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&j&&k(!0)}),[h,N,c,k,j]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":v}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,"aria-expanded":h?!g:void 0,href:h?_??"#":_,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.Mj)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,f.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(_.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(2069);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,j.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(v,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(8215),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.98a9923c.js b/assets/js/a94703ab.98a9923c.js new file mode 100644 index 000000000..6b1618054 --- /dev/null +++ b/assets/js/a94703ab.98a9923c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(8215),i=n(9024),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(2069);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(8215),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a9d63626.ef9d935a.js b/assets/js/a9d63626.8acbc963.js similarity index 99% rename from assets/js/a9d63626.ef9d935a.js rename to assets/js/a9d63626.8acbc963.js index ae0d2185c..af41f89eb 100644 --- a/assets/js/a9d63626.ef9d935a.js +++ b/assets/js/a9d63626.8acbc963.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7372],{1068:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(4848),s=n(8453);const r={},o="Securing the signaling path",c={id:"guides/securing-the-signaling-path",title:"Securing the signaling path",description:"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.",source:"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",sourceDirName:"guides",slug:"/guides/securing-the-signaling-path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"},next:{title:"overview",permalink:"/docs/1.x.x/api/overview"}},a={},l=[{value:"Creating a Java Keystore(.JKS) certificate",id:"creating-a-java-keystorejks-certificate",level:2},{value:"Creating a self-signed Certificate",id:"creating-a-self-signed-certificate",level:3},{value:"Creating a Certificate using Let's Encrypt",id:"creating-a-certificate-using-lets-encrypt",level:3},{value:"Installing the Certificate in Routr",id:"installing-the-certificate-in-routr",level:2},{value:"Setting up the Sip Phones",id:"setting-up-the-sip-phones",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"securing-the-signaling-path",children:"Securing the signaling path"}),"\n",(0,i.jsxs)(t.p,{children:["Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that ",(0,i.jsx)(t.em,{children:"Routr"})," only secures the signaling and that the endpoints are ultimately responsible for securing the media."]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path"}),"\n"]}),"\n",(0,i.jsx)("img",{src:"/img/secure_signaling.png",width:"600",vspace:"30"}),"\n",(0,i.jsx)(t.h2,{id:"creating-a-java-keystorejks-certificate",children:"Creating a Java Keystore(.JKS) certificate"}),"\n",(0,i.jsxs)(t.p,{children:["We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt service"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-self-signed-certificate",children:"Creating a self-signed Certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into ",(0,i.jsx)(t.code,{children:"etc/certs"})," in your Routr installation and run the following script:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n -noprompt \\\n -alias routr \\\n -keystore domains-cert.jks \\\n -storepass changeit \\\n -keypass changeit \\\n -validity 365 \\\n -keysize 2048 \\\n -dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n -ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,i.jsx)(t.p,{children:"Remember to adjust the values to match your project's information."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"WSS"})," does not work with a self-signed certificate. However, you can add a security exception by using ",(0,i.jsx)(t.code,{children:"https"})," instead of ",(0,i.jsx)(t.code,{children:"wss"})," in your browser's search bar and then accepting the security certificate."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-certificate-using-lets-encrypt",children:"Creating a Certificate using Let's Encrypt"}),"\n",(0,i.jsxs)(t.p,{children:["The recommended way to create a valid certificate for Routr is using the free service ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org",children:"Let's Encrypt"}),". Please go to ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"https://letsencrypt.org/"})," for details on how to install the required tooling. To generate the certificate, use the following steps:"]}),"\n",(0,i.jsx)(t.p,{children:"\u278a Create keys"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com\n"})}),"\n",(0,i.jsx)(t.p,{children:"Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com)."}),"\n",(0,i.jsx)(t.p,{children:"\u278b Create a PKCS12 file containing full chain and private key"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.p,{children:"Please make a note of the password since you need it in the next step."}),"\n",(0,i.jsx)(t.p,{children:"\u278c Convert PKCS12 to Keystore"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.h2,{id:"installing-the-certificate-in-routr",children:"Installing the Certificate in Routr"}),"\n",(0,i.jsxs)(t.p,{children:["To enable secure signaling in Routr, copy your certificate in ",(0,i.jsx)(t.code,{children:"etc/certs"})," and edit the file ",(0,i.jsx)(t.code,{children:"config/config.yml"})," to look like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yml",children:"apiVersion: v1beta1\nmetadata:\n userAgent: Routr v1.0\nspec:\n securityContext:\n keyStore: etc/certs/domains-cert.jks\n trustStore: etc/certs/domains-cert.jks\n keyStorePassword: 'changeit'\n trustStorePassword: 'changeit'\n keyStoreType: 'jks'\n debugging: true # Enabled debug only for testing\n transport:\n - protocol: tls\n port: 5061\n...\n"})}),"\n",(0,i.jsxs)(t.p,{children:["If you set the property ",(0,i.jsx)(t.code,{children:"spec.securityContext.debugging"})," to ",(0,i.jsx)(t.code,{children:"true"}),", you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"openssl s_client -host 192.168.1.2 -port 5061 # Remember to use Routr's IP\n"})}),"\n",(0,i.jsx)(t.h2,{id:"setting-up-the-sip-phones",children:"Setting up the Sip Phones"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["For this guide, we are using ",(0,i.jsx)(t.code,{children:"Blink Pro"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Go to the account that you want to secure, select ",(0,i.jsx)(t.code,{children:"Advanced -> Sip Signaling"})," and change the parameter ",(0,i.jsx)(t.code,{children:"Primary Proxy"})," to ",(0,i.jsx)(t.code,{children:"${proxyHost}:${proxyPort};transport=tls"}),". See the example in the following image:"]}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_config.png",width:"600"}),"\n",(0,i.jsx)(t.p,{children:"If everything went well, you should see a green padlock like the one in the image below:"}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_secured.png",width:"400"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7372],{5469:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(4848),s=n(8453);const r={},o="Securing the signaling path",c={id:"guides/securing-the-signaling-path",title:"Securing the signaling path",description:"Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.",source:"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",sourceDirName:"guides",slug:"/guides/securing-the-signaling-path",permalink:"/docs/1.x.x/guides/securing-the-signaling-path",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Running with Docker",permalink:"/docs/1.x.x/guides/running-with-docker-or-compose"},next:{title:"overview",permalink:"/docs/1.x.x/api/overview"}},a={},l=[{value:"Creating a Java Keystore(.JKS) certificate",id:"creating-a-java-keystorejks-certificate",level:2},{value:"Creating a self-signed Certificate",id:"creating-a-self-signed-certificate",level:3},{value:"Creating a Certificate using Let's Encrypt",id:"creating-a-certificate-using-lets-encrypt",level:3},{value:"Installing the Certificate in Routr",id:"installing-the-certificate-in-routr",level:2},{value:"Setting up the Sip Phones",id:"setting-up-the-sip-phones",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"securing-the-signaling-path",children:"Securing the signaling path"}),"\n",(0,i.jsxs)(t.p,{children:["Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that ",(0,i.jsx)(t.em,{children:"Routr"})," only secures the signaling and that the endpoints are ultimately responsible for securing the media."]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path"}),"\n"]}),"\n",(0,i.jsx)("img",{src:"/img/secure_signaling.png",width:"600",vspace:"30"}),"\n",(0,i.jsx)(t.h2,{id:"creating-a-java-keystorejks-certificate",children:"Creating a Java Keystore(.JKS) certificate"}),"\n",(0,i.jsxs)(t.p,{children:["We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt service"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-self-signed-certificate",children:"Creating a self-signed Certificate"}),"\n",(0,i.jsxs)(t.p,{children:["Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into ",(0,i.jsx)(t.code,{children:"etc/certs"})," in your Routr installation and run the following script:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n -noprompt \\\n -alias routr \\\n -keystore domains-cert.jks \\\n -storepass changeit \\\n -keypass changeit \\\n -validity 365 \\\n -keysize 2048 \\\n -dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n -ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,i.jsx)(t.p,{children:"Remember to adjust the values to match your project's information."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"WSS"})," does not work with a self-signed certificate. However, you can add a security exception by using ",(0,i.jsx)(t.code,{children:"https"})," instead of ",(0,i.jsx)(t.code,{children:"wss"})," in your browser's search bar and then accepting the security certificate."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"creating-a-certificate-using-lets-encrypt",children:"Creating a Certificate using Let's Encrypt"}),"\n",(0,i.jsxs)(t.p,{children:["The recommended way to create a valid certificate for Routr is using the free service ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org",children:"Let's Encrypt"}),". Please go to ",(0,i.jsx)(t.a,{href:"https://letsencrypt.org/",children:"https://letsencrypt.org/"})," for details on how to install the required tooling. To generate the certificate, use the following steps:"]}),"\n",(0,i.jsx)(t.p,{children:"\u278a Create keys"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com\n"})}),"\n",(0,i.jsx)(t.p,{children:"Change to the directory where we created the certificates(generally at /etc/letsencrypt/live/sip.ocean.com)."}),"\n",(0,i.jsx)(t.p,{children:"\u278b Create a PKCS12 file containing full chain and private key"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 -name domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.p,{children:"Please make a note of the password since you need it in the next step."}),"\n",(0,i.jsx)(t.p,{children:"\u278c Convert PKCS12 to Keystore"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks\n"})}),"\n",(0,i.jsx)(t.h2,{id:"installing-the-certificate-in-routr",children:"Installing the Certificate in Routr"}),"\n",(0,i.jsxs)(t.p,{children:["To enable secure signaling in Routr, copy your certificate in ",(0,i.jsx)(t.code,{children:"etc/certs"})," and edit the file ",(0,i.jsx)(t.code,{children:"config/config.yml"})," to look like this:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yml",children:"apiVersion: v1beta1\nmetadata:\n userAgent: Routr v1.0\nspec:\n securityContext:\n keyStore: etc/certs/domains-cert.jks\n trustStore: etc/certs/domains-cert.jks\n keyStorePassword: 'changeit'\n trustStorePassword: 'changeit'\n keyStoreType: 'jks'\n debugging: true # Enabled debug only for testing\n transport:\n - protocol: tls\n port: 5061\n...\n"})}),"\n",(0,i.jsxs)(t.p,{children:["If you set the property ",(0,i.jsx)(t.code,{children:"spec.securityContext.debugging"})," to ",(0,i.jsx)(t.code,{children:"true"}),", you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:"openssl s_client -host 192.168.1.2 -port 5061 # Remember to use Routr's IP\n"})}),"\n",(0,i.jsx)(t.h2,{id:"setting-up-the-sip-phones",children:"Setting up the Sip Phones"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:["For this guide, we are using ",(0,i.jsx)(t.code,{children:"Blink Pro"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Go to the account that you want to secure, select ",(0,i.jsx)(t.code,{children:"Advanced -> Sip Signaling"})," and change the parameter ",(0,i.jsx)(t.code,{children:"Primary Proxy"})," to ",(0,i.jsx)(t.code,{children:"${proxyHost}:${proxyPort};transport=tls"}),". See the example in the following image:"]}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_config.png",width:"600"}),"\n",(0,i.jsx)(t.p,{children:"If everything went well, you should see a green padlock like the one in the image below:"}),"\n",(0,i.jsx)("img",{src:"/img/blinkpro_tls_secured.png",width:"400"})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var i=n(6540);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/deaab6a5.e271f229.js b/assets/js/aba21aa0.5d866bda.js similarity index 65% rename from assets/js/deaab6a5.e271f229.js rename to assets/js/aba21aa0.5d866bda.js index e061dab07..be21acd15 100644 --- a/assets/js/deaab6a5.e271f229.js +++ b/assets/js/aba21aa0.5d866bda.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6782],{1966:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5742],{7093:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/ac1de8bb.5a652d4f.js b/assets/js/ac1de8bb.5a652d4f.js new file mode 100644 index 000000000..a858cd9a8 --- /dev/null +++ b/assets/js/ac1de8bb.5a652d4f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9423],{5778:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var t=o(4848),r=o(8453);const s={},a="Overview",c={id:"connect/nodesdk/overview",title:"Overview",description:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.",source:"@site/versioned_docs/version-2.0.0/connect/nodesdk/overview.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/overview",permalink:"/docs/2.0.0/connect/nodesdk/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/nodesdk/overview.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"},next:{title:"SDK",permalink:"/docs/2.0.0/connect/nodesdk/sdk"}},i={},d=[];function l(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.p,{children:"Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server."}),"\n",(0,t.jsx)(n.p,{children:"This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server."}),"\n",(0,t.jsx)(n.p,{children:"The following example demonstrates how you can use the Node.js SDK to create a new Domain."}),"\n",(0,t.jsx)(n.p,{children:"To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK."}),"\n",(0,t.jsx)(n.p,{children:"Let\u2019s begin by creating a new project:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir my-project \ncd my-project \nnpm init -y\n"})}),"\n",(0,t.jsx)(n.p,{children:'The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings.\nNext, install the SDK width:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install --save @routr/sdk\n"})}),"\n",(0,t.jsx)(n.p,{children:"The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:"}),"\n",(0,t.jsx)(n.p,{children:"Filename: index.js"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-javascript",children:'const SDK = require("@routr/sdk");\nconst domains = new SDK.Domains();\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3", \n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: { "key": "value" } \n};\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error); // an error occurred\n'})}),"\n",(0,t.jsx)(n.p,{children:"In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool."}),"\n",(0,t.jsx)(n.p,{children:"The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)"}),"\n",(0,t.jsx)(n.p,{children:"Now, go ahead and run the code:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"node index.js\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/sdk",children:"https://www.npmjs.com/package/@routr/sdk"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos",children:"https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ae057106.1e7798d3.js b/assets/js/ae057106.1e7798d3.js new file mode 100644 index 000000000..d589fdd7c --- /dev/null +++ b/assets/js/ae057106.1e7798d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5558],{9142:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=r(4848),n=r(8453);const o={},i="Concepts",a={id:"overview/concepts",title:"Concepts",description:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.",source:"@site/versioned_docs/version-2.0.0/overview/concepts.md",sourceDirName:"overview",slug:"/overview/concepts",permalink:"/docs/2.0.0/overview/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/overview/concepts.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/docs/2.0.0/overview/architecture"},next:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"}},c={},d=[{value:"EdgePort",id:"edgeport",level:2},{value:"Location service",id:"location-service",level:2},{value:"Middlewares",id:"middlewares",level:2},{value:"Processors",id:"processors",level:2},{value:"Alterations",id:"alterations",level:2},{value:"Registry service",id:"registry-service",level:2},{value:"Requester",id:"requester",level:2}];function l(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"concepts",children:"Concepts"}),"\n",(0,t.jsx)(s.p,{children:"Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture."}),"\n",(0,t.jsx)(s.p,{children:"The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections."}),"\n",(0,t.jsx)(s.h2,{id:"edgeport",children:"EdgePort"}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages."}),"\n",(0,t.jsx)(s.p,{children:"The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly."}),"\n",(0,t.jsx)(s.p,{children:"Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr."}),"\n",(0,t.jsx)(s.p,{children:"Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher"}),"\n",(0,t.jsx)("img",{src:"/img/edgeport.png",alt:"EdgePort diagram",width:"500"}),"\n",(0,t.jsxs)(s.p,{children:["One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as ",(0,t.jsx)(s.code,{children:"TCP"}),",",(0,t.jsx)(s.code,{children:"TLS"}),", ",(0,t.jsx)(s.code,{children:"WS"}),", or ",(0,t.jsx)(s.code,{children:"WSS"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality."}),"\n",(0,t.jsx)(s.p,{children:"A minimal EdgePort configuration looks as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"# Example EdgePort configuration\nkind: EdgePort\napiVersion: v2beta1\nref: edgeport-01\nmetadata:\n region: default\nspec:\n processor:\n addr: dispatcher:51901\n methods:\n - REGISTER\n - INVITE\n - ACK\n - BYE\n - CANCEL\n transport:\n - protocol: udp\n port: 5060\n"})}),"\n",(0,t.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,t.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor."}),"\n",(0,t.jsx)(s.p,{children:"The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor."}),"\n",(0,t.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,t.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,t.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,t.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,t.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,t.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,t.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,t.jsx)(s.h2,{id:"location-service",children:"Location service"}),"\n",(0,t.jsx)(s.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,t.jsx)(s.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,t.jsx)(s.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,t.jsxs)(s.p,{children:["Two balancing algorithms are available. The first is ",(0,t.jsx)(s.code,{children:"round-robin"}),", and the second is ",(0,t.jsx)(s.code,{children:"least-sessions"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,t.jsx)(s.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Notice that the load balancing section sets the ",(0,t.jsx)(s.code,{children:"withSessionAffinity"})," to ",(0,t.jsx)(s.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,t.jsxs)(s.p,{children:["Every Asterisk server that registers using the ",(0,t.jsx)(s.code,{children:"asterisk"})," username will join the same group under the ",(0,t.jsx)(s.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,t.jsx)(s.h2,{id:"middlewares",children:"Middlewares"}),"\n",(0,t.jsx)(s.p,{children:"Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc."}),"\n",(0,t.jsx)(s.p,{children:"Some use cases for Middlewares include:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Authentication and Authorization"}),"\n",(0,t.jsx)(s.li,{children:"Rate limiting"}),"\n",(0,t.jsx)(s.li,{children:"Circuit breaking"}),"\n",(0,t.jsx)(s.li,{children:"Logging, Metrics, and Tracing"}),"\n",(0,t.jsx)(s.li,{children:"Request and response validation"}),"\n",(0,t.jsx)(s.li,{children:"Data transformation and normalization"}),"\n",(0,t.jsx)(s.li,{children:"CDRs generation"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor."}),"\n",(0,t.jsx)(s.h2,{id:"processors",children:"Processors"}),"\n",(0,t.jsxs)(s.p,{children:["Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the ",(0,t.jsx)(s.a,{href:"#alterations",children:"Alterations API"})," to modify SIP messages."]}),"\n",(0,t.jsx)(s.p,{children:'The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.'}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-javascript",children:'const Processor = require("@routr/processor").default;\nconst { MessageRequest, Response } = require("@routr/processor");\n\nnew Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(\n (req: MessageRequest, res: Response) => {\n logger.verbose("got new request: ")\n logger.verbose(JSON.stringify(req, null, " "))\n res.sendOk()\n }\n)\n'})}),"\n",(0,t.jsx)(s.h2,{id:"alterations",children:"Alterations"}),"\n",(0,t.jsx)(s.p,{children:"Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes."}),"\n",(0,t.jsx)(s.p,{children:"The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-typescript",children:"const { Alterations } = require('@routr/processor')\nconst { pipe } = require(\"fp-ts/function\");\n\nfunction messageProcessing(req: MessageRequest, route: Route): MessageRequest {\n const requestOut = pipe(\n reqIn,\n //example of an Alteration method with two arities\n Alterations.addSelfVia(route),\n Alterations.addSelfRecordRoute(route),\n Alterations.addRouteToPeerEdgePort(route),\n Alterations.addRouteToNextHop(route),\n //example of an Alteration method with one arity\n Alterations.addXEdgePortRef,\n Alterations.decreaseMaxForwards\n )\n\n return requestOut\n}\n"})}),"\n",(0,t.jsx)(s.p,{children:"If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output."}),"\n",(0,t.jsx)(s.h2,{id:"registry-service",children:"Registry service"}),"\n",(0,t.jsx)(s.p,{children:"The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service."}),"\n",(0,t.jsx)(s.p,{children:"Available configurations include the following:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Property"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Required"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"requesterAddr"}),(0,t.jsx)(s.td,{children:"Address of service to send requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"apiAddr"}),(0,t.jsx)(s.td,{children:"Address of API service"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"registerInterval"}),(0,t.jsx)(s.td,{children:"Interval to send registration requests"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"cache"}),(0,t.jsx)(s.td,{children:"Cache configuration"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"methods"}),(0,t.jsx)(s.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts"}),(0,t.jsx)(s.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.address"}),(0,t.jsx)(s.td,{children:"Address of EdgePort"}),(0,t.jsx)(s.td,{children:"Yes"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"edgePorts.region"}),(0,t.jsx)(s.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:"Here is an example of a Trunk configuration that requires registration:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n registerInterval: 20\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(s.h2,{id:"requester",children:"Requester"}),"\n",(0,t.jsx)(s.p,{children:"The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service."})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>a});var t=r(6540);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1e2c3e5.f009a04f.js b/assets/js/b1e2c3e5.11bee284.js similarity index 97% rename from assets/js/b1e2c3e5.f009a04f.js rename to assets/js/b1e2c3e5.11bee284.js index d9159cf8b..de70b1037 100644 --- a/assets/js/b1e2c3e5.f009a04f.js +++ b/assets/js/b1e2c3e5.11bee284.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1953],{6891:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(4848),i=t(8453);const r={},o="updateDomain",a={id:"api/domains/update",title:"updateDomain",description:"Updates an existing Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/update.md",sourceDirName:"api/domains",slug:"/api/domains/update",permalink:"/docs/1.x.x/api/domains/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"},next:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"}},d={},c=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatedomain",children:"updateDomain"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/domains/dm6c87r2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office",\n "ref": "dm6c87r2"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1953],{6594:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(4848),i=t(8453);const r={},o="updateDomain",a={id:"api/domains/update",title:"updateDomain",description:"Updates an existing Domain resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/update.md",sourceDirName:"api/domains",slug:"/api/domains/update",permalink:"/docs/1.x.x/api/domains/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"},next:{title:"createGateway",permalink:"/docs/1.x.x/api/gateways/create"}},d={},c=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"updatedomain",children:"updateDomain"}),"\n",(0,s.jsx)(n.p,{children:"Updates an existing Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"URL"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Method"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"PUT"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,s.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Request body"})}),"\n",(0,s.jsxs)(n.p,{children:["A file containing a ",(0,s.jsx)(n.a,{href:"/docs/1.x.x/configuration/domains",children:"Domain"})," resource in ",(0,s.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Response"})}),"\n",(0,s.jsx)(n.p,{children:"If successful this method updates a Domain resource."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'PUT /api/v1beta1/domains/dm6c87r2\n{\n\t"apiVersion": "v1beta1",\n\t"kind": "Domain",\n\t"metadata": {\n\t\t"name": "Another Office",\n "ref": "dm6c87r2"\n\t},\n\t"spec": {\n\t\t"context": {\n\t\t\t"domainUri": "sip2.local"\n\t\t}\n\t}\n}\n\nHTTP/1.1 200 OK\n{\n\t"status": "200",\n\t"message": "Successful request"\n}\n'})})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b396445b.1ec32965.js b/assets/js/b396445b.1ec32965.js new file mode 100644 index 000000000..03fce8c07 --- /dev/null +++ b/assets/js/b396445b.1ec32965.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4082],{3675:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const i={},s="Overview",a={id:"development/alterations/overview",title:"Overview",description:"Coming soon.",source:"@site/docs/development/alterations/overview.md",sourceDirName:"development/alterations",slug:"/development/alterations/overview",permalink:"/docs/2.11.5/development/alterations/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SimpleAuth Service",permalink:"/docs/2.11.5/development/components/simpleauth"},next:{title:"Alteration Methods",permalink:"/docs/2.11.5/development/alterations/methods"}},c={},l=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b396445b.4d16d64d.js b/assets/js/b396445b.4d16d64d.js deleted file mode 100644 index 2acb21fd1..000000000 --- a/assets/js/b396445b.4d16d64d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4082],{5286:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=n(4848),r=n(8453);const i={},s="Overview",a={id:"development/alterations/overview",title:"Overview",description:"Coming soon.",source:"@site/docs/development/alterations/overview.md",sourceDirName:"development/alterations",slug:"/development/alterations/overview",permalink:"/docs/2.0.0/development/alterations/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/alterations/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SimpleAuth Service",permalink:"/docs/2.0.0/development/components/simpleauth"},next:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"}},c={},l=[];function d(e){const t={h1:"h1",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b3bbf2ca.60bb6537.js b/assets/js/b3bbf2ca.60bb6537.js deleted file mode 100644 index 2a00e50db..000000000 --- a/assets/js/b3bbf2ca.60bb6537.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8190],{3036:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var o=e(4848),i=e(8453);const a={},c="Building a Chat Application",r={id:"development/building-a-chat-application",title:"Building a Chat Application",description:"Comin soon.",source:"@site/docs/development/building-a-chat-application.md",sourceDirName:"development",slug:"/development/building-a-chat-application",permalink:"/docs/2.0.0/development/building-a-chat-application",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-chat-application.md",tags:[],version:"current",frontMatter:{}},s={},p=[];function l(t){const n={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"building-a-chat-application",children:"Building a Chat Application"}),"\n",(0,o.jsx)(n.p,{children:"Comin soon."})]})}function d(t={}){const{wrapper:n}={...(0,i.R)(),...t.components};return n?(0,o.jsx)(n,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>c,x:()=>r});var o=e(6540);const i={},a=o.createContext(i);function c(t){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function r(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:c(t.components),o.createElement(a.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b3bbf2ca.d827be3b.js b/assets/js/b3bbf2ca.d827be3b.js new file mode 100644 index 000000000..1a99c59d5 --- /dev/null +++ b/assets/js/b3bbf2ca.d827be3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8190],{4475:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var o=e(4848),i=e(8453);const a={},c="Building a Chat Application",r={id:"development/building-a-chat-application",title:"Building a Chat Application",description:"Comin soon.",source:"@site/docs/development/building-a-chat-application.md",sourceDirName:"development",slug:"/development/building-a-chat-application",permalink:"/docs/2.11.5/development/building-a-chat-application",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/building-a-chat-application.md",tags:[],version:"current",frontMatter:{}},s={},p=[];function l(t){const n={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"building-a-chat-application",children:"Building a Chat Application"}),"\n",(0,o.jsx)(n.p,{children:"Comin soon."})]})}function d(t={}){const{wrapper:n}={...(0,i.R)(),...t.components};return n?(0,o.jsx)(n,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>c,x:()=>r});var o=e(6540);const i={},a=o.createContext(i);function c(t){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function r(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:c(t.components),o.createElement(a.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4dd6982.a5471632.js b/assets/js/b4dd6982.08ecaec8.js similarity index 97% rename from assets/js/b4dd6982.a5471632.js rename to assets/js/b4dd6982.08ecaec8.js index f5c6cdf92..7dab7e502 100644 --- a/assets/js/b4dd6982.a5471632.js +++ b/assets/js/b4dd6982.08ecaec8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8732],{1744:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updateConfiguration",c={id:"api/config/update",title:"updateConfiguration",description:"This method updates the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/update.md",sourceDirName:"api/config",slug:"/api/config/update",permalink:"/docs/1.x.x/api/config/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"},next:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updateconfiguration",children:"updateConfiguration"}),"\n",(0,r.jsx)(n.p,{children:"This method updates the servers' configuration."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/system/config"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing the ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/general",children:"servers' configuration"})," in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"The changes will take effect on the next time the instance restart."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/{apiversion}/config\n{\n "apiVersion": "v1beta1",\n "spec": {\n "dataSource": {\n "provider": "redis_data_provider"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8732],{8739:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var r=t(4848),s=t(8453);const i={},o="updateConfiguration",c={id:"api/config/update",title:"updateConfiguration",description:"This method updates the servers' configuration.",source:"@site/versioned_docs/version-1.x.x/api/config/update.md",sourceDirName:"api/config",slug:"/api/config/update",permalink:"/docs/1.x.x/api/config/update",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/config/update.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getConfiguration",permalink:"/docs/1.x.x/api/config/get"},next:{title:"createDomain",permalink:"/docs/1.x.x/api/domains/create"}},a={},d=[];function p(e){const n={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"updateconfiguration",children:"updateConfiguration"}),"\n",(0,r.jsx)(n.p,{children:"This method updates the servers' configuration."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"URL"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"/system/config"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Method"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"PUT"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameters"})}),"\n",(0,r.jsx)(n.p,{children:"This method does not receive any parameters."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Request body"})}),"\n",(0,r.jsxs)(n.p,{children:["A file containing the ",(0,r.jsx)(n.a,{href:"/docs/1.x.x/configuration/general",children:"servers' configuration"})," in ",(0,r.jsx)(n.code,{children:"json"})," format."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Response"})}),"\n",(0,r.jsx)(n.p,{children:"The changes will take effect on the next time the instance restart."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'PUT /api/{apiversion}/config\n{\n "apiVersion": "v1beta1",\n "spec": {\n "dataSource": {\n "provider": "redis_data_provider"\n }\n }\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request"\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b5de05fe.2a9dab58.js b/assets/js/b5de05fe.2a9dab58.js deleted file mode 100644 index 6a4b06549..000000000 --- a/assets/js/b5de05fe.2a9dab58.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[803],{547:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=r(4848),s=r(8453);const i={},l="Cheatsheet",a={id:"administration/cli/cheatsheet",title:"Cheatsheet",description:"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.",source:"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",sourceDirName:"administration/cli",slug:"/administration/cli/cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/1.x.x/concepts"},next:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"}},o={},c=[{value:"Installation",id:"installation",level:2},{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Examples: Common operations",id:"examples-common-operations",level:3},{value:"Cheat Sheet",id:"cheat-sheet",level:2},{value:"Request and store token",id:"request-and-store-token",level:3},{value:"Clear out the session credentials",id:"clear-out-the-session-credentials",level:3},{value:"Launch the Web Console",id:"launch-the-web-console",level:3},{value:"Showing the Registry",id:"showing-the-registry",level:3},{value:"Locating SIP Devices",id:"locating-sip-devices",level:3},{value:"Creating Resources",id:"creating-resources",level:3},{value:"Finding Resources",id:"finding-resources",level:3},{value:"Deleting Resources",id:"deleting-resources",level:3},{value:"Updating Resources",id:"updating-resources",level:3},{value:"Dump all available logs",id:"dump-all-available-logs",level:3},{value:"Restart the engine",id:"restart-the-engine",level:3},{value:"Stop the engine",id:"stop-the-engine",level:3},{value:"Check the engine status",id:"check-the-engine-status",level:3},{value:"Display version information",id:"display-version-information",level:3},{value:"Manage general configuration",id:"manage-general-configuration",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cheatsheet",children:"Cheatsheet"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"rctl"})," is a command-line interface for running commands against a Routr server. This overview covers ",(0,t.jsx)(n.code,{children:"rctl"})," syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,t.jsx)(n.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,t.jsx)(n.p,{children:"To login to a Routr server, use the login command."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The current API version is v1beta1"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following syntax to run ",(0,t.jsx)(n.code,{children:"rctl"})," commands from your terminal window:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"rctl COMMAND [REF] [flags]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:"COMMAND"}),", ",(0,t.jsx)(n.code,{children:"subcommand"})," ",(0,t.jsx)(n.code,{children:"REF"}),", and ",(0,t.jsx)(n.code,{children:"flags"})," are:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"COMMAND"}),": Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"subcommand"}),": Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" $ rctl get gateway gweef506\n $ rctl get gateways gweef506\n $ rctl get gw gweef506\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"REF"}),": Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, ",(0,t.jsx)(n.code,{children:"$ rctl get agents"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"flags"}),": Specifies optional flags. For example, you can use the --filter to further reduce the output of the ",(0,t.jsx)(n.code,{children:"get"})," command ."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The --filter flag uses ",(0,t.jsx)(n.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," to perform the filtering. The root is always '$'.\nAll you need to add is the path to the property and the filter operators. For example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# This returns all the Numbers in Gateway 'gweef506'\nrctl get numbers --filter \"@.metadata.gwRef=='gweef506'\" \n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you need help, just run ",(0,t.jsx)(n.code,{children:"rctl --help"})," from the terminal window."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl --help\nusage: rctl [-h] [-v] COMMAND ...\n\nA tool for the management of a Routr instance\n\nnamed arguments:\n -h, --help show this help message and exit\n -v, --version print version information and quit\n\nCommands:\n COMMAND\n get display a list of resources\n create (crea) creates new resource(s)\n apply apply changes over existing resource(s)\n delete (del) delete an existing resource(s)\n locate (loc) locate sip device(s)\n registry (reg) shows gateways registrations\n proxy run a proxy to the server (beta)\n login sets connection info\n logout clear session credentials\n logs dumps all the available system logs\n restart restarts the engine\n stop stops the engine\n ping checks engine status\n version (ver) obtain rctl's version information\n config manage routr configuration\n\nRun 'rctl COMMAND --help' for more information on a command\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Important: Some commands (i.e.: create, delete) are not available in the default implementation of the ",(0,t.jsx)(n.code,{children:"resources"})," modules. Only persistent implementations support these commands."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-common-operations",children:"Examples: Common operations"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following set of examples to help you familiarize yourself with running the commonly used ",(0,t.jsx)(n.code,{children:"rctl"})," operations:"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl locate"})," or ",(0,t.jsx)(n.code,{children:"rctl loc"})," - Locate a sip device registered on the Routr server"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Locate all Sip Devices registered against a Routr server\n$ rctl loc\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl registry"})," or ",(0,t.jsx)(n.code,{children:"rctl reg"})," - Shows Gateways current registration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Shows the registry\n$ rctl reg\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl get"})," - List one or more resources."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// List all numbers\n$ rctl get numbers\n\n// List all numbers that belong to gateway reference gweef506\n$ rctl get numbers --filter \"@.metadata.ref=='gweef506'\"\n\n// List number by reference\n$ rctl get numbers dd50baa4\n\n// List all agents\n$ rctl get agents\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl create"})," - create a new resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Create a new gateway(s) using a .yaml or .yml file\n$ rctl create -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl apply"})," - update an existing resource(s)"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Update an existing resource(s) .yaml or .yml.\n$ rctl apply -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl delete"})," - delete a resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Delete all numbers for gateway reference gweef506\n$ rctl delete numbers --filter \"@.metadata.gwRef=='gweef506'\"\n\n// Delete a single agent (using delete alias)\n$ rctl del agent ag3f77f6\n"})}),"\n",(0,t.jsx)(n.h2,{id:"cheat-sheet",children:"Cheat Sheet"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Create, delete, and update are only available in some implementations of the ",(0,t.jsx)(n.code,{children:"resources"})," module."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"request-and-store-token",children:"Request and store token"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Request authentication for subsequent commands\n$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsx)(n.h3,{id:"clear-out-the-session-credentials",children:"Clear out the session credentials"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Clear session credentials\n$ rctl logout\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-the-web-console",children:"Launch the Web Console"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# The Web Console re-uses the credentials of your Command-Line Tool\nrctl proxy\n"})}),"\n",(0,t.jsx)(n.h3,{id:"showing-the-registry",children:"Showing the Registry"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Shows all the Gateways that are currently available\n$ rctl registry # Shows only current registrations. You may use `reg` for short\n"})}),"\n",(0,t.jsx)(n.h3,{id:"locating-sip-devices",children:"Locating SIP Devices"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Find all sip devices available at the location service\n$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes\n"})}),"\n",(0,t.jsx)(n.h3,{id:"creating-resources",children:"Creating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Create new peers and agents\n$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"finding-resources",children:"Finding Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Get Numbers\n$ rctl get numbers # List all available Numbers\n$ rctl get number # List all available Numbers\n$ rctl get number --filter \"@.metadata.ref=='dd50baa4'\" # Shows Number with reference 'Number0001'\n$ rctl get number --filter \"@.metadata.gwRef=='gweef506'\" # Shows Numbers with Gateway reference 'GW1232'\n\n# Get agents\n$ rctl get agents # List all Agents\n"})}),"\n",(0,t.jsx)(n.h3,{id:"deleting-resources",children:"Deleting Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Delete command by refernce or filter\n$ rctl delete agent ag3f77f6 # Delete Agent by reference\n$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter\n"})}),"\n",(0,t.jsx)(n.h3,{id:"updating-resources",children:"Updating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl apply -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"dump-all-available-logs",children:"Dump all available logs"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl logs\n"})}),"\n",(0,t.jsx)(n.h3,{id:"restart-the-engine",children:"Restart the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To restart the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop-the-engine",children:"Stop the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To stop the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"check-the-engine-status",children:"Check the engine status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ping\n"})}),"\n",(0,t.jsx)(n.h3,{id:"display-version-information",children:"Display version information"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ver\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manage-general-configuration",children:"Manage general configuration"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To update configuration use the apply subommand\n$ rctl config apply -f /path/to/config.yml\n\n# To see the configuration use the describe subcommand\n$ rctl config describe --full\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>a});var t=r(6540);const s={},i=t.createContext(s);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b5de05fe.d4c307b7.js b/assets/js/b5de05fe.d4c307b7.js new file mode 100644 index 000000000..ad6845baa --- /dev/null +++ b/assets/js/b5de05fe.d4c307b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[803],{3144:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=r(4848),s=r(8453);const i={},l="Cheatsheet",a={id:"administration/cli/cheatsheet",title:"Cheatsheet",description:"The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.",source:"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",sourceDirName:"administration/cli",slug:"/administration/cli/cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/1.x.x/concepts"},next:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"}},o={},c=[{value:"Installation",id:"installation",level:2},{value:"Login to a Routr server",id:"login-to-a-routr-server",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Examples: Common operations",id:"examples-common-operations",level:3},{value:"Cheat Sheet",id:"cheat-sheet",level:2},{value:"Request and store token",id:"request-and-store-token",level:3},{value:"Clear out the session credentials",id:"clear-out-the-session-credentials",level:3},{value:"Launch the Web Console",id:"launch-the-web-console",level:3},{value:"Showing the Registry",id:"showing-the-registry",level:3},{value:"Locating SIP Devices",id:"locating-sip-devices",level:3},{value:"Creating Resources",id:"creating-resources",level:3},{value:"Finding Resources",id:"finding-resources",level:3},{value:"Deleting Resources",id:"deleting-resources",level:3},{value:"Updating Resources",id:"updating-resources",level:3},{value:"Dump all available logs",id:"dump-all-available-logs",level:3},{value:"Restart the engine",id:"restart-the-engine",level:3},{value:"Stop the engine",id:"stop-the-engine",level:3},{value:"Check the engine status",id:"check-the-engine-status",level:3},{value:"Display version information",id:"display-version-information",level:3},{value:"Manage general configuration",id:"manage-general-configuration",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cheatsheet",children:"Cheatsheet"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"rctl"})," is a command-line interface for running commands against a Routr server. This overview covers ",(0,t.jsx)(n.code,{children:"rctl"})," syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"To get the Routr Command-Line Tool run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"npm install -g routr-ctl\n"})}),"\n",(0,t.jsx)(n.p,{children:"The command-line tool is now globally accessible."}),"\n",(0,t.jsx)(n.h2,{id:"login-to-a-routr-server",children:"Login to a Routr server"}),"\n",(0,t.jsx)(n.p,{children:"To login to a Routr server, use the login command."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The current API version is v1beta1"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following syntax to run ",(0,t.jsx)(n.code,{children:"rctl"})," commands from your terminal window:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"rctl COMMAND [REF] [flags]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["where ",(0,t.jsx)(n.code,{children:"COMMAND"}),", ",(0,t.jsx)(n.code,{children:"subcommand"})," ",(0,t.jsx)(n.code,{children:"REF"}),", and ",(0,t.jsx)(n.code,{children:"flags"})," are:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"COMMAND"}),": Specifies the operation that you want to perform on one or more resources. For example, create, get, delete, locate(loc)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"subcommand"}),": Specifies the resource type. Resource types are case-sensitive, and you can specify the singular, plural, or abbreviated forms. For example, the following commands produce the same output:"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" $ rctl get gateway gweef506\n $ rctl get gateways gweef506\n $ rctl get gw gweef506\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"REF"}),": Specifies the reference to the resource. References are case-sensitive. For a full list, omit the reference. For example, ",(0,t.jsx)(n.code,{children:"$ rctl get agents"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"flags"}),": Specifies optional flags. For example, you can use the --filter to further reduce the output of the ",(0,t.jsx)(n.code,{children:"get"})," command ."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The --filter flag uses ",(0,t.jsx)(n.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," to perform the filtering. The root is always '$'.\nAll you need to add is the path to the property and the filter operators. For example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# This returns all the Numbers in Gateway 'gweef506'\nrctl get numbers --filter \"@.metadata.gwRef=='gweef506'\" \n"})}),"\n",(0,t.jsxs)(n.p,{children:["If you need help, just run ",(0,t.jsx)(n.code,{children:"rctl --help"})," from the terminal window."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl --help\nusage: rctl [-h] [-v] COMMAND ...\n\nA tool for the management of a Routr instance\n\nnamed arguments:\n -h, --help show this help message and exit\n -v, --version print version information and quit\n\nCommands:\n COMMAND\n get display a list of resources\n create (crea) creates new resource(s)\n apply apply changes over existing resource(s)\n delete (del) delete an existing resource(s)\n locate (loc) locate sip device(s)\n registry (reg) shows gateways registrations\n proxy run a proxy to the server (beta)\n login sets connection info\n logout clear session credentials\n logs dumps all the available system logs\n restart restarts the engine\n stop stops the engine\n ping checks engine status\n version (ver) obtain rctl's version information\n config manage routr configuration\n\nRun 'rctl COMMAND --help' for more information on a command\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Important: Some commands (i.e.: create, delete) are not available in the default implementation of the ",(0,t.jsx)(n.code,{children:"resources"})," modules. Only persistent implementations support these commands."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-common-operations",children:"Examples: Common operations"}),"\n",(0,t.jsxs)(n.p,{children:["Use the following set of examples to help you familiarize yourself with running the commonly used ",(0,t.jsx)(n.code,{children:"rctl"})," operations:"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl locate"})," or ",(0,t.jsx)(n.code,{children:"rctl loc"})," - Locate a sip device registered on the Routr server"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Locate all Sip Devices registered against a Routr server\n$ rctl loc\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl registry"})," or ",(0,t.jsx)(n.code,{children:"rctl reg"})," - Shows Gateways current registration."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Shows the registry\n$ rctl reg\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl get"})," - List one or more resources."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// List all numbers\n$ rctl get numbers\n\n// List all numbers that belong to gateway reference gweef506\n$ rctl get numbers --filter \"@.metadata.ref=='gweef506'\"\n\n// List number by reference\n$ rctl get numbers dd50baa4\n\n// List all agents\n$ rctl get agents\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl create"})," - create a new resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Create a new gateway(s) using a .yaml or .yml file\n$ rctl create -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl apply"})," - update an existing resource(s)"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Update an existing resource(s) .yaml or .yml.\n$ rctl apply -f new-gateway.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"rctl delete"})," - delete a resource."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"// Delete all numbers for gateway reference gweef506\n$ rctl delete numbers --filter \"@.metadata.gwRef=='gweef506'\"\n\n// Delete a single agent (using delete alias)\n$ rctl del agent ag3f77f6\n"})}),"\n",(0,t.jsx)(n.h2,{id:"cheat-sheet",children:"Cheat Sheet"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Create, delete, and update are only available in some implementations of the ",(0,t.jsx)(n.code,{children:"resources"})," module."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"request-and-store-token",children:"Request and store token"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Request authentication for subsequent commands\n$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit\n"})}),"\n",(0,t.jsx)(n.h3,{id:"clear-out-the-session-credentials",children:"Clear out the session credentials"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Clear session credentials\n$ rctl logout\n"})}),"\n",(0,t.jsx)(n.h3,{id:"launch-the-web-console",children:"Launch the Web Console"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# The Web Console re-uses the credentials of your Command-Line Tool\nrctl proxy\n"})}),"\n",(0,t.jsx)(n.h3,{id:"showing-the-registry",children:"Showing the Registry"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Shows all the Gateways that are currently available\n$ rctl registry # Shows only current registrations. You may use `reg` for short\n"})}),"\n",(0,t.jsx)(n.h3,{id:"locating-sip-devices",children:"Locating SIP Devices"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Find all sip devices available at the location service\n$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes\n"})}),"\n",(0,t.jsx)(n.h3,{id:"creating-resources",children:"Creating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Create new peers and agents\n$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"finding-resources",children:"Finding Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Get Numbers\n$ rctl get numbers # List all available Numbers\n$ rctl get number # List all available Numbers\n$ rctl get number --filter \"@.metadata.ref=='dd50baa4'\" # Shows Number with reference 'Number0001'\n$ rctl get number --filter \"@.metadata.gwRef=='gweef506'\" # Shows Numbers with Gateway reference 'GW1232'\n\n# Get agents\n$ rctl get agents # List all Agents\n"})}),"\n",(0,t.jsx)(n.h3,{id:"deleting-resources",children:"Deleting Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Delete command by refernce or filter\n$ rctl delete agent ag3f77f6 # Delete Agent by reference\n$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter\n"})}),"\n",(0,t.jsx)(n.h3,{id:"updating-resources",children:"Updating Resources"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl apply -f asterisk.yaml # Create Peer in file asterisk.yaml\n$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml\n"})}),"\n",(0,t.jsx)(n.h3,{id:"dump-all-available-logs",children:"Dump all available logs"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl logs\n"})}),"\n",(0,t.jsx)(n.h3,{id:"restart-the-engine",children:"Restart the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To restart the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop-the-engine",children:"Stop the engine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To stop the engine immediately use the --now flag\n$ rctl restart --now\n"})}),"\n",(0,t.jsx)(n.h3,{id:"check-the-engine-status",children:"Check the engine status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ping\n"})}),"\n",(0,t.jsx)(n.h3,{id:"display-version-information",children:"Display version information"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ rctl ver\n"})}),"\n",(0,t.jsx)(n.h3,{id:"manage-general-configuration",children:"Manage general configuration"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# To update configuration use the apply subommand\n$ rctl config apply -f /path/to/config.yml\n\n# To see the configuration use the describe subcommand\n$ rctl config describe --full\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>a});var t=r(6540);const s={},i=t.createContext(s);function l(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7547532.f336eade.js b/assets/js/b7547532.f336eade.js new file mode 100644 index 000000000..d67df3ac3 --- /dev/null +++ b/assets/js/b7547532.f336eade.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9830],{4525:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var r=s(4848),d=s(8453);const t={},i="SDK",c={id:"connect/nodesdk/sdk",title:"SDK",description:"* Installation",source:"@site/versioned_docs/version-2.0.0/connect/nodesdk/sdk.md",sourceDirName:"connect/nodesdk",slug:"/connect/nodesdk/sdk",permalink:"/docs/2.0.0/connect/nodesdk/sdk",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/nodesdk/sdk.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"},next:{title:"Home or Office Setup",permalink:"/docs/2.0.0/connect/home-or-office-setup"}},l={},o=[{value:"Acls \u21d0 <code>APIClient</code>",id:"acls--apiclient",level:2},{value:"new Acls(options)",id:"new-aclsoptions",level:3},{value:"acls.createAcl(request) \u21d2 <code>Promise.<CreateAclResponse></code>",id:"aclscreateaclrequest--promisecreateaclresponse",level:3},{value:"acls.updateAcl(request) \u21d2 <code>Promise.<UpdateAclResponse></code>",id:"aclsupdateaclrequest--promiseupdateaclresponse",level:3},{value:"acls.getAcl(ref) \u21d2 <code>Promise.<GetAclResponse></code>",id:"aclsgetaclref--promisegetaclresponse",level:3},{value:"acls.deleteAcl(ref) \u21d2 <code>Promise.<void></code>",id:"aclsdeleteaclref--promisevoid",level:3},{value:"acls.listAcls(request) \u21d2 <code>Promise.<ListAclResponse></code>",id:"aclslistaclsrequest--promiselistaclresponse",level:3},{value:"Agents \u21d0 <code>APIClient</code>",id:"agents--apiclient",level:2},{value:"new Agents(options)",id:"new-agentsoptions",level:3},{value:"agents.createAgent(request) \u21d2 <code>Promise.<CreateAgentResponse></code>",id:"agentscreateagentrequest--promisecreateagentresponse",level:3},{value:"agents.updateAgent(request) \u21d2 <code>Promise.<UpdateAgentResponse></code>",id:"agentsupdateagentrequest--promiseupdateagentresponse",level:3},{value:"agents.getAgent(ref) \u21d2 <code>Promise.<GetAgentResponse></code>",id:"agentsgetagentref--promisegetagentresponse",level:3},{value:"agents.deleteAgent(ref) \u21d2 <code>Promise.<void></code>",id:"agentsdeleteagentref--promisevoid",level:3},{value:"agents.listAgents(request) \u21d2 <code>Promise.<ListAgentResponse></code>",id:"agentslistagentsrequest--promiselistagentresponse",level:3},{value:"Credentials \u21d0 <code>APIClient</code>",id:"credentials--apiclient",level:2},{value:"new Credentials(options)",id:"new-credentialsoptions",level:3},{value:"credentials.createCredentials(request) \u21d2 <code>Promise.<CreateCredentialsResponse></code>",id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",level:3},{value:"credentials.updateCredentials(request) \u21d2 <code>Promise.<UpdateCredentialsResponse></code>",id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",level:3},{value:"credentials.getCredentials(ref) \u21d2 <code>Promise.<GetCredentialsResponse></code>",id:"credentialsgetcredentialsref--promisegetcredentialsresponse",level:3},{value:"credentials.deleteCredentials(ref) \u21d2 <code>Promise.<void></code>",id:"credentialsdeletecredentialsref--promisevoid",level:3},{value:"credentials.listCredentials(request) \u21d2 <code>Promise.<ListCredentialsResponse></code>",id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",level:3},{value:"Domains \u21d0 <code>APIClient</code>",id:"domains--apiclient",level:2},{value:"new Domains(options)",id:"new-domainsoptions",level:3},{value:"domains.createDomain(request) \u21d2 <code>Promise.<CreateDomainResponse></code>",id:"domainscreatedomainrequest--promisecreatedomainresponse",level:3},{value:"domains.updateDomain(request) \u21d2 <code>Promise.<UpdateDomainResponse></code>",id:"domainsupdatedomainrequest--promiseupdatedomainresponse",level:3},{value:"domains.getDomain(ref) \u21d2 <code>Promise.<GetDomainResponse></code>",id:"domainsgetdomainref--promisegetdomainresponse",level:3},{value:"domains.deleteDomain(ref) \u21d2 <code>Promise.<void></code>",id:"domainsdeletedomainref--promisevoid",level:3},{value:"domains.listDomains(request) \u21d2 <code>Promise.<ListDomainResponse></code>",id:"domainslistdomainsrequest--promiselistdomainresponse",level:3},{value:"Numbers \u21d0 <code>APIClient</code>",id:"numbers--apiclient",level:2},{value:"new Numbers(options)",id:"new-numbersoptions",level:3},{value:"numbers.createNumber(request) \u21d2 <code>Promise.<CreateNumberResponse></code>",id:"numberscreatenumberrequest--promisecreatenumberresponse",level:3},{value:"numbers.updateNumber(request) \u21d2 <code>Promise.<UpdateNumberResponse></code>",id:"numbersupdatenumberrequest--promiseupdatenumberresponse",level:3},{value:"numbers.getNumber(ref) \u21d2 <code>Promise.<GetNumberResponse></code>",id:"numbersgetnumberref--promisegetnumberresponse",level:3},{value:"numbers.deleteNumber(ref) \u21d2 <code>Promise.<void></code>",id:"numbersdeletenumberref--promisevoid",level:3},{value:"numbers.listNumbers(request) \u21d2 <code>Promise.<ListNumberResponse></code>",id:"numberslistnumbersrequest--promiselistnumberresponse",level:3},{value:"Peers \u21d0 <code>APIClient</code>",id:"peers--apiclient",level:2},{value:"new Peers(options)",id:"new-peersoptions",level:3},{value:"peers.createPeer(request) \u21d2 <code>Promise.<CreatePeerResponse></code>",id:"peerscreatepeerrequest--promisecreatepeerresponse",level:3},{value:"peers.updatePeer(request) \u21d2 <code>Promise.<UpdatePeerResponse></code>",id:"peersupdatepeerrequest--promiseupdatepeerresponse",level:3},{value:"peers.getPeer(ref) \u21d2 <code>Promise.<GetPeerResponse></code>",id:"peersgetpeerref--promisegetpeerresponse",level:3},{value:"peers.deletePeer(ref) \u21d2 <code>Promise.<void></code>",id:"peersdeletepeerref--promisevoid",level:3},{value:"peers.listPeers(request) \u21d2 <code>Promise.<ListPeerResponse></code>",id:"peerslistpeersrequest--promiselistpeerresponse",level:3},{value:"Trunks \u21d0 <code>APIClient</code>",id:"trunks--apiclient",level:2},{value:"new Trunks(options)",id:"new-trunksoptions",level:3},{value:"trunks.createTrunk(request) \u21d2 <code>Promise.<CreateTrunkResponse></code>",id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",level:3},{value:"trunks.updateTrunk(request) \u21d2 <code>Promise.<UpdateTrunkResponse></code>",id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",level:3},{value:"trunks.getTrunk(ref) \u21d2 <code>Promise.<GetTrunkResponse></code>",id:"trunksgettrunkref--promisegettrunkresponse",level:3},{value:"trunks.deleteTrunk(ref) \u21d2 <code>Promise.<void></code>",id:"trunksdeletetrunkref--promisevoid",level:3},{value:"trunks.listTrunks(request) \u21d2 <code>Promise.<ListTrunkResponse></code>",id:"trunkslisttrunksrequest--promiselisttrunkresponse",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"sdk",children:"SDK"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#installation",children:"Installation"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#apis",children:"APIs"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install --save @routr/sdk\n"})}),"\n",(0,r.jsx)(n.h1,{id:"apis",children:"APIs"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#acl--apiclient",children:(0,r.jsx)(n.code,{children:"Access Control List"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#agents--apiclient",children:(0,r.jsx)(n.code,{children:"Agents"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#credentials--apiclient",children:(0,r.jsx)(n.code,{children:"Credentials"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#domains--apiclient",children:(0,r.jsx)(n.code,{children:"Domains"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#numbers--apiclient",children:(0,r.jsx)(n.code,{children:"Numbers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#peers--apiclient",children:(0,r.jsx)(n.code,{children:"Peers"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#trunks--apiclient",children:(0,r.jsx)(n.code,{children:"Trunks"})})}),"\n"]}),"\n",(0,r.jsx)("a",{name:"Acls"}),"\n",(0,r.jsxs)(n.h2,{id:"acls--apiclient",children:["Acls \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get\nand delete Access Control Lists. The ACL API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls",children:"Acls"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Acls_new",children:"new Acls(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls+createAcl",children:".createAcl(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAclResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls+updateAcl",children:".updateAcl(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAclResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls+getAcl",children:".getAcl(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAclResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls+deleteAcl",children:".deleteAcl(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Acls+listAcls",children:".listAcls(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAclResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Acls_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-aclsoptions",children:"new Acls(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Acl API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst acl = new SDK.Acls()\n\nconst request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createAcl(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Acls+createAcl"}),"\n",(0,r.jsxs)(n.h3,{id:"aclscreateaclrequest--promisecreateaclresponse",children:["acls.createAcl(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAclResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Acls",children:(0,r.jsx)("code",{children:"Acls"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateAclResponse>"})," - The newly created AccessControlList",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateAclRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Peer network",\n allow: "27.116.56.0/22",\n deny: "0.0.0.0/0"\n}\n\nacl.createAcl(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Acls+updateAcl"}),"\n",(0,r.jsxs)(n.h3,{id:"aclsupdateaclrequest--promiseupdateaclresponse",children:["acls.updateAcl(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAclResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing AccessControlList on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Acls",children:(0,r.jsx)("code",{children:"Acls"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateAclResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateAclRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the ACL"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.allow"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to allow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.deny"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<string>"})}),(0,r.jsx)(n.td,{children:"List of IP addresses or CIDR blocks to deny"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Peer network updated",\n}\n\nacl.updateAcl(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Acls+getAcl"}),"\n",(0,r.jsxs)(n.h3,{id:"aclsgetaclref--promisegetaclresponse",children:["acls.getAcl(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAclResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Acls",children:(0,r.jsx)("code",{children:"Acls"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetAclResponse>"})," - The AccessControlList"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.getAcl(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Acls+deleteAcl"}),"\n",(0,r.jsxs)(n.h3,{id:"aclsdeleteaclref--promisevoid",children:["acls.deleteAcl(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an AccessControlList from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Acls",children:(0,r.jsx)("code",{children:"Acls"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The ACL reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nacl.deleteAcl(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Acls+listAcls"}),"\n",(0,r.jsxs)(n.h3,{id:"aclslistaclsrequest--promiselistaclresponse",children:["acls.listAcls(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAclResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all AccessControlLists from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Acls",children:(0,r.jsx)("code",{children:"Acls"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListAclResponse>"})," - The list of AccessControlLists"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListAclRequest"})}),(0,r.jsx)(n.td,{children:"The request to list ACLs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of ACLs to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nacl.listAcls(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Agents"}),"\n",(0,r.jsxs)(n.h2,{id:"agents--apiclient",children:["Agents \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get\nand delete Agents. The Agents API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents",children:"Agents"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Agents_new",children:"new Agents(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+createAgent",children:".createAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+updateAgent",children:".updateAgent(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+getAgent",children:".getAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+deleteAgent",children:".deleteAgent(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Agents+listAgents",children:".listAgents(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Agents_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-agentsoptions",children:"new Agents(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Agent API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst agents = new SDK.Agents()\n\nconst request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+createAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentscreateagentrequest--promisecreateagentresponse",children:["agents.createAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateAgentResponse>"})," - The newly created Agent",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Jonh Doe",\n username: "jdoe",\n privacy: Privacy.PRIVATE,\n domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\nagents.createAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+updateAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsupdateagentrequest--promiseupdateagentresponse",children:["agents.updateAgent(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Agent on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateAgentResponse>"})," - The updated Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateAgentRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.privacy"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Privacy"})}),(0,r.jsx)(n.td,{children:"Privacy of the Agent (e.g., Privacy.PRIVATE)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Domain reference of the Domain the Agent belongs to"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Agent"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Agent is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John D Doe",\n enabled: false\n}\n\nagents.updateAgent(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+getAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsgetagentref--promisegetagentresponse",children:["agents.getAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetAgentResponse>"})," - The Agent"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.getAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+deleteAgent"}),"\n",(0,r.jsxs)(n.h3,{id:"agentsdeleteagentref--promisevoid",children:["agents.deleteAgent(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Agent's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nagents.deleteAgent(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Agents+listAgents"}),"\n",(0,r.jsxs)(n.h3,{id:"agentslistagentsrequest--promiselistagentresponse",children:["agents.listAgents(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Agents from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Agents",children:(0,r.jsx)("code",{children:"Agents"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListAgentResponse>"})," - The list of Agents in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListAgentRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Agents"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Agents to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nagents.listAgents(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Credentials"}),"\n",(0,r.jsxs)(n.h2,{id:"credentials--apiclient",children:["Credentials \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get\nand delete Credentials. The Credentials API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials",children:"Credentials"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Credentials_new",children:"new Credentials(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+createCredentials",children:".createCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+updateCredentials",children:".updateCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+getCredentials",children:".getCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+deleteCredentials",children:".deleteCredentials(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Credentials+listCredentials",children:".listCredentials(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Credentials_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-credentialsoptions",children:"new Credentials(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Credentials API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst credentials = new SDK.Credentials()\n\nconst request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+createCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialscreatecredentialsrequest--promisecreatecredentialsresponse",children:["credentials.createCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateCredentialsResponse>"})," - The newly created Credentials",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Credentials for John Doe",\n username: "jdoe",\n password: "123456",\n extended: {\n "key": "value"\n }\n}\n\ncredentials.createCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+updateCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsupdatecredentialsrequest--promiseupdatecredentialsresponse",children:["credentials.updateCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Credentials on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateCredentialsResponse>"})," - The updated Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The friendly name of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.username"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Username of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.password"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Password of the Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "John Doe\'s Credentials"\n}\n\ncredentials.updateCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+getCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsgetcredentialsref--promisegetcredentialsresponse",children:["credentials.getCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetCredentialsResponse>"})," - The Credentials"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.getCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+deleteCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialsdeletecredentialsref--promisevoid",children:["credentials.deleteCredentials(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Credentials from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Credentials's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ncredentials.deleteCredentials(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Credentials+listCredentials"}),"\n",(0,r.jsxs)(n.h3,{id:"credentialslistcredentialsrequest--promiselistcredentialsresponse",children:["credentials.listCredentials(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Credentials from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Credentials",children:(0,r.jsx)("code",{children:"Credentials"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListCredentialsResponse>"})," - The list of Credentials in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListCredentialsRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Credentials to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ncredentials.listCredentials(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Domains"}),"\n",(0,r.jsxs)(n.h2,{id:"domains--apiclient",children:["Domains \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get\nand delete Domains. The Domains API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains",children:"Domains"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Domains_new",children:"new Domains(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+createDomain",children:".createDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+updateDomain",children:".updateDomain(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+getDomain",children:".getDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+deleteDomain",children:".deleteDomain(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Domains+listDomains",children:".listDomains(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Domains_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-domainsoptions",children:"new Domains(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Domain API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst domains = new SDK.Domains()\n\nconst request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+createDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainscreatedomainrequest--promisecreatedomainresponse",children:["domains.createDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateDomainResponse>"})," - The newly created Domain",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.domainUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The FQDN of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain",\n domainUri: "sip.local",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n egressPolicies: [{\n rule: ".*",\n numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n }],\n extended: {\n "key": "value"\n }\n}\n\ndomains.createDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+updateDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsupdatedomainrequest--promiseupdatedomainresponse",children:["domains.updateDomain(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Domain on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateDomainResponse>"})," - The updated Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateDomainRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference to the AccessControlList for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.egressPolicies"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<EgressPolicy>"})}),(0,r.jsx)(n.td,{children:"The list of EgressPolicies for the Domain"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Local domain updated",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n}\n\ndomains.updateDomain(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+getDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsgetdomainref--promisegetdomainresponse",children:["domains.getDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetDomainResponse>"})," - The Domain"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.getDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+deleteDomain"}),"\n",(0,r.jsxs)(n.h3,{id:"domainsdeletedomainref--promisevoid",children:["domains.deleteDomain(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Domain's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ndomains.deleteDomain(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Domains+listDomains"}),"\n",(0,r.jsxs)(n.h3,{id:"domainslistdomainsrequest--promiselistdomainresponse",children:["domains.listDomains(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Domains from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Domains",children:(0,r.jsx)("code",{children:"Domains"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListDomainResponse>"})," - The list of Domains"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListDomainRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Domains"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Domains to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ndomains.listDomains(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Numbers"}),"\n",(0,r.jsxs)(n.h2,{id:"numbers--apiclient",children:["Numbers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get\nand delete Numbers. The Number API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers",children:"Numbers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Numbers_new",children:"new Numbers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+createNumber",children:".createNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+updateNumber",children:".updateNumber(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+getNumber",children:".getNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+deleteNumber",children:".deleteNumber(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Numbers+listNumbers",children:".listNumbers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Numbers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-numbersoptions",children:"new Numbers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Number API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst numbers = new SDK.Numbers()\n\nconst request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryIsoCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+createNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numberscreatenumberrequest--promisecreatenumberresponse",children:["numbers.createNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateNumberResponse>"})," - The newly created Number",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.telUrl"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The number URI to be used (e.g., te:+1234567890)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.city"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The city where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.country"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.countryIsoCode"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The country ISO code where the number is located"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<JsonObject>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212",\n telUrl: "teL:+14155551212",\n trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",\n aorLink: "sip:100@sip.local",\n city: "San Francisco",\n country: "United States",\n countryIsoCode: "US",\n sessionAffinityHeader: "X-Room-Id"\n extraHeaders: [{\n name: "X-Room-Id",\n value: "abc-us-123"\n }],\n extended: {\n "key": "value"\n }\n}\n\nnumbers.createNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+updateNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersupdatenumberrequest--promiseupdatenumberresponse",children:["numbers.updateNumber(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Number on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateNumberResponse>"})," - The updated Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateNumberRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aorLink"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsxs)(n.td,{children:["The AOR link to be used (e.g., sip:",(0,r.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extraHeaders"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<JsonObject>"})}),(0,r.jsx)(n.td,{children:'Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.trunkRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk reference to be used"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.sessionAffinityHeader"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional session affinity header"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "(415) 555-1212 (friendly name)",\n aorLink: "sip:2001@sip.local"\n}\n\nnumbers.updateNumber(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+getNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersgetnumberref--promisegetnumberresponse",children:["numbers.getNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetNumberResponse>"})," - The Number"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.getNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+deleteNumber"}),"\n",(0,r.jsxs)(n.h3,{id:"numbersdeletenumberref--promisevoid",children:["numbers.deleteNumber(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Number's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\nnumbers.deleteNumber(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Numbers+listNumbers"}),"\n",(0,r.jsxs)(n.h3,{id:"numberslistnumbersrequest--promiselistnumberresponse",children:["numbers.listNumbers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Numbers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Numbers",children:(0,r.jsx)("code",{children:"Numbers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListNumberResponse>"})," - The list of Numbers"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListNumberRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Numbers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Numbers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\nnumbers.listNumbers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Peers"}),"\n",(0,r.jsxs)(n.h2,{id:"peers--apiclient",children:["Peers \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get\nand delete Peers. The Peers API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers",children:"Peers"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Peers_new",children:"new Peers(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+createPeer",children:".createPeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+updatePeer",children:".updatePeer(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+getPeer",children:".getPeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+deletePeer",children:".deletePeer(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Peers+listPeers",children:".listPeers(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Peers_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-peersoptions",children:"new Peers(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Peer API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst peers = new SDK.Peers()\n\nconst request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+createPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peerscreatepeerrequest--promisecreatepeerresponse",children:["peers.createPeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreatePeerResponse>"})," - The newly created Peer",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreatePeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Asterisk Conference Server",\n username: "conference",\n aor: "sip:conference@sip.local",\n contactAddr: "10.0.0.1:5060",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,\n withSessionAffinity: true,\n enabled: true,\n extended: {\n "key": "value"\n }\n}\n\npeers.createPeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+updatePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersupdatepeerrequest--promiseupdatepeerresponse",children:["peers.updatePeer(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Peer on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdatePeerResponse>"})," - The updated Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdatePeerRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.aor"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Address of Record of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.contactAddr"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Optional contact address of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference of the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.credentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Credentials reference of the Credentials for the Peer"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.balancingAlgorithm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"LoadBalancingAlgorithm"})}),(0,r.jsx)(n.td,{children:'Optional balancing algorithm for the Peer (defaults to "round-robin")'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.withSessionAffinity"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer has session affinity or not (defaults to false)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.enabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:"Whether the Peer is enabled or not (for future use)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Feature Server"\n}\n\npeers.updatePeer(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+getPeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersgetpeerref--promisegetpeerresponse",children:["peers.getPeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetPeerResponse>"})," - The Peer"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.getPeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+deletePeer"}),"\n",(0,r.jsxs)(n.h3,{id:"peersdeletepeerref--promisevoid",children:["peers.deletePeer(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Peer from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Peer's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\npeers.deletePeer(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Peers+listPeers"}),"\n",(0,r.jsxs)(n.h3,{id:"peerslistpeersrequest--promiselistpeerresponse",children:["peers.listPeers(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Peers from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Peers",children:(0,r.jsx)("code",{children:"Peers"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListPeerResponse>"})," - The list of Peers in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListPeerRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Peers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Peers to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\npeers.listPeers(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})}),"\n",(0,r.jsx)("a",{name:"Trunks"}),"\n",(0,r.jsxs)(n.h2,{id:"trunks--apiclient",children:["Trunks \u21d0 ",(0,r.jsx)("code",{children:"APIClient"})]}),"\n",(0,r.jsx)(n.p,{children:"Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get\nand delete Trunks. The Trunks API requires of a running Routr deployment."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global class",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Extends"}),": ",(0,r.jsx)("code",{children:"APIClient"}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"See"}),": module:core",":APIClient"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks",children:"Trunks"})," \u21d0 ",(0,r.jsx)("code",{children:"APIClient"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#new_Trunks_new",children:"new Trunks(options)"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+createTrunk",children:".createTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+updateTrunk",children:".updateTrunk(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+getTrunk",children:".getTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+deleteTrunk",children:".deleteTrunk(ref)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"#Trunks+listTrunks",children:".listTrunks(request)"})," \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"new_Trunks_new"}),"\n",(0,r.jsx)(n.h3,{id:"new-trunksoptions",children:"new Trunks(options)"}),"\n",(0,r.jsx)(n.p,{children:"Constructs a new Trunk API object."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"options"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ClientOptions"})}),(0,r.jsx)(n.td,{children:"Options to indicate the objects endpoint"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const SDK = require("@routr/sdk")\nconst trunks = new SDK.Trunks()\n\nconst request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+createTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkscreatetrunkrequest--promisecreatetrunkresponse",children:["trunks.createTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<CreateTrunkResponse>"})," - The newly created Trunk",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"if request is null"}),"\n"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"CreateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to create an Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n name: "Trunk from Twilio",\n inboundUri: "sip:twilio.sip.acme.io",\n accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n uris: [{\n host: "acme.sip.twilio.com",\n port: 5060,\n transport: "udp",\n user: "AC1234567890",\n weight: 1,\n priority: 1\n }],\n extended: {\n "key": "value"\n }\n}\n\ntrunks.createTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+updateTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksupdatetrunkrequest--promiseupdatetrunkresponse",children:["trunks.updateTrunk(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Updates an already existing Trunk on Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<UpdateTrunkResponse>"})," - The updated Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"UpdateTrunkRequest"})}),(0,r.jsx)(n.td,{children:"Partial with the fields to update"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.name"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Name of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundUri"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Inbound URI of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.accessControlListRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"Access Control List reference"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.inboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the inbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.outboundCredentialsRef"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The reference of the outbound credentials"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.uris"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Array.<TrunkURI>"})}),(0,r.jsx)(n.td,{children:"The outbound URIs of the Trunk"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.extended"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"Object"})}),(0,r.jsx)(n.td,{children:"Optional extended attributes"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const request = {\n ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",\n name: "Trunk from Twilio (US-East)",\n}\n\ntrunks.updateTrunk(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+getTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksgettrunkref--promisegettrunkresponse",children:["trunks.getTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<GetTrunkResponse>"})," - The Trunk"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.getTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+deleteTrunk"}),"\n",(0,r.jsxs)(n.h3,{id:"trunksdeletetrunkref--promisevoid",children:["trunks.deleteTrunk(ref) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<void>"})]}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Trunk from Routr."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ref"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The Trunk's reference"})]})})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"\n\ntrunks.deleteTrunk(ref)\n .then(console.log)\n .catch(console.error) // an error occurred\n'})}),"\n",(0,r.jsx)("a",{name:"Trunks+listTrunks"}),"\n",(0,r.jsxs)(n.h3,{id:"trunkslisttrunksrequest--promiselisttrunkresponse",children:["trunks.listTrunks(request) \u21d2 ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})]}),"\n",(0,r.jsx)(n.p,{children:"Lists all Trunks from Routr with pagination."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,r.jsx)(n.a,{href:"#Trunks",children:(0,r.jsx)("code",{children:"Trunks"})}),(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<ListTrunkResponse>"})," - The list of Trunks in the current page"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"ListTrunkRequest"})}),(0,r.jsx)(n.td,{children:"The request to list Trunks"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageSize"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"number"})}),(0,r.jsx)(n.td,{children:"The number of Trunks to return"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"request.pageToken"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The page token to use for pagination"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:"const request = {\n pageSize: 10\n}\n\ntrunks.listTrunks(request)\n .then(console.log)\n .catch(console.error) // an error occurred\n"})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>c});var r=s(6540);const d={},t=r.createContext(d);function i(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8ab588d.06e68070.js b/assets/js/b8ab588d.185a788f.js similarity index 98% rename from assets/js/b8ab588d.06e68070.js rename to assets/js/b8ab588d.185a788f.js index d711e222e..43bc2f451 100644 --- a/assets/js/b8ab588d.06e68070.js +++ b/assets/js/b8ab588d.185a788f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5659],{5212:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=n(4848),r=n(8453);const a={},i="getGateway",o={id:"api/gateways/get",title:"getGateway",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/get.md",sourceDirName:"api/gateways",slug:"/api/gateways/get",permalink:"/docs/1.x.x/api/gateways/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"},next:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"}},c={},d=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getgateway",children:"getGateway"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var s=n(6540);const r={},a=s.createContext(r);function i(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5659],{9249:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=n(4848),r=n(8453);const a={},i="getGateway",o={id:"api/gateways/get",title:"getGateway",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/gateways/get.md",sourceDirName:"api/gateways",slug:"/api/gateways/get",permalink:"/docs/1.x.x/api/gateways/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/gateways/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteGateway",permalink:"/docs/1.x.x/api/gateways/delete"},next:{title:"listGateways",permalink:"/docs/1.x.x/api/gateways/list"}},c={},d=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getgateway",children:"getGateway"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/gateways/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/gateways/gw5c77t2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Gateway",\n \t"metadata": {\n \t\t"name": "Provider Inc.",\n "ref": "gw5c77t2"\n \t},\n \t"spec": {\n \t\t"host": "sip.provider.net",\n \t\t"credentials": {\n \t\t\t"username": "youruser",\n \t\t\t"secret": "yoursecret"\n \t\t},\n \t\t"transport": "udp"\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var s=n(6540);const r={},a=s.createContext(r);function i(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bb373259.65ebe2ba.js b/assets/js/bb373259.5b93075d.js similarity index 98% rename from assets/js/bb373259.65ebe2ba.js rename to assets/js/bb373259.5b93075d.js index f934d42ee..89c887280 100644 --- a/assets/js/bb373259.65ebe2ba.js +++ b/assets/js/bb373259.5b93075d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5804],{6501:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(4848),r=t(8453);const n={},s="Comparison",a={id:"introduction/comparison",title:"Comparison",description:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.",source:"@site/versioned_docs/version-1.x.x/introduction/comparison.md",sourceDirName:"introduction",slug:"/introduction/comparison",permalink:"/docs/1.x.x/introduction/comparison",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/comparison.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"},next:{title:"Community",permalink:"/docs/1.x.x/introduction/community"}},l={},c=[{value:"Routr vs Asterisk/FreeSWITCH?",id:"routr-vs-asteriskfreeswitch",level:2},{value:"Routr vs Kamailio/OpenSER?",id:"routr-vs-kamailioopenser",level:2},{value:"So what is the problem with Kamailio/OpenSER?",id:"so-what-is-the-problem-with-kamailioopenser",level:2},{value:"What can we do to make it better?",id:"what-can-we-do-to-make-it-better",level:2}];function d(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"comparison",children:"Comparison"}),"\n",(0,i.jsx)(o.p,{children:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-asteriskfreeswitch",children:"Routr vs Asterisk/FreeSWITCH?"}),"\n",(0,i.jsx)(o.p,{children:"Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses."}),"\n",(0,i.jsx)(o.p,{children:"Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-kamailioopenser",children:"Routr vs Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Proxy, Registrar, Location, Forking, Redirect"}),"\n",(0,i.jsx)(o.li,{children:"Load Balancing"}),"\n",(0,i.jsx)(o.li,{children:"Session Border Controller"}),"\n",(0,i.jsx)(o.li,{children:"Gateway to the PSTN"}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach."}),"\n",(0,i.jsx)(o.h2,{id:"so-what-is-the-problem-with-kamailioopenser",children:"So what is the problem with Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code."}),"\n",(0,i.jsx)(o.h2,{id:"what-can-we-do-to-make-it-better",children:"What can we do to make it better?"}),"\n",(0,i.jsx)(o.p,{children:"Our vision for a Next-generation SIP Server can be summarized as follows:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Make Routr Cloud-Native (After all it is 2019)"}),"\n",(0,i.jsx)(o.li,{children:"It does not require any coding / Most use-cases are configurable"}),"\n",(0,i.jsx)(o.li,{children:"Offer the tooling and APIs for easy extensibility"}),"\n",(0,i.jsx)(o.li,{children:"Great documentation"}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["If you want to support the initiative, please ",(0,i.jsx)(o.a,{href:"https://routr.io/docs/community",children:"join the discussion"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var i=t(6540);const r={},n=i.createContext(r);function s(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5804],{5254:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=t(4848),r=t(8453);const n={},s="Comparison",a={id:"introduction/comparison",title:"Comparison",description:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.",source:"@site/versioned_docs/version-1.x.x/introduction/comparison.md",sourceDirName:"introduction",slug:"/introduction/comparison",permalink:"/docs/1.x.x/introduction/comparison",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/comparison.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/introduction/installation"},next:{title:"Community",permalink:"/docs/1.x.x/introduction/community"}},l={},c=[{value:"Routr vs Asterisk/FreeSWITCH?",id:"routr-vs-asteriskfreeswitch",level:2},{value:"Routr vs Kamailio/OpenSER?",id:"routr-vs-kamailioopenser",level:2},{value:"So what is the problem with Kamailio/OpenSER?",id:"so-what-is-the-problem-with-kamailioopenser",level:2},{value:"What can we do to make it better?",id:"what-can-we-do-to-make-it-better",level:2}];function d(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.h1,{id:"comparison",children:"Comparison"}),"\n",(0,i.jsx)(o.p,{children:"A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-asteriskfreeswitch",children:"Routr vs Asterisk/FreeSWITCH?"}),"\n",(0,i.jsx)(o.p,{children:"Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses."}),"\n",(0,i.jsx)(o.p,{children:"Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role."}),"\n",(0,i.jsx)(o.h2,{id:"routr-vs-kamailioopenser",children:"Routr vs Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Proxy, Registrar, Location, Forking, Redirect"}),"\n",(0,i.jsx)(o.li,{children:"Load Balancing"}),"\n",(0,i.jsx)(o.li,{children:"Session Border Controller"}),"\n",(0,i.jsx)(o.li,{children:"Gateway to the PSTN"}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach."}),"\n",(0,i.jsx)(o.h2,{id:"so-what-is-the-problem-with-kamailioopenser",children:"So what is the problem with Kamailio/OpenSER?"}),"\n",(0,i.jsx)(o.p,{children:"Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code."}),"\n",(0,i.jsx)(o.h2,{id:"what-can-we-do-to-make-it-better",children:"What can we do to make it better?"}),"\n",(0,i.jsx)(o.p,{children:"Our vision for a Next-generation SIP Server can be summarized as follows:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Make Routr Cloud-Native (After all it is 2019)"}),"\n",(0,i.jsx)(o.li,{children:"It does not require any coding / Most use-cases are configurable"}),"\n",(0,i.jsx)(o.li,{children:"Offer the tooling and APIs for easy extensibility"}),"\n",(0,i.jsx)(o.li,{children:"Great documentation"}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["If you want to support the initiative, please ",(0,i.jsx)(o.a,{href:"https://routr.io/docs/community",children:"join the discussion"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var i=t(6540);const r={},n=i.createContext(r);function s(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc1a89ad.81431dea.js b/assets/js/bc1a89ad.55111a99.js similarity index 97% rename from assets/js/bc1a89ad.81431dea.js rename to assets/js/bc1a89ad.55111a99.js index 2f94fa207..ca0e5207d 100644 --- a/assets/js/bc1a89ad.81431dea.js +++ b/assets/js/bc1a89ad.55111a99.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6346],{9866:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>m,frontMatter:()=>c,metadata:()=>r,toc:()=>l});var o=n(4848),s=n(8453);const c={},i="Remote Access",r={id:"administration/cli/remote-access",title:"Remote Access",description:"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.",source:"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",sourceDirName:"administration/cli",slug:"/administration/cli/remote-access",permalink:"/docs/1.x.x/administration/cli/remote-access",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/remote-access.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"},next:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"}},a={},l=[];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"remote-access",children:"Remote Access"}),"\n",(0,o.jsxs)(t.p,{children:["By default, Routr installs a certificate that only allows for connections using the ",(0,o.jsx)(t.code,{children:"localhost"})," or ",(0,o.jsx)(t.code,{children:"127.0.0.1"}),". To use ",(0,o.jsx)(t.code,{children:"rctl"})," tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the ",(0,o.jsx)(t.code,{children:"spec.restService"})," section of the ",(0,o.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"Here is an example using a self-signed certificate(usually enough)."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n-noprompt \\\n-alias routr \\\n-keystore api-cert.jks \\\n-storepass changeit \\\n-keypass changeit \\\n-validity 365 \\\n-keysize 2048 \\\n-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Remember to place the certificate in the ",(0,o.jsx)(t.code,{children:"etc/certs"})," folder"]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var o=n(6540);const s={},c=o.createContext(s);function i(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6346],{9251:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>m,frontMatter:()=>c,metadata:()=>r,toc:()=>l});var o=n(4848),s=n(8453);const c={},i="Remote Access",r={id:"administration/cli/remote-access",title:"Remote Access",description:"By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.",source:"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",sourceDirName:"administration/cli",slug:"/administration/cli/remote-access",permalink:"/docs/1.x.x/administration/cli/remote-access",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/administration/cli/remote-access.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/docs/1.x.x/administration/cli/installation"},next:{title:"WebUI",permalink:"/docs/1.x.x/administration/webconsole"}},a={},l=[];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"remote-access",children:"Remote Access"}),"\n",(0,o.jsxs)(t.p,{children:["By default, Routr installs a certificate that only allows for connections using the ",(0,o.jsx)(t.code,{children:"localhost"})," or ",(0,o.jsx)(t.code,{children:"127.0.0.1"}),". To use ",(0,o.jsx)(t.code,{children:"rctl"})," tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the ",(0,o.jsx)(t.code,{children:"spec.restService"})," section of the ",(0,o.jsx)(t.code,{children:"config.yml"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"Here is an example using a self-signed certificate(usually enough)."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-bash",children:'keytool -genkey -keyalg RSA \\\n-noprompt \\\n-alias routr \\\n-keystore api-cert.jks \\\n-storepass changeit \\\n-keypass changeit \\\n-validity 365 \\\n-keysize 2048 \\\n-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \\\n-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1\n'})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Remember to place the certificate in the ",(0,o.jsx)(t.code,{children:"etc/certs"})," folder"]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var o=n(6540);const s={},c=o.createContext(s);function i(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc2f9ced.dba43639.js b/assets/js/bc2f9ced.156e3d44.js similarity index 98% rename from assets/js/bc2f9ced.dba43639.js rename to assets/js/bc2f9ced.156e3d44.js index 6040f127b..23ecf5b98 100644 --- a/assets/js/bc2f9ced.dba43639.js +++ b/assets/js/bc2f9ced.156e3d44.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5365],{4734:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var n=s(4848),r=s(8453);const i={},l="listPeers",d={id:"api/peers/list",title:"listPeers",description:"This method returns a list of Peer resources.",source:"@site/versioned_docs/version-1.x.x/api/peers/list.md",sourceDirName:"api/peers",slug:"/api/peers/list",permalink:"/docs/1.x.x/api/peers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"},next:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listpeers",children:"listPeers"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/peers"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>d});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5365],{5107:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var n=s(4848),r=s(8453);const i={},l="listPeers",d={id:"api/peers/list",title:"listPeers",description:"This method returns a list of Peer resources.",source:"@site/versioned_docs/version-1.x.x/api/peers/list.md",sourceDirName:"api/peers",slug:"/api/peers/list",permalink:"/docs/1.x.x/api/peers/list",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/peers/list.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"getPeer",permalink:"/docs/1.x.x/api/peers/get"},next:{title:"updatePeer",permalink:"/docs/1.x.x/api/peers/update"}},o={},c=[];function a(e){const t={a:"a",code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"listpeers",children:"listPeers"}),"\n",(0,n.jsx)(t.p,{children:"This method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"URL"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"/peers"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Method"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.code,{children:"GET"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Parameter Name"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,n.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"filter"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Use filter to narrow the elements shown"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"page"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Pagination index"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"itemsPerPage"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"query"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"number"}),(0,n.jsx)(t.td,{style:{textAlign:"left"},children:"Number of elements per request"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["Note: The filter parameter uses ",(0,n.jsx)(t.a,{href:"https://github.com/json-path/JsonPath",children:"JsonPath"})," format"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Request body"})}),"\n",(0,n.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Response"})}),"\n",(0,n.jsx)(t.p,{children:"If successful this method returns a list of Peer resources."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/peers\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "meta": {\n "currentPage": 1,\n "totalPages": 1,\n "itemsPerPage": 30,\n "totalItems": 1\n }, \n "data" : [{\n \t"apiVersion": "v1beta1",\n \t"kind": "Peer",\n \t"metadata": {\n \t\t"name": "Asterisk PBX",\n "ref": "pr2c77f4"\n \t},\n \t"spec": {\n \t\t"credentials": {\n \t\t\t"username": "ast",\n \t\t\t"secret": "1234"\n \t\t}\n \t}\n }]\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>l,x:()=>d});var n=s(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc843d59.8b91de39.js b/assets/js/bc843d59.8b91de39.js new file mode 100644 index 000000000..740d34642 --- /dev/null +++ b/assets/js/bc843d59.8b91de39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3797],{2257:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>a,frontMatter:()=>i,metadata:()=>d,toc:()=>h});var t=s(4848),n=s(8453);const i={},o="Registry Service",d={id:"development/components/registry",title:"Registry Service",description:"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.",source:"@site/docs/development/components/registry.md",sourceDirName:"development/components",slug:"/development/components/registry",permalink:"/docs/2.11.5/development/components/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/registry.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Location Service",permalink:"/docs/2.11.5/development/components/location"},next:{title:"Requester",permalink:"/docs/2.11.5/development/components/requester"}},c={},h=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Registry Service with Docker",id:"launching-the-registry-service-with-docker",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"registry-service",children:"Registry Service"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the ",(0,t.jsx)(r.code,{children:"spec.sendRegister"})," field set to true. The Registry service relies on the Requester service to send requests to the EdgePort."]}),"\n",(0,t.jsx)(r.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(r.p,{children:"To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"requesterAddr"})}),(0,t.jsx)(r.td,{children:"Address of service to send requests"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"apiAddr"})}),(0,t.jsx)(r.td,{children:"Address of API service"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registerInterval"})}),(0,t.jsxs)(r.td,{children:["Interval for sending registration requests (Defaults to ",(0,t.jsx)(r.code,{children:"60s"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache"})}),(0,t.jsx)(r.td,{children:"Cache configuration"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.provider"})}),(0,t.jsxs)(r.td,{children:["Accepts either ",(0,t.jsx)(r.code,{children:"memory"})," or ",(0,t.jsx)(r.code,{children:"redis"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.parameters"})}),(0,t.jsx)(r.td,{children:"Comma-separated key-value pairs"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"methods"})}),(0,t.jsx)(r.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts"})}),(0,t.jsx)(r.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.address"})}),(0,t.jsx)(r.td,{children:"Address of EdgePort"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.region"})}),(0,t.jsx)(r.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,t.jsx)(r.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"username"})}),(0,t.jsx)(r.td,{children:"Username (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"password"})}),(0,t.jsx)(r.td,{children:"Password (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"host"})}),(0,t.jsxs)(r.td,{children:["Redis host (Defaults to ",(0,t.jsx)(r.code,{children:"localhost"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"port"})}),(0,t.jsxs)(r.td,{children:["Redis port (Defaults to ",(0,t.jsx)(r.code,{children:"6379"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"secure"})}),(0,t.jsx)(r.td,{children:"Use secure connection for Redis"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"Here is an example of a configuration file:"}),"\n",(0,t.jsxs)(r.p,{children:["Filename: ",(0,t.jsx)(r.code,{children:"registry.yaml"})," or ",(0,t.jsx)(r.code,{children:"registry.json"})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(r.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(r.p,{children:"The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["Link to the ",(0,t.jsx)(r.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,t.jsx)(r.h2,{id:"launching-the-registry-service-with-docker",children:"Launching the Registry Service with Docker"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry Service is available as a Docker image from ",(0,t.jsx)(r.a,{href:"https://hub.docker.com/r/fonoster/routr-registry",children:"Docker Hub"}),". To launch the Registry Service with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address ",(0,t.jsx)(r.code,{children:"requester:51909"})," and the API service using the address ",(0,t.jsx)(r.code,{children:"apiserver:51907"}),"."]})]})}function a(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var t=s(6540);const n={},i=t.createContext(n);function o(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc843d59.b0cc575a.js b/assets/js/bc843d59.b0cc575a.js deleted file mode 100644 index 919eac30b..000000000 --- a/assets/js/bc843d59.b0cc575a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3797],{142:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>a,frontMatter:()=>i,metadata:()=>d,toc:()=>h});var t=s(4848),n=s(8453);const i={},o="Registry Service",d={id:"development/components/registry",title:"Registry Service",description:"The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.",source:"@site/docs/development/components/registry.md",sourceDirName:"development/components",slug:"/development/components/registry",permalink:"/docs/2.0.0/development/components/registry",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/registry.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"},next:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"}},c={},h=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Registry Service with Docker",id:"launching-the-registry-service-with-docker",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.h1,{id:"registry-service",children:"Registry Service"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the ",(0,t.jsx)(r.code,{children:"spec.sendRegister"})," field set to true. The Registry service relies on the Requester service to send requests to the EdgePort."]}),"\n",(0,t.jsx)(r.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,t.jsx)(r.p,{children:"To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"requesterAddr"})}),(0,t.jsx)(r.td,{children:"Address of service to send requests"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"apiAddr"})}),(0,t.jsx)(r.td,{children:"Address of API service"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"registerInterval"})}),(0,t.jsxs)(r.td,{children:["Interval for sending registration requests (Defaults to ",(0,t.jsx)(r.code,{children:"60s"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache"})}),(0,t.jsx)(r.td,{children:"Cache configuration"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.provider"})}),(0,t.jsxs)(r.td,{children:["Accepts either ",(0,t.jsx)(r.code,{children:"memory"})," or ",(0,t.jsx)(r.code,{children:"redis"})]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"cache.parameters"})}),(0,t.jsx)(r.td,{children:"Comma-separated key-value pairs"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"methods"})}),(0,t.jsx)(r.td,{children:"Acceptable SIP Methods (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts"})}),(0,t.jsx)(r.td,{children:"List of EdgePorts for outbound registrations"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.address"})}),(0,t.jsx)(r.td,{children:"Address of EdgePort"}),(0,t.jsx)(r.td,{children:"Yes"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"edgePorts.region"})}),(0,t.jsx)(r.td,{children:"Region of EdgePort (reserved for future use)"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,t.jsx)(r.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Description"}),(0,t.jsx)(r.th,{children:"Required"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"username"})}),(0,t.jsx)(r.td,{children:"Username (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"password"})}),(0,t.jsx)(r.td,{children:"Password (if required by Redis)"}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"host"})}),(0,t.jsxs)(r.td,{children:["Redis host (Defaults to ",(0,t.jsx)(r.code,{children:"localhost"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"port"})}),(0,t.jsxs)(r.td,{children:["Redis port (Defaults to ",(0,t.jsx)(r.code,{children:"6379"}),")"]}),(0,t.jsx)(r.td,{children:"No"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"secure"})}),(0,t.jsx)(r.td,{children:"Use secure connection for Redis"}),(0,t.jsx)(r.td,{children:"No"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"Here is an example of a configuration file:"}),"\n",(0,t.jsxs)(r.p,{children:["Filename: ",(0,t.jsx)(r.code,{children:"registry.yaml"})," or ",(0,t.jsx)(r.code,{children:"registry.json"})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-yaml",children:"kind: Registry\napiVersion: v2beta1\nspec:\n requesterAddr: requester:51909\n apiAddr: apiserver:51907\n cache:\n provider: memory\n methods:\n - INVITE\n - MESSAGE\n edgePorts:\n - address: sip01.edgeport.net:5060\n region: us-east1\n - address: sip02.edgeport.net:6060\n"})}),"\n",(0,t.jsx)(r.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,t.jsx)(r.p,{children:"The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["Link to the ",(0,t.jsx)(r.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,t.jsx)(r.h2,{id:"launching-the-registry-service-with-docker",children:"Launching the Registry Service with Docker"}),"\n",(0,t.jsxs)(r.p,{children:["The Registry Service is available as a Docker image from ",(0,t.jsx)(r.a,{href:"https://hub.docker.com/r/fonoster/routr-registry",children:"Docker Hub"}),". To launch the Registry Service with Docker, you can use the following command:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address ",(0,t.jsx)(r.code,{children:"requester:51909"})," and the API service using the address ",(0,t.jsx)(r.code,{children:"apiserver:51907"}),"."]})]})}function a(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var t=s(6540);const n={},i=t.createContext(n);function o(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c0ec735e.a3c35620.js b/assets/js/c0ec735e.a3c35620.js new file mode 100644 index 000000000..a380b8462 --- /dev/null +++ b/assets/js/c0ec735e.a3c35620.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4306],{3096:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=n(4848),o=n(8453);const s={},i="Ephemeral Agents in the Browser",a={id:"tutorials/ephemeral-agents-in-the-browser",title:"Ephemeral Agents in the Browser",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/tutorials/ephemeral-agents-in-the-browser.md",sourceDirName:"tutorials",slug:"/tutorials/ephemeral-agents-in-the-browser",permalink:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/tutorials/ephemeral-agents-in-the-browser.md",tags:[],version:"2.0.0",frontMatter:{}},c={},u=[];function l(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ephemeral-agents-in-the-browser",children:"Ephemeral Agents in the Browser"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c141421f.54c8e77c.js b/assets/js/c141421f.54c8e77c.js new file mode 100644 index 000000000..cd7918507 --- /dev/null +++ b/assets/js/c141421f.54c8e77c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[957],{936:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/c2140537.0324984d.js b/assets/js/c2140537.0324984d.js new file mode 100644 index 000000000..6c33337d1 --- /dev/null +++ b/assets/js/c2140537.0324984d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2080],{7205:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=t(4848),r=t(8453);const s={},i="Introduction",c={id:"development/introduction",title:"Introduction",description:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.",source:"@site/versioned_docs/version-2.0.0/development/introduction.md",sourceDirName:"development",slug:"/development/introduction",permalink:"/docs/2.0.0/development/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/introduction.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Deploy with Docker",permalink:"/docs/2.0.0/overview/deploy-with-docker"},next:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"}},l={},d=[{value:"How to read this section",id:"how-to-read-this-section",level:2},{value:"Tooling and dependencies",id:"tooling-and-dependencies",level:2}];function a(e){const o={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(o.p,{children:"Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware."}),"\n",(0,n.jsx)(o.p,{children:"Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool."}),"\n",(0,n.jsx)(o.h2,{id:"how-to-read-this-section",children:"How to read this section"}),"\n",(0,n.jsx)(o.p,{children:"The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most."}),"\n",(0,n.jsx)(o.h2,{id:"tooling-and-dependencies",children:"Tooling and dependencies"}),"\n",(0,n.jsx)(o.p,{children:"The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://www.docker.com/",children:"Docker"}),": We use Docker to build and run individual components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://docs.docker.com/compose/",children:"Docker Compose"}),": We use Docker Compose to orchestrate the components"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://helm.sh/",children:"Helm"}),": Helm helps us to deploy Routr in Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/",children:"Kubernetes"}),": Kubernetes is the platform where we deploy Routr for large scale deployments"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",children:"Kubectl"}),": Kubectl is the command-line tool for Kubernetes"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/irontec/sngrep",children:"sngrep"}),": A tool for monitoring SIP traffic (You could use Wireshark as well)"]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.a,{href:"https://github.com/fullstorydev/grpcurl",children:"grpcurl"}),": A command-line tool for interacting with gRPC servers"]}),"\n"]}),"\n",(0,n.jsxs)(o.p,{children:["If you don't have a Kubernetes cluster, you can use ",(0,n.jsx)(o.a,{href:"https://kubernetes.io/docs/tasks/tools/install-minikube/",children:"Minikube"})," or Docker Desktop with Kubernetes enabled."]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>c});var n=t(6540);const r={},s=n.createContext(r);function i(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2ef5137.5d772e09.js b/assets/js/c2ef5137.5d772e09.js new file mode 100644 index 000000000..8c74396f0 --- /dev/null +++ b/assets/js/c2ef5137.5d772e09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9465],{1026:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=n(4848),o=n(8453);const s={},i="Ephemeral Agents in the Browser",a={id:"tutorials/ephemeral-agents-in-the-browser",title:"Ephemeral Agents in the Browser",description:"Coming soon.",source:"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",sourceDirName:"tutorials",slug:"/tutorials/ephemeral-agents-in-the-browser",permalink:"/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/ephemeral-agents-in-the-browser.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ephemeral-agents-in-the-browser",children:"Ephemeral Agents in the Browser"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2ef5137.98ec0fa4.js b/assets/js/c2ef5137.98ec0fa4.js deleted file mode 100644 index 1dc91f769..000000000 --- a/assets/js/c2ef5137.98ec0fa4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9465],{6237:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=n(4848),o=n(8453);const s={},i="Ephemeral Agents in the Browser",a={id:"tutorials/ephemeral-agents-in-the-browser",title:"Ephemeral Agents in the Browser",description:"Coming soon.",source:"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",sourceDirName:"tutorials",slug:"/tutorials/ephemeral-agents-in-the-browser",permalink:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/ephemeral-agents-in-the-browser.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"ephemeral-agents-in-the-browser",children:"Ephemeral Agents in the Browser"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c3b57956.0340e127.js b/assets/js/c3b57956.0340e127.js new file mode 100644 index 000000000..cdc86089b --- /dev/null +++ b/assets/js/c3b57956.0340e127.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1579],{1890:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var t=o(4848),s=o(8453);const i={},r="Community",c={id:"community",title:"Community",description:"We are developing Routr in the open. These are the channels we use for communication and contribution:",source:"@site/versioned_docs/version-2.0.0/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/2.0.0/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/community.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"},next:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"}},d={},u=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(n.p,{children:"We are developing Routr in the open. These are the channels we use for communication and contribution:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://discord.com/invite/4QWgSz4hTC",children:"Discord community"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub discussions"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Twitter:"})," ",(0,t.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/issues",children:"Routr repository"})," to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsxs)(n.p,{children:["We welcome community contributions! Please see the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING.md"})," file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request."]}),"\n",(0,t.jsxs)(n.p,{children:["Development: ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(n.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(n.p,{children:"We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting."}),"\n",(0,t.jsx)(n.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(n.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(n.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (creator and maintainer)"]}),"\n",(0,t.jsx)(n.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(n.p,{children:["Routr was developed initially by ",(0,t.jsx)(n.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(n.a,{href:"https://fonoster.com",children:"Fonoster"})," and ",(0,t.jsx)(n.a,{href:"https://camanio.com",children:"Camanio AB"})," sponsored the majority of its development."]})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(6540);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c60c73ac.55950166.js b/assets/js/c60c73ac.55950166.js new file mode 100644 index 000000000..b63a32db8 --- /dev/null +++ b/assets/js/c60c73ac.55950166.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9537],{8134:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Requester",c={id:"development/components/requester",title:"Requester",description:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.",source:"@site/docs/development/components/requester.md",sourceDirName:"development/components",slug:"/development/components/requester",permalink:"/docs/2.11.5/development/components/requester",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/requester.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Registry Service",permalink:"/docs/2.11.5/development/components/registry"},next:{title:"RTPRelay",permalink:"/docs/2.11.5/development/components/rtprelay"}},u={},a=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Requester with Docker",id:"launching-the-requester-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"requester",children:"Requester"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses."}),"\n",(0,r.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service does not have a configuration file. However the following environment variables are available:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"BIND_ADDR"})," - Address to bind the service (Defaults to ",(0,r.jsx)(t.code,{children:"0.0.0.0:51909"}),")"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"ENABLE_HEALTHCHECKS"})," - Enable health checks (Defaults to ",(0,r.jsx)(t.code,{children:"true"}),")"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(t.p,{children:"Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Link to the ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(t.h2,{id:"launching-the-requester-with-docker",children:"Launching the Requester with Docker"}),"\n",(0,r.jsxs)(t.p,{children:["The Requester is available as a Docker image from ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-requester",children:"Docker Hub"}),". To launch the Requester with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"docker run -it -p 51909:51909 fonoster/routr-requester\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port ",(0,r.jsx)(t.code,{children:"51909"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port ",(0,r.jsx)(t.code,{children:"51909"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(t.p,{children:["One easy way to interact with the Requester for testing and development is to use ",(0,r.jsx)(t.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Requester using gRPCurl:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto requester.proto -d '{...}' \\\n localhost:51909 \\\n fonoster.routr.requester.v2beta1.Requester/SendMessage\n"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c60c73ac.f7a57bd6.js b/assets/js/c60c73ac.f7a57bd6.js deleted file mode 100644 index a50b8ec81..000000000 --- a/assets/js/c60c73ac.f7a57bd6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9537],{9175:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var r=n(4848),o=n(8453);const s={},i="Requester",c={id:"development/components/requester",title:"Requester",description:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.",source:"@site/docs/development/components/requester.md",sourceDirName:"development/components",slug:"/development/components/requester",permalink:"/docs/2.0.0/development/components/requester",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/requester.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"},next:{title:"RTPRelay",permalink:"/docs/2.0.0/development/components/rtprelay"}},u={},a=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Requester with Docker",id:"launching-the-requester-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"requester",children:"Requester"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses."}),"\n",(0,r.jsx)(t.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(t.p,{children:"The Requester service does not have a configuration file. However the following environment variables are available:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"BIND_ADDR"})," - Address to bind the service (Defaults to ",(0,r.jsx)(t.code,{children:"0.0.0.0:51909"}),")"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"ENABLE_HEALTHCHECKS"})," - Enable health checks (Defaults to ",(0,r.jsx)(t.code,{children:"true"}),")"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(t.p,{children:"Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.requester.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\nimport "processor.proto";\n\n// Requester service\nservice Requester {\n // Send Message Request\n rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}\n}\n\nmessage SendMessageRequest {\n string target = 1;\n fonoster.routr.processor.v2beta1.Method method = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;\n}\n\nmessage SendMessageResponse {\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Link to the ",(0,r.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/requester.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(t.h2,{id:"launching-the-requester-with-docker",children:"Launching the Requester with Docker"}),"\n",(0,r.jsxs)(t.p,{children:["The Requester is available as a Docker image from ",(0,r.jsx)(t.a,{href:"https://hub.docker.com/r/fonoster/routr-requester",children:"Docker Hub"}),". To launch the Requester with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"docker run -it -p 51909:51909 fonoster/routr-requester\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port ",(0,r.jsx)(t.code,{children:"51909"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port ",(0,r.jsx)(t.code,{children:"51909"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(t.p,{children:["One easy way to interact with the Requester for testing and development is to use ",(0,r.jsx)(t.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Requester using gRPCurl:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto requester.proto -d '{...}' \\\n localhost:51909 \\\n fonoster.routr.requester.v2beta1.Requester/SendMessage\n"})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var r=n(6540);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c76972da.edb03d27.js b/assets/js/c76972da.edb03d27.js new file mode 100644 index 000000000..d0150fba7 --- /dev/null +++ b/assets/js/c76972da.edb03d27.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8644],{7750:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var o=t(4848),s=t(8453);const i={},n="FAQs",a={id:"faqs",title:"FAQs",description:"What is Routr?",source:"@site/versioned_docs/version-2.0.0/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/docs/2.0.0/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/faqs.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributing Guide",permalink:"/docs/2.0.0/contributing"},next:{title:"Changelog",permalink:"/docs/2.0.0/changelog"}},c={},u=[{value:"What is Routr?",id:"what-is-routr",level:2},{value:"What dependencies does Routr have?",id:"what-dependencies-does-routr-have",level:2},{value:"How does Routr compare with other SIP servers",id:"how-does-routr-compare-with-other-sip-servers",level:2},{value:"Is Routr a Media Server?",id:"is-routr-a-media-server",level:2},{value:"Which language is the team using to build Routr?",id:"which-language-is-the-team-using-to-build-routr",level:2},{value:"What license does Routr use?",id:"what-license-does-routr-use",level:2}];function d(e){const r={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.h1,{id:"faqs",children:"FAQs"}),"\n",(0,o.jsx)(r.h2,{id:"what-is-routr",children:"What is Routr?"}),"\n",(0,o.jsx)(r.p,{children:"Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service."}),"\n",(0,o.jsx)(r.h2,{id:"what-dependencies-does-routr-have",children:"What dependencies does Routr have?"}),"\n",(0,o.jsx)(r.p,{children:"The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache."}),"\n",(0,o.jsx)(r.p,{children:"In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes."}),"\n",(0,o.jsx)(r.h2,{id:"how-does-routr-compare-with-other-sip-servers",children:"How does Routr compare with other SIP servers"}),"\n",(0,o.jsx)(r.p,{children:"Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently."}),"\n",(0,o.jsx)(r.p,{children:"For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one."}),"\n",(0,o.jsx)(r.h2,{id:"is-routr-a-media-server",children:"Is Routr a Media Server?"}),"\n",(0,o.jsx)(r.p,{children:"Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk."}),"\n",(0,o.jsxs)(r.blockquote,{children:["\n",(0,o.jsx)(r.p,{children:"This is useful when you need load balancing"}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"which-language-is-the-team-using-to-build-routr",children:"Which language is the team using to build Routr?"}),"\n",(0,o.jsx)(r.p,{children:"The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS."}),"\n",(0,o.jsx)(r.h2,{id:"what-license-does-routr-use",children:"What license does Routr use?"}),"\n",(0,o.jsxs)(r.p,{children:["We release Routr under the ",(0,o.jsx)(r.a,{href:"https://github.com/fonoster/routr/blob/main/LICENSE",children:"MIT license"}),"."]})]})}function l(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>n,x:()=>a});var o=t(6540);const s={},i=o.createContext(s);function n(e){const r=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),o.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9a0b018.6b8fe8d9.js b/assets/js/c9a0b018.6b8fe8d9.js new file mode 100644 index 000000000..b5cfde9a0 --- /dev/null +++ b/assets/js/c9a0b018.6b8fe8d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2489],{5029:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(4848),t=n(8453);const o={},c="Message Dispatcher",i={id:"development/components/dispatcher",title:"Message Dispatcher",description:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.",source:"@site/versioned_docs/version-2.0.0/development/components/dispatcher.md",sourceDirName:"development/components",slug:"/development/components/dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/components/dispatcher.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"EdgePort",permalink:"/docs/2.0.0/development/components/edgeport"},next:{title:"Location Service",permalink:"/docs/2.0.0/development/components/location"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Dispatcher with Docker",id:"launching-the-dispatcher-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"message-dispatcher",children:"Message Dispatcher"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware."}),"\n",(0,r.jsx)(s.p,{children:"The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor."}),"\n",(0,r.jsx)(s.p,{children:"The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-text",children:"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502 \u2502 \u2502 \n \u2502gRPC request \u2502 \u2502 \n \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502findProcessor() & forwardMessage()\u2502 \n \u2502 \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500>\u2502 \n \u2502 \u2502 \u2502 \n \u2502 \u2502 Processed Message \u2502 \n \u2502 \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \n \u2502 \u2502 \u2502 \n \u2502gRPC response\u2502 \u2502 \n \u2502<\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 \u2502 \n\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502EdgePort\u2502 \u2502Message Dispatcher\u2502 \u2502Message Processor\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,r.jsx)(s.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,r.jsx)(s.p,{children:"To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,r.jsx)(s.p,{children:"You can configure the Dispatcher using a YAML or JSON file that has the following structure:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Required"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Dispatcher"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.bindAddr"})}),(0,r.jsx)(s.td,{children:"Ipv4 interface to accept requests on"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors"})}),(0,r.jsx)(s.td,{children:"List of Processors"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].matchFunc"})}),(0,r.jsx)(s.td,{children:"Matching function"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.processors[*].methods"})}),(0,r.jsx)(s.td,{children:"List of SIP Methods supported by the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares"})}),(0,r.jsx)(s.td,{children:"List of Middlewares"}),(0,r.jsx)(s.td,{children:"No"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].ref"})}),(0,r.jsx)(s.td,{children:"Reference to the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].addr"})}),(0,r.jsx)(s.td,{children:"Address of the Middleware"}),(0,r.jsx)(s.td,{children:"Yes"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"spec.middlewares[*].postProcessor"})}),(0,r.jsx)(s.td,{children:"Whether to process the SIP Message after the Processor"}),(0,r.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here is an example of a configuration file:"}),"\n",(0,r.jsxs)(s.p,{children:["Filename: ",(0,r.jsx)(s.code,{children:"dispatcher.yaml"})," or ",(0,r.jsx)(s.code,{children:"dispatcher.json"})]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods:\n - REGISTER\n - MESSAGE\n - INVITE\n - ACK\n - BYE\n - CANCEL\n"})}),"\n",(0,r.jsx)(s.p,{children:"The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing."}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"matchFunc"})," is a javascript function that leverages the JSON representation of the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/sipmessage.proto",children:"SIPMessage"})," protobuf."]}),"\n",(0,r.jsx)(s.p,{children:"This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:'kind: MessageDispatcher\napiVersion: v2beta1\nref: message-dispatcher\nspec:\n bindAddr: 0.0.0.0:51901\n processors:\n - ref: im-processor\n addr: im:51904\n matchFunc: req => req.method === "MESSAGE"\n methods:\n - MESSAGE\n - ref: connect-processor\n addr: connect:51904\n matchFunc: req => true\n methods: \n - REGISTER\n - INVITE\n - ACK \n - BYE\n - CANCEL\n'})}),"\n",(0,r.jsx)(s.p,{children:"The following examples show typical matching functions:"}),"\n",(0,r.jsx)(s.p,{children:"Match all SIP Messages."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:"req => true\n"})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE"\n'})}),"\n",(0,r.jsx)(s.p,{children:"Match SIP Messages with a specific method and a specific header."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Match SIP Messages with a specific ",(0,r.jsx)(s.code,{children:"User-Agent"})," header."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-javascript",children:'req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))\n'})}),"\n",(0,r.jsx)(s.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,r.jsx)(s.p,{children:"The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,r.jsxs)(s.p,{children:["Link to the ",(0,r.jsx)(s.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,r.jsx)(s.h2,{id:"launching-the-dispatcher-with-docker",children:"Launching the Dispatcher with Docker"}),"\n",(0,r.jsxs)(s.p,{children:["The Message Dispatcher is available as a Docker image from ",(0,r.jsx)(s.a,{href:"https://hub.docker.com/r/fonoster/routr-dispatcher",children:"Docker Hub"}),". To launch the Dispatcher with Docker, you can use the following command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port ",(0,r.jsx)(s.code,{children:"51901"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,r.jsx)(s.code,{children:"51901"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,r.jsxs)(s.p,{children:["One easy way to interact with the Dispatcher for testing and development is to use ",(0,r.jsx)(s.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the Dispatcher."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function l(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>i});var r=n(6540);const t={},o=r.createContext(t);function c(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce58c4f8.8ba014e3.js b/assets/js/ce58c4f8.8ba014e3.js new file mode 100644 index 000000000..e7e890db3 --- /dev/null +++ b/assets/js/ce58c4f8.8ba014e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[5387],{5358:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=s(4848),t=s(8453);const a={},o="Building a Processor",i={id:"development/building-a-processor",title:"Building a Processor",description:"Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.",source:"@site/versioned_docs/version-2.0.0/development/building-a-processor.md",sourceDirName:"development",slug:"/development/building-a-processor",permalink:"/docs/2.0.0/development/building-a-processor",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/building-a-processor.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Alteration Methods",permalink:"/docs/2.0.0/development/alterations/methods"},next:{title:"Building a Middleware",permalink:"/docs/2.0.0/development/building-a-middleware"}},l={},c=[{value:"Processor Contract",id:"processor-contract",level:2},{value:"Building a Processor from a Template",id:"building-a-processor-from-a-template",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"building-a-processor",children:"Building a Processor"}),"\n",(0,r.jsxs)(n.p,{children:["Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the ",(0,r.jsx)(n.a,{href:"/docs/2.0.0/overview/concepts#alterations",children:"Alterations API"})," to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network."]}),"\n",(0,r.jsx)(n.p,{children:"Here is a non-exhaustive list of things you can do with a Processor:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Build an instant messaging application"}),"\n",(0,r.jsx)(n.li,{children:"Create a custom logic for a SCAIP system"}),"\n",(0,r.jsx)(n.li,{children:"Build a SIP Recorder when combined with RTPEngine"}),"\n",(0,r.jsx)(n.li,{children:"Doorbell Camera System integration"}),"\n",(0,r.jsx)(n.li,{children:"Custom logic for a SIP IoT system"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"processor-contract",children:"Processor Contract"}),"\n",(0,r.jsxs)(n.p,{children:["A Processor is a gRPC service that implements the ",(0,r.jsx)(n.code,{children:"Processor"})," interface. The interface is defined in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"processor.proto"})," file."]}),"\n",(0,r.jsx)(n.p,{children:"Here is the definition of the Processor interface:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of the calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid session information\n INFO = 12;\n // Asks the recipient to issue call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map<string, string> metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map<string, string> metadata = 3;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly."}),"\n",(0,r.jsx)(n.p,{children:"You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS."}),"\n",(0,r.jsx)(n.p,{children:"One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript."}),"\n",(0,r.jsx)(n.p,{children:"As an example, here is the JSON representation of a SIP REGISTER message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "ref": "AynhXaFtbdXwHrUEzt_rUQ..",\n "edgePortRef": "edgeport-01",\n "method": "REGISTER",\n "externalAddrs": ["200.22.21.42"],\n "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],\n "listeningPoints": [\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "TCP"\n },\n {\n "host": "0.0.0.0",\n "port": 5060,\n "transport": "UDP"\n }\n ],\n "sender": {\n "host": "127.0.0.1",\n "port": 36214,\n "transport": "TCP"\n },\n "message": {\n "via": [\n {\n "host": "proxy",\n "port": 5060,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n },\n {\n "host": "127.0.0.1",\n "port": 36214,\n "branch": "z9hG4bK-524287-1---7315a24d84546819",\n "transport": "TCP"\n }\n ],\n "extensions": [\n {\n "name": "CSeq",\n "value": "14 REGISTER"\n },\n {\n "name": "Allow",\n "value": "INVITE"\n },\n {\n "name": "User-Agent",\n "value": "Z 5.4.12 v2.10.13.2"\n },\n {\n "name": "Allow-Events",\n "value": "presence"\n }\n ],\n "from": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "UDP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "John Doe",\n "wildcard": false\n },\n "tag": "9041462a"\n },\n "to": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "tag": ""\n },\n "contact": {\n "address": {\n "uri": {\n "user": "1001",\n "userPassword": "",\n "host": "127.0.0.1",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 36214,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n },\n "expires": -1,\n "qValue": -1\n },\n "callId": {\n "callId": "AynhXaFtbdXwHrUEzt_rUQ.."\n },\n "contentLength": {\n "contentLength": 0\n },\n "maxForwards": {\n "maxForwards": 70\n },\n "expires": {\n "expires": 60\n },\n "recordRoute": [\n {\n "parameters": {\n "a": "1",\n "b": "2"\n },\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "route": [\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.127",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n },\n {\n "parameters": null,\n "address": {\n "uri": {\n "user": "",\n "userPassword": "",\n "host": "10.100.42.128",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "displayName": "",\n "wildcard": false\n }\n }\n ],\n "authorization": {\n "realm": "sip.local",\n "scheme": "Digest",\n "cNonce": "acbcc60094edde23f49b01e18bafd34e",\n "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",\n "algorithm": "MD5",\n "qop": "",\n "opaque": "",\n "response": "227fe247ff0b9fa4fcf2706b587bf995",\n "username": "1001",\n "uri": "sip:sip.local;transport=TCP",\n "nonceCount": 13\n },\n "requestUri": {\n "user": "",\n "userPassword": "",\n "host": "sip.local",\n "transportParam": "TCP",\n "mAddrParam": "",\n "methodParam": "",\n "userParam": "",\n "ttlParam": -1,\n "port": 5060,\n "lrParam": false,\n "secure": false\n },\n "messageType": "REQUEST"\n }\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"building-a-processor-from-a-template",children:"Building a Processor from a Template"}),"\n",(0,r.jsxs)(n.p,{children:["To make it easier to build processors, we provide a template you can use to get started. The template is available in the ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/nodejs-processor",children:"routr-processor-template."})]}),"\n",(0,r.jsxs)(n.p,{children:["To use the template, you must have ",(0,r.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"})," installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"npx degit fonoster/nodejs-processor my-processor\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The previous command will create a new folder called ",(0,r.jsx)(n.code,{children:"my-processor"})," with the following structure:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:".\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 commitlint.config.js\n\u251c\u2500\u2500 compose.yaml\n\u251c\u2500\u2500 package-lock.json\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 src\n\u2502 \u251c\u2500\u2500 envs.ts\n\u2502 \u251c\u2500\u2500 handlers.ts\n\u2502 \u2514\u2500\u2500 index.ts\n\u251c\u2500\u2500 test\n\u2502 \u2514\u2500\u2500 unit.test.ts\n\u2514\u2500\u2500 tsconfig.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The most important file is the ",(0,r.jsx)(n.code,{children:"handlers.ts"})," file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor."]}),"\n",(0,r.jsx)(n.p,{children:"From there, you can install the dependencies and start the processor:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd my-processor\nnpm install\nnpm start\n"})}),"\n",(0,r.jsx)(n.p,{children:"You may now start sending SIP messages to your processor from EdgePort or Dispatcher."})]})}function m(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d3c35fce.81e9ce52.js b/assets/js/d3c35fce.81e9ce52.js deleted file mode 100644 index 69082f143..000000000 --- a/assets/js/d3c35fce.81e9ce52.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2607],{6652:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="getDomain",d={id:"api/domains/get",title:"getDomain",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/get.md",sourceDirName:"api/domains",slug:"/api/domains/get",permalink:"/docs/1.x.x/api/domains/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"},next:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"}},c={},a=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getdomain",children:"getDomain"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d3c35fce.a2356879.js b/assets/js/d3c35fce.a2356879.js new file mode 100644 index 000000000..1d1130c7b --- /dev/null +++ b/assets/js/d3c35fce.a2356879.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2607],{219:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var s=n(4848),r=n(8453);const i={},o="getDomain",d={id:"api/domains/get",title:"getDomain",description:"This method returns a Gateway resource.",source:"@site/versioned_docs/version-1.x.x/api/domains/get.md",sourceDirName:"api/domains",slug:"/api/domains/get",permalink:"/docs/1.x.x/api/domains/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/domains/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteDomain",permalink:"/docs/1.x.x/api/domains/delete"},next:{title:"listDomains",permalink:"/docs/1.x.x/api/domains/list"}},c={},a=[];function l(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getdomain",children:"getDomain"}),"\n",(0,s.jsx)(t.p,{children:"This method returns a Gateway resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/domains/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns a Domain resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/domains/dm6c87r2\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Domain",\n \t"metadata": {\n \t\t"name": "Another Office",\n "ref": "dm6c87r2"\n \t},\n \t"spec": {\n \t\t"context": {\n \t\t\t"domainUri": "sip2.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d72ac48e.85dcda01.js b/assets/js/d72ac48e.85dcda01.js new file mode 100644 index 000000000..9bbfe6896 --- /dev/null +++ b/assets/js/d72ac48e.85dcda01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7063],{3938:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=r(4848),o=r(8453);const n={},c="Architecture",s={id:"overview/architecture",title:"Architecture",description:"Routr's architecture diagram",source:"@site/docs/overview/architecture.md",sourceDirName:"overview",slug:"/overview/architecture",permalink:"/docs/2.11.5/overview/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/architecture.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.11.5/overview/introduction"},next:{title:"Concepts",permalink:"/docs/2.11.5/overview/concepts"}},a={},d=[];function u(e){const t={a:"a",h1:"h1",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Routr's architecture diagram",src:r(5763).A+"",width:"1155",height:"715"})}),"\n",(0,i.jsx)(t.h1,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(t.p,{children:"Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled."}),"\n",(0,i.jsx)(t.h1,{id:"specification",children:"Specification"}),"\n",(0,i.jsx)(t.p,{children:"With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CORE.md",children:"Core Specification"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CONNECT.md",children:"Connect Specification"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing."}),"\n",(0,i.jsx)(t.p,{children:"The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more."}),"\n",(0,i.jsx)(t.p,{children:"Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},5763:(e,t,r)=>{r.d(t,{A:()=>i});const i=r.p+"assets/images/architecture_v2-8861306d8626ddea399b72e2aa55619e.png"},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>s});var i=r(6540);const o={},n=i.createContext(o);function c(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d72ac48e.b02011c0.js b/assets/js/d72ac48e.b02011c0.js deleted file mode 100644 index 948e23b5e..000000000 --- a/assets/js/d72ac48e.b02011c0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7063],{577:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=r(4848),o=r(8453);const n={},c="Architecture",s={id:"overview/architecture",title:"Architecture",description:"Routr's architecture diagram",source:"@site/docs/overview/architecture.md",sourceDirName:"overview",slug:"/overview/architecture",permalink:"/docs/2.0.0/overview/architecture",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/overview/architecture.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/docs/2.0.0/overview/introduction"},next:{title:"Concepts",permalink:"/docs/2.0.0/overview/concepts"}},a={},d=[];function u(e){const t={a:"a",h1:"h1",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Routr's architecture diagram",src:r(5763).A+"",width:"1221",height:"491"})}),"\n",(0,i.jsx)(t.h1,{id:"summary",children:"Summary"}),"\n",(0,i.jsx)(t.p,{children:"Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled."}),"\n",(0,i.jsx)(t.h1,{id:"specification",children:"Specification"}),"\n",(0,i.jsx)(t.p,{children:"With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CORE.md",children:"Core Specification"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/fonoster/routr/blob/master/docs/specs/CONNECT.md",children:"Connect Specification"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing."}),"\n",(0,i.jsx)(t.p,{children:"The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more."}),"\n",(0,i.jsx)(t.p,{children:"Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them."})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},5763:(e,t,r)=>{r.d(t,{A:()=>i});const i=r.p+"assets/images/architecture_v2-d563de2e0748455c8332bf19f5e68090.png"},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>s});var i=r(6540);const o={},n=i.createContext(o);function c(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d7a9d534.6fa4cd2d.js b/assets/js/d7a9d534.6fa4cd2d.js new file mode 100644 index 000000000..4687f6dd6 --- /dev/null +++ b/assets/js/d7a9d534.6fa4cd2d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[286],{1098:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>a,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var t=o(4848),r=o(8453);const c={},s="Introduction",i={id:"connect/introduction",title:"Introduction",description:"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.",source:"@site/docs/connect/introduction.md",sourceDirName:"connect",slug:"/connect/introduction",permalink:"/docs/2.11.5/connect/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Extending the Command-Line Tool",permalink:"/docs/2.11.5/development/extending-the-ctl"},next:{title:"Concepts",permalink:"/docs/2.11.5/connect/concepts"}},d={},l=[];function u(e){const n={code:"code",h1:"h1",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of ",(0,t.jsx)(n.code,{children:"Agents"}),", ",(0,t.jsx)(n.code,{children:"Peers"}),", ",(0,t.jsx)(n.code,{children:"Trunks"}),", ",(0,t.jsx)(n.code,{children:"Numbers"}),", ",(0,t.jsx)(n.code,{children:"Credentials"}),", and ",(0,t.jsx)(n.code,{children:"ACL"}),". It is the most common way to deploy Routr."]}),"\n",(0,t.jsx)(n.p,{children:"In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr."}),"\n",(0,t.jsx)(n.p,{children:"Some of the use cases for the Connect Mode are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Power your office or home phone system"}),"\n",(0,t.jsx)(n.li,{children:"Create an Intercom network"}),"\n",(0,t.jsx)(n.li,{children:"Power a SIP network on a CPaaS"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to the PSTN"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to Microsoft Teams (coming soon)"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to AWS Chime (coming soon)"}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>i});var t=o(6540);const r={},c=t.createContext(r);function s(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d7a9d534.acc28f6a.js b/assets/js/d7a9d534.acc28f6a.js deleted file mode 100644 index ccb479946..000000000 --- a/assets/js/d7a9d534.acc28f6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[286],{5151:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>a,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var t=o(4848),r=o(8453);const c={},s="Introduction",i={id:"connect/introduction",title:"Introduction",description:"The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.",source:"@site/docs/connect/introduction.md",sourceDirName:"connect",slug:"/connect/introduction",permalink:"/docs/2.0.0/connect/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Extending the Command-Line Tool",permalink:"/docs/2.0.0/development/extending-the-ctl"},next:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"}},d={},l=[];function u(e){const n={code:"code",h1:"h1",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of ",(0,t.jsx)(n.code,{children:"Agents"}),", ",(0,t.jsx)(n.code,{children:"Peers"}),", ",(0,t.jsx)(n.code,{children:"Trunks"}),", ",(0,t.jsx)(n.code,{children:"Numbers"}),", ",(0,t.jsx)(n.code,{children:"Credentials"}),", and ",(0,t.jsx)(n.code,{children:"ACL"}),". It is the most common way to deploy Routr."]}),"\n",(0,t.jsx)(n.p,{children:"In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr."}),"\n",(0,t.jsx)(n.p,{children:"Some of the use cases for the Connect Mode are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Power your office or home phone system"}),"\n",(0,t.jsx)(n.li,{children:"Create an Intercom network"}),"\n",(0,t.jsx)(n.li,{children:"Power a SIP network on a CPaaS"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to the PSTN"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to Microsoft Teams (coming soon)"}),"\n",(0,t.jsx)(n.li,{children:"Connect your phone system to AWS Chime (coming soon)"}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>i});var t=o(6540);const r={},c=t.createContext(r);function s(e){const n=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/da51cc8f.b5045421.js b/assets/js/da51cc8f.c628b2bf.js similarity index 99% rename from assets/js/da51cc8f.b5045421.js rename to assets/js/da51cc8f.c628b2bf.js index 26dc573a6..082929aca 100644 --- a/assets/js/da51cc8f.b5045421.js +++ b/assets/js/da51cc8f.c628b2bf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9692],{3997:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var s=i(4848),t=i(8453);const r={},o="Basic Setup",c={id:"guides/basic-setup",title:"Basic Setup",description:"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.",source:"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",sourceDirName:"guides",slug:"/guides/basic-setup",permalink:"/docs/1.x.x/guides/basic-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/basic-setup.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Users",permalink:"/docs/1.x.x/configuration/users"},next:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"}},a={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Setting up the Server",id:"setting-up-the-server",level:2},{value:"Configuring the Gateway",id:"configuring-the-gateway",level:3},{value:"Configuring the Number",id:"configuring-the-number",level:3},{value:"Creating a new Domain and EgressPolicy",id:"creating-a-new-domain-and-egresspolicy",level:3},{value:"Creating the Agents",id:"creating-the-agents",level:3},{value:"Configuring the SIP devices",id:"configuring-the-sip-devices",level:2},{value:"Making calls",id:"making-calls",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"basic-setup",children:"Basic Setup"}),"\n",(0,s.jsxs)(n.p,{children:["This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Content"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-gateway",children:"Configuring the Gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-number",children:"Configuring the Number "})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-the-agents",children:"Creating the Agents"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-sip-devices",children:"Configuring the SIP devices"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#making-calls",children:"Making calls"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#whats-next",children:"What's Next"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Two SIP phones connected to the same LAN"}),"\n",(0,s.jsx)(n.li,{children:"A fresh installation of Routr"}),"\n",(0,s.jsxs)(n.li,{children:["SIP providers such as ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.p,{children:["A set of sample configuration covering this scenario is available in the Github ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/master/config",children:"repo"}),". You might overwrite the files in the ",(0,s.jsx)(n.code,{children:"config"})," folder if you wish to skip this section."]}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-gateway",children:"Configuring the Gateway"}),"\n",(0,s.jsxs)(n.p,{children:["To configure the Gateway, you must consult your SIP provider and obtain the credentials and ",(0,s.jsx)(n.code,{children:"registration host"}),". The key fields for the configuration are ",(0,s.jsx)(n.code,{children:"metadata.ref"}),", ",(0,s.jsx)(n.code,{children:"spec.regService.host"})," and ",(0,s.jsx)(n.code,{children:"spec.regService.credentials"}),". Here is an example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider Inc\n spec:\n host: sip.provider.net\n credentials:\n username: 'youruser'\n secret: 'yoursecret'\n transport: udp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-number",children:"Configuring the Number"}),"\n",(0,s.jsxs)(n.p,{children:["To configure your Number or virtual number, you must open and edit the file ",(0,s.jsx)(n.code,{children:"config/numbers.yml"}),". Notice in the example below, how your reference the Gateway by using the field ",(0,s.jsx)(n.code,{children:"metadata.geRef"}),". The key field while configuring Numbers are ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," and ",(0,s.jsx)(n.code,{children:"spec.location.aorLink"}),". Keep in mind that the value in ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," must be formatted, precisely, as sent by the provider."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: gweef506\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:1001@sip.local'\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Routr"})," is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an ",(0,s.jsx)(n.em,{children:"EgressPolicy"})," to allow calls outside the Domain. Here is how the file ",(0,s.jsx)(n.code,{children:"config/domains.yml"})," needs to look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: dd50baa4\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-the-agents",children:"Creating the Agents"}),"\n",(0,s.jsxs)(n.p,{children:["We now create the Agents ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"}),". Keep in mind that field ",(0,s.jsx)(n.code,{children:"spec.credentials.username"})," can be alphanumeric, so ",(0,s.jsx)(n.code,{children:"john"})," or ",(0,s.jsx)(n.code,{children:"john001"})," is also acceptable."]}),"\n",(0,s.jsx)(n.p,{children:"Pay close attention to the credentials block since it contains the username and secret for both Agents."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: '1001'\n secret: '1234'\n domains: [sip.local]\n- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: '1002'\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["To verify your configuration, start the server by issuing the command ",(0,s.jsx)(n.code,{children:"routr"}),". In a separate window, use the following commands:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get number"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get domain"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get agents"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Your output should be as follows:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Starting the Server"})}),"\n",(0,s.jsx)("img",{src:"/img/starting_server.png",width:"600"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Verifying the Configuration"})}),"\n",(0,s.jsx)("img",{src:"/img/verify_configuration.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"configuring-the-sip-devices",children:"Configuring the SIP devices"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Configure your softphone using the information you gather in the last step. Start by completing only the required information: ",(0,s.jsx)(n.em,{children:"username"}),", ",(0,s.jsx)(n.em,{children:"domain"}),", ",(0,s.jsx)(n.em,{children:"password"}),". Also, In the advanced section use the server's ",(0,s.jsx)(n.strong,{children:"IP"})," as your ",(0,s.jsx)(n.em,{children:"Registry Server"})," and ",(0,s.jsx)(n.em,{children:"Proxy"}),". Here is how mine looks like:"]}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_general.png",width:"500"}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_advanced.png",width:"500"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'Make sure to check the box "Use this account" to register your device'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the ",(0,s.jsx)(n.code,{children:".rctl locate"})," to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"})," are present in the location service and therefore, can reach each other."]}),"\n",(0,s.jsx)("img",{src:"/img/locate_agents.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"making-calls",children:"Making calls"}),"\n",(0,s.jsxs)(n.p,{children:["The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: ",(0,s.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"})," or ",(0,s.jsx)(n.a,{href:"mailto:7853178060@sip.local",children:"7853178060@sip.local"}),")."]}),"\n",(0,s.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,s.jsxs)(n.p,{children:["You can check out the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"https://github.com/fonoster../wiki/Home"})," to see more examples. If you have any questions, start an issue or contact us via:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Twitter: ",(0,s.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,s.jsxs)(n.li,{children:["Email: ",(0,s.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9692],{1820:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var s=i(4848),t=i(8453);const r={},o="Basic Setup",c={id:"guides/basic-setup",title:"Basic Setup",description:"This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.",source:"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",sourceDirName:"guides",slug:"/guides/basic-setup",permalink:"/docs/1.x.x/guides/basic-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/guides/basic-setup.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Users",permalink:"/docs/1.x.x/configuration/users"},next:{title:"Routr as Asterisk frontend",permalink:"/docs/1.x.x/guides/routr-as-asterisk-frontend"}},a={},l=[{value:"Requirements",id:"requirements",level:2},{value:"Setting up the Server",id:"setting-up-the-server",level:2},{value:"Configuring the Gateway",id:"configuring-the-gateway",level:3},{value:"Configuring the Number",id:"configuring-the-number",level:3},{value:"Creating a new Domain and EgressPolicy",id:"creating-a-new-domain-and-egresspolicy",level:3},{value:"Creating the Agents",id:"creating-the-agents",level:3},{value:"Configuring the SIP devices",id:"configuring-the-sip-devices",level:2},{value:"Making calls",id:"making-calls",level:2},{value:"What's Next?",id:"whats-next",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"basic-setup",children:"Basic Setup"}),"\n",(0,s.jsxs)(n.p,{children:["This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Content"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#requirements",children:"Requirements"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-gateway",children:"Configuring the Gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-number",children:"Configuring the Number "})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-the-agents",children:"Creating the Agents"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#configuring-the-sip-devices",children:"Configuring the SIP devices"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#making-calls",children:"Making calls"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#whats-next",children:"What's Next"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsx)(n.p,{children:"This tutorial assumes the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Two SIP phones connected to the same LAN"}),"\n",(0,s.jsx)(n.li,{children:"A fresh installation of Routr"}),"\n",(0,s.jsxs)(n.li,{children:["SIP providers such as ",(0,s.jsx)(n.code,{children:"voip.ms"})," or ",(0,s.jsx)(n.code,{children:"did.logic.com"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-the-server",children:"Setting up the Server"}),"\n",(0,s.jsxs)(n.p,{children:["A set of sample configuration covering this scenario is available in the Github ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/tree/master/config",children:"repo"}),". You might overwrite the files in the ",(0,s.jsx)(n.code,{children:"config"})," folder if you wish to skip this section."]}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-gateway",children:"Configuring the Gateway"}),"\n",(0,s.jsxs)(n.p,{children:["To configure the Gateway, you must consult your SIP provider and obtain the credentials and ",(0,s.jsx)(n.code,{children:"registration host"}),". The key fields for the configuration are ",(0,s.jsx)(n.code,{children:"metadata.ref"}),", ",(0,s.jsx)(n.code,{children:"spec.regService.host"})," and ",(0,s.jsx)(n.code,{children:"spec.regService.credentials"}),". Here is an example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Provider Inc\n spec:\n host: sip.provider.net\n credentials:\n username: 'youruser'\n secret: 'yoursecret'\n transport: udp\n"})}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-number",children:"Configuring the Number"}),"\n",(0,s.jsxs)(n.p,{children:["To configure your Number or virtual number, you must open and edit the file ",(0,s.jsx)(n.code,{children:"config/numbers.yml"}),". Notice in the example below, how your reference the Gateway by using the field ",(0,s.jsx)(n.code,{children:"metadata.geRef"}),". The key field while configuring Numbers are ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," and ",(0,s.jsx)(n.code,{children:"spec.location.aorLink"}),". Keep in mind that the value in ",(0,s.jsx)(n.code,{children:"spec.location.telUrl"})," must be formatted, precisely, as sent by the provider."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: gweef506\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:1001@sip.local'\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-a-new-domain-and-egresspolicy",children:"Creating a new Domain and EgressPolicy"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Routr"})," is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an ",(0,s.jsx)(n.em,{children:"EgressPolicy"})," to allow calls outside the Domain. Here is how the file ",(0,s.jsx)(n.code,{children:"config/domains.yml"})," needs to look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n egressPolicy:\n rule: .*\n numberRef: dd50baa4\n"})}),"\n",(0,s.jsx)(n.h3,{id:"creating-the-agents",children:"Creating the Agents"}),"\n",(0,s.jsxs)(n.p,{children:["We now create the Agents ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"}),". Keep in mind that field ",(0,s.jsx)(n.code,{children:"spec.credentials.username"})," can be alphanumeric, so ",(0,s.jsx)(n.code,{children:"john"})," or ",(0,s.jsx)(n.code,{children:"john001"})," is also acceptable."]}),"\n",(0,s.jsx)(n.p,{children:"Pay close attention to the credentials block since it contains the username and secret for both Agents."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: '1001'\n secret: '1234'\n domains: [sip.local]\n- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: '1002'\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["To verify your configuration, start the server by issuing the command ",(0,s.jsx)(n.code,{children:"routr"}),". In a separate window, use the following commands:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get gateway"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get number"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get domain"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"rctl get agents"})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Your output should be as follows:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Starting the Server"})}),"\n",(0,s.jsx)("img",{src:"/img/starting_server.png",width:"600"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Verifying the Configuration"})}),"\n",(0,s.jsx)("img",{src:"/img/verify_configuration.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"configuring-the-sip-devices",children:"Configuring the SIP devices"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Configure your softphone using the information you gather in the last step. Start by completing only the required information: ",(0,s.jsx)(n.em,{children:"username"}),", ",(0,s.jsx)(n.em,{children:"domain"}),", ",(0,s.jsx)(n.em,{children:"password"}),". Also, In the advanced section use the server's ",(0,s.jsx)(n.strong,{children:"IP"})," as your ",(0,s.jsx)(n.em,{children:"Registry Server"})," and ",(0,s.jsx)(n.em,{children:"Proxy"}),". Here is how mine looks like:"]}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_general.png",width:"500"}),"\n",(0,s.jsx)("img",{src:"/img/telephone_config_advanced.png",width:"500"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:'Make sure to check the box "Use this account" to register your device'}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the ",(0,s.jsx)(n.code,{children:".rctl locate"})," to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both ",(0,s.jsx)(n.code,{children:"1001"})," and ",(0,s.jsx)(n.code,{children:"1002"})," are present in the location service and therefore, can reach each other."]}),"\n",(0,s.jsx)("img",{src:"/img/locate_agents.png",width:"600"}),"\n",(0,s.jsx)(n.h2,{id:"making-calls",children:"Making calls"}),"\n",(0,s.jsxs)(n.p,{children:["The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: ",(0,s.jsx)(n.a,{href:"mailto:1001@sip.local",children:"1001@sip.local"})," or ",(0,s.jsx)(n.a,{href:"mailto:7853178060@sip.local",children:"7853178060@sip.local"}),")."]}),"\n",(0,s.jsx)(n.h2,{id:"whats-next",children:"What's Next?"}),"\n",(0,s.jsxs)(n.p,{children:["You can check out the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster../wiki/Home",children:"https://github.com/fonoster../wiki/Home"})," to see more examples. If you have any questions, start an issue or contact us via:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Twitter: ",(0,s.jsx)(n.a,{href:"https://twitter.com/fonoster",children:"@fonoster"})]}),"\n",(0,s.jsxs)(n.li,{children:["Email: ",(0,s.jsx)(n.a,{href:"mailto:fonosterteam@fonoster.com",children:"fonosterteam@fonoster.com"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/db24a52a.ddf6b280.js b/assets/js/db24a52a.ddf6b280.js new file mode 100644 index 000000000..6491f3a2f --- /dev/null +++ b/assets/js/db24a52a.ddf6b280.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6842],{8818:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var r=t(4848),o=t(8453);const s={},c="Securing the Server",i={id:"connect/securing-the-server",title:"Securing the Server",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/connect/securing-the-server.md",sourceDirName:"connect",slug:"/connect/securing-the-server",permalink:"/docs/2.0.0/connect/securing-the-server",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/securing-the-server.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"},next:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"}},u={},d=[];function a(e){const n={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"securing-the-server",children:"Securing the Server"}),"\n",(0,r.jsx)(n.p,{children:"Coming soon."})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var r=t(6540);const o={},s=r.createContext(o);function c(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/db70960d.11bf4ef4.js b/assets/js/db70960d.11bf4ef4.js new file mode 100644 index 000000000..9d24166cb --- /dev/null +++ b/assets/js/db70960d.11bf4ef4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6549],{3736:(t,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=o(4848),e=o(8453);const s={},i="Load-balancing Asterisk with Routr",a={id:"tutorials/load-balancing-asterisk-with-routr",title:"Load-balancing Asterisk with Routr",description:"Coming soon.",source:"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",sourceDirName:"tutorials",slug:"/tutorials/load-balancing-asterisk-with-routr",permalink:"/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/load-balancing-asterisk-with-routr.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(t){const n={h1:"h1",p:"p",...(0,e.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"load-balancing-asterisk-with-routr",children:"Load-balancing Asterisk with Routr"}),"\n",(0,r.jsx)(n.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:n}={...(0,e.R)(),...t.components};return n?(0,r.jsx)(n,{...t,children:(0,r.jsx)(l,{...t})}):l(t)}},8453:(t,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var r=o(6540);const e={},s=r.createContext(e);function i(t){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(e):t.components||e:i(t.components),r.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/db70960d.892a5e80.js b/assets/js/db70960d.892a5e80.js deleted file mode 100644 index ebe3971ce..000000000 --- a/assets/js/db70960d.892a5e80.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6549],{5214:(t,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var r=o(4848),e=o(8453);const s={},i="Load-balancing Asterisk with Routr",a={id:"tutorials/load-balancing-asterisk-with-routr",title:"Load-balancing Asterisk with Routr",description:"Coming soon.",source:"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",sourceDirName:"tutorials",slug:"/tutorials/load-balancing-asterisk-with-routr",permalink:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/tutorials/load-balancing-asterisk-with-routr.md",tags:[],version:"current",frontMatter:{}},c={},u=[];function l(t){const n={h1:"h1",p:"p",...(0,e.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"load-balancing-asterisk-with-routr",children:"Load-balancing Asterisk with Routr"}),"\n",(0,r.jsx)(n.p,{children:"Coming soon."})]})}function d(t={}){const{wrapper:n}={...(0,e.R)(),...t.components};return n?(0,r.jsx)(n,{...t,children:(0,r.jsx)(l,{...t})}):l(t)}},8453:(t,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var r=o(6540);const e={},s=r.createContext(e);function i(t){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(e):t.components||e:i(t.components),r.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/e10372bb.a6b796c3.js b/assets/js/e10372bb.a6b796c3.js new file mode 100644 index 000000000..d40b59da3 --- /dev/null +++ b/assets/js/e10372bb.a6b796c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[49],{8106:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>u,contentTitle:()=>i,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(4848),s=n(8453);const r={},i="Community",c={id:"introduction/community",title:"Community",description:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:",source:"@site/versioned_docs/version-1.x.x/introduction/community.md",sourceDirName:"introduction",slug:"/introduction/community",permalink:"/docs/1.x.x/introduction/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/community.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"},next:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function l(e){const o={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(o.p,{children:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://discord.com/invite/mpWSRUhG7e",children:"Discord community"}),"\n",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.strong,{children:"User mailing lists:"})}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-announce",children:"routr-announce"})," \u2013 for announcements like new releases"]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-users",children:"routr-users"})," \u2013 for discussions around Routr usage and community support"]}),"\n"]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Twitter:"})," ",(0,t.jsx)(o.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for the various ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/",children:"Routr repositories"})," to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue."]}),"\n",(0,t.jsxs)(o.blockquote,{children:["\n",(0,t.jsx)(o.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsx)(o.p,{children:"We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request."}),"\n",(0,t.jsxs)(o.p,{children:["Development: ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(o.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(o.p,{children:"We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019."}),"\n",(0,t.jsx)(o.p,{children:"2019 developer summit notes (Come back to see updated link)"}),"\n",(0,t.jsx)(o.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(o.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(o.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (independent contractor)"]}),"\n",(0,t.jsx)(o.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(o.p,{children:["Routr was developed initially by ",(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(o.a,{href:"https://fonoster.com",children:"Fonoster"})," sponsored the majority of its development."]}),"\n",(0,t.jsx)(o.p,{children:"Pedro Sanders contributed Routr's logo."})]})}function a(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>c});var t=n(6540);const s={},r=t.createContext(s);function i(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e10372bb.f875b5b9.js b/assets/js/e10372bb.f875b5b9.js deleted file mode 100644 index 698735653..000000000 --- a/assets/js/e10372bb.f875b5b9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[49],{123:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>u,contentTitle:()=>i,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(4848),s=n(8453);const r={},i="Community",c={id:"introduction/community",title:"Community",description:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:",source:"@site/versioned_docs/version-1.x.x/introduction/community.md",sourceDirName:"introduction",slug:"/introduction/community",permalink:"/docs/1.x.x/introduction/community",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/community.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Comparison",permalink:"/docs/1.x.x/introduction/comparison"},next:{title:"Roadmap",permalink:"/docs/1.x.x/introduction/roadmap"}},u={},d=[{value:"Contributing",id:"contributing",level:2},{value:"Developer Summits",id:"developer-summits",level:2},{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"Commercial Support",id:"commercial-support",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2}];function l(e){const o={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h1,{id:"community",children:"Community"}),"\n",(0,t.jsx)(o.p,{children:"Routr is developed in the open. Here are some of the channels we use to communicate and contribute:"}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://discord.com/invite/mpWSRUhG7e",children:"Discord community"}),"\n",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})]}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.strong,{children:"User mailing lists:"})}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-announce",children:"routr-announce"})," \u2013 for announcements like new releases"]}),"\n",(0,t.jsxs)(o.li,{children:[(0,t.jsx)(o.a,{href:"https://groups.google.com/forum/#!forum/routr-users",children:"routr-users"})," \u2013 for discussions around Routr usage and community support"]}),"\n"]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Twitter:"})," ",(0,t.jsx)(o.a,{href:"https://twitter.com/fonoster",children:"@Fonoster"})]}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.strong,{children:"Issue tracker:"})," Use the GitHub issue tracker for the various ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/",children:"Routr repositories"})," to file bugs and features request. If you need support, please send your questions to the routr-users mailing list rather than filing a GitHub issue."]}),"\n",(0,t.jsxs)(o.blockquote,{children:["\n",(0,t.jsx)(o.p,{children:"Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"contributing",children:"Contributing"}),"\n",(0,t.jsx)(o.p,{children:"We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request."}),"\n",(0,t.jsxs)(o.p,{children:["Development: ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/discussions",children:"GitHub Discussions"})," \u2013 for discussions around Routr development"]}),"\n",(0,t.jsx)(o.h2,{id:"developer-summits",children:"Developer Summits"}),"\n",(0,t.jsx)(o.p,{children:"We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019."}),"\n",(0,t.jsx)(o.p,{children:"2019 developer summit notes (Come back to see updated link)"}),"\n",(0,t.jsx)(o.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,t.jsxs)(o.p,{children:["To make Routr a welcoming and harassment-free experience for everyone, we follow the ",(0,t.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/master/CODE_OF_CONDUCT.md",children:"Contributor Covenant Code of Conduct"}),"."]}),"\n",(0,t.jsx)(o.h2,{id:"commercial-support",children:"Commercial Support"}),"\n",(0,t.jsx)(o.p,{children:"The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically."}),"\n",(0,t.jsxs)(o.p,{children:[(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"})," (independent contractor)"]}),"\n",(0,t.jsx)(o.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,t.jsxs)(o.p,{children:["Routr was developed initially by ",(0,t.jsx)(o.a,{href:"https://github.com/psanders",children:"Pedro Sanders"}),". ",(0,t.jsx)(o.a,{href:"https://fonoster.com",children:"Fonoster"})," sponsored the majority of its development."]}),"\n",(0,t.jsx)(o.p,{children:"Pedro Sanders contributed Routr's logo."})]})}function a(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>c});var t=n(6540);const s={},r=t.createContext(s);function i(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea5491a0.76df41ff.js b/assets/js/ea5491a0.76df41ff.js new file mode 100644 index 000000000..b58260784 --- /dev/null +++ b/assets/js/ea5491a0.76df41ff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4011],{8236:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const c={},s="Overview",i={id:"connect/command-line/overview",title:"Overview",description:"The command-line tool contains all commands you will need to manage your Routr Connect server.",source:"@site/docs/connect/command-line/overview.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/overview",permalink:"/docs/2.11.5/connect/command-line/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installing in Kubernetes",permalink:"/docs/2.11.5/connect/quick-start/kubernetes"},next:{title:"CTL",permalink:"/docs/2.11.5/connect/command-line/ctl"}},a={},l=[];function m(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(n.p,{children:"The command-line tool contains all commands you will need to manage your Routr Connect server."}),"\n",(0,o.jsx)(n.p,{children:"To install Routr with npm, you will need to run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:'Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.'}),"\n",(0,o.jsx)(n.p,{children:"Please see the following sections for more information on each command."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var o=t(6540);const r={},c=o.createContext(r);function s(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea5491a0.a12d1751.js b/assets/js/ea5491a0.a12d1751.js deleted file mode 100644 index 74a6d3612..000000000 --- a/assets/js/ea5491a0.a12d1751.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4011],{7163:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>d,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var o=t(4848),r=t(8453);const c={},s="Overview",i={id:"connect/command-line/overview",title:"Overview",description:"The command-line tool contains all commands you will need to manage your Routr Connect server.",source:"@site/docs/connect/command-line/overview.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/overview",permalink:"/docs/2.0.0/connect/command-line/overview",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"},next:{title:"CTL",permalink:"/docs/2.0.0/connect/command-line/ctl"}},a={},l=[];function m(e){const n={code:"code",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(n.p,{children:"The command-line tool contains all commands you will need to manage your Routr Connect server."}),"\n",(0,o.jsx)(n.p,{children:"To install Routr with npm, you will need to run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-javascript",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:'Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.'}),"\n",(0,o.jsx)(n.p,{children:"Please see the following sections for more information on each command."})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(m,{...e})}):m(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var o=t(6540);const r={},c=o.createContext(r);function s(e){const n=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec64d50d.390e4709.js b/assets/js/ec64d50d.390e4709.js deleted file mode 100644 index ed7fd5073..000000000 --- a/assets/js/ec64d50d.390e4709.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9900],{3297:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getAgent",d={id:"api/agents/get",title:"getAgent",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/get.md",sourceDirName:"api/agents",slug:"/api/agents/get",permalink:"/docs/1.x.x/api/agents/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"},next:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getagent",children:"getAgent"}),"\n",(0,s.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec64d50d.62c18f11.js b/assets/js/ec64d50d.62c18f11.js new file mode 100644 index 000000000..044644c85 --- /dev/null +++ b/assets/js/ec64d50d.62c18f11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[9900],{588:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var s=n(4848),r=n(8453);const i={},o="getAgent",d={id:"api/agents/get",title:"getAgent",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/agents/get.md",sourceDirName:"api/agents",slug:"/api/agents/get",permalink:"/docs/1.x.x/api/agents/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/agents/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteAgent",permalink:"/docs/1.x.x/api/agents/delete"},next:{title:"listAgents",permalink:"/docs/1.x.x/api/agents/list"}},c={},l=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"getagent",children:"getAgent"}),"\n",(0,s.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"URL"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"/agents/{ref}"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Method"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.code,{children:"GET"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Parameter Name"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"ref"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Request body"})}),"\n",(0,s.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Response"})}),"\n",(0,s.jsx)(t.p,{children:"If successful this method returns an Agent resource."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/agents/ag3f77f6\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n "apiVersion": "v1beta1",\n "kind": "Agent",\n "metadata": {\n \t"name": "John Doe",\n "ref": "ag3f77f6"\n },\n "spec": {\n \t"credentials": {\n \t\t"username": "1001",\n \t\t"secret": "1234"\n \t},\n \t"domains": [\n \t\t"sip.local"\n \t]\n }\n }\n}\n'})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var s=n(6540);const r={},i=s.createContext(r);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed175a37.09425780.js b/assets/js/ed175a37.09425780.js deleted file mode 100644 index d931f0eb0..000000000 --- a/assets/js/ed175a37.09425780.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4236],{4995:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=t(4848),c=t(8453);const l={},s="CTL",i={id:"connect/command-line/ctl",title:"CTL",description:"Command-Line for Routr server.",source:"@site/docs/connect/command-line/ctl.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/ctl",permalink:"/docs/2.0.0/connect/command-line/ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.0.0/connect/command-line/overview"},next:{title:"Overview",permalink:"/docs/2.0.0/connect/nodesdk/overview"}},o={},d=[{value:"<code>rctl acl create</code>",id:"rctl-acl-create",level:2},{value:"<code>rctl acl delete [REF]</code>",id:"rctl-acl-delete-ref",level:2},{value:"<code>rctl acl describe [REF]</code>",id:"rctl-acl-describe-ref",level:2},{value:"<code>rctl acl get [REF]</code>",id:"rctl-acl-get-ref",level:2},{value:"<code>rctl acl update REF</code>",id:"rctl-acl-update-ref",level:2},{value:"<code>rctl agents create</code>",id:"rctl-agents-create",level:2},{value:"<code>rctl agents delete [REF]</code>",id:"rctl-agents-delete-ref",level:2},{value:"<code>rctl agents describe [REF]</code>",id:"rctl-agents-describe-ref",level:2},{value:"<code>rctl agents get [REF]</code>",id:"rctl-agents-get-ref",level:2},{value:"<code>rctl agents update REF</code>",id:"rctl-agents-update-ref",level:2},{value:"<code>rctl autocomplete [SHELL]</code>",id:"rctl-autocomplete-shell",level:2},{value:"<code>rctl credentials create</code>",id:"rctl-credentials-create",level:2},{value:"<code>rctl credentials delete [REF]</code>",id:"rctl-credentials-delete-ref",level:2},{value:"<code>rctl credentials describe [REF]</code>",id:"rctl-credentials-describe-ref",level:2},{value:"<code>rctl credentials get [REF]</code>",id:"rctl-credentials-get-ref",level:2},{value:"<code>rctl credentials update REF</code>",id:"rctl-credentials-update-ref",level:2},{value:"<code>rctl domains create</code>",id:"rctl-domains-create",level:2},{value:"<code>rctl domains delete [REF]</code>",id:"rctl-domains-delete-ref",level:2},{value:"<code>rctl domains describe [REF]</code>",id:"rctl-domains-describe-ref",level:2},{value:"<code>rctl domains get [REF]</code>",id:"rctl-domains-get-ref",level:2},{value:"<code>rctl domains update REF</code>",id:"rctl-domains-update-ref",level:2},{value:"<code>rctl numbers create</code>",id:"rctl-numbers-create",level:2},{value:"<code>rctl numbers delete [REF]</code>",id:"rctl-numbers-delete-ref",level:2},{value:"<code>rctl numbers describe [REF]</code>",id:"rctl-numbers-describe-ref",level:2},{value:"<code>rctl numbers get [REF]</code>",id:"rctl-numbers-get-ref",level:2},{value:"<code>rctl numbers update REF</code>",id:"rctl-numbers-update-ref",level:2},{value:"<code>rctl peers create</code>",id:"rctl-peers-create",level:2},{value:"<code>rctl peers delete [REF]</code>",id:"rctl-peers-delete-ref",level:2},{value:"<code>rctl peers describe [REF]</code>",id:"rctl-peers-describe-ref",level:2},{value:"<code>rctl peers get [REF]</code>",id:"rctl-peers-get-ref",level:2},{value:"<code>rctl peers update REF</code>",id:"rctl-peers-update-ref",level:2},{value:"<code>rctl plugins</code>",id:"rctl-plugins",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin",level:2},{value:"<code>rctl plugins:inspect PLUGIN...</code>",id:"rctl-pluginsinspect-plugin",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin-1",level:2},{value:"<code>rctl plugins:link PLUGIN</code>",id:"rctl-pluginslink-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-1",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-2",level:2},{value:"<code>rctl plugins update</code>",id:"rctl-plugins-update",level:2},{value:"<code>rctl trunks create</code>",id:"rctl-trunks-create",level:2},{value:"<code>rctl trunks delete [REF]</code>",id:"rctl-trunks-delete-ref",level:2},{value:"<code>rctl trunks describe [REF]</code>",id:"rctl-trunks-describe-ref",level:2},{value:"<code>rctl trunks get [REF]</code>",id:"rctl-trunks-get-ref",level:2},{value:"<code>rctl trunks update REF</code>",id:"rctl-trunks-update-ref",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"ctl",children:"CTL"}),"\n",(0,r.jsx)(n.p,{children:"Command-Line for Routr server."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#usage",children:"Usage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#commands",children:"Commands"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install -g @routr/ctl\n$ rctl COMMAND\nrunning command...\n$ rctl (--version)\n@routr/ctl/2.1.11 linux-x64 node-v18.17.1\n$ rctl --help [COMMAND]\nUSAGE\n $ rctl COMMAND\n...\n"})}),"\n",(0,r.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-create",children:(0,r.jsx)(n.code,{children:"rctl acl create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new ACL\n\nEXAMPLES\n $ rctl acl create\n Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/create.ts",children:"dist/commands/acl/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl acl delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Access Control List"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Access Control List\n\nEXAMPLES\n $ rctl acl delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/delete.ts",children:"dist/commands/acl/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl acl describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an ACL\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/describe.ts",children:"dist/commands/acl/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-get-ref",children:(0,r.jsx)(n.code,{children:"rctl acl get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated ACLs or a single ACL if a ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated ACLs or a single ACL if a ref is provided\n\nEXAMPLES\n $ rctl acl get\n Ref Name Deny List Allow List\n 9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/get.ts",children:"dist/commands/acl/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-update-ref",children:(0,r.jsx)(n.code,{children:"rctl acl update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing ACL\n\nEXAMPLES\n $ rctl acl update\n Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/update.ts",children:"dist/commands/acl/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-create",children:(0,r.jsx)(n.code,{children:"rctl agents create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Agent\n\nEXAMPLES\n $ rctl agents create\n Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/create.ts",children:"dist/commands/agents/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl agents delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Agent\n\nEXAMPLES\n $ rctl agents delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/delete.ts",children:"dist/commands/agents/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl agents describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an Agent\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/describe.ts",children:"dist/commands/agents/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-get-ref",children:(0,r.jsx)(n.code,{children:"rctl agents get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Agents or a single Agent if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF Optional Agents reference\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] The number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Agents or a single Agent if ref is provided\n\nEXAMPLES\n $ rctl agents get\n Ref Name Username Domain Privacy Enabled\n d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/get.ts",children:"dist/commands/agents/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-update-ref",children:(0,r.jsx)(n.code,{children:"rctl agents update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Agent\n\nEXAMPLES\n $ rctl agents update\n Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/update.ts",children:"dist/commands/agents/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-autocomplete-shell",children:(0,r.jsx)(n.code,{children:"rctl autocomplete [SHELL]"})}),"\n",(0,r.jsx)(n.p,{children:"display autocomplete installation instructions"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl autocomplete [SHELL] [-r]\n\nARGUMENTS\n SHELL shell type\n\nFLAGS\n -r, --refresh-cache Refresh cache (ignores displaying instructions)\n\nDESCRIPTION\n display autocomplete installation instructions\n\nEXAMPLES\n $ rctl autocomplete\n\n $ rctl autocomplete bash\n\n $ rctl autocomplete zsh\n\n $ rctl autocomplete --refresh-cache\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-autocomplete/blob/v1.4.6/src/commands/autocomplete/index.ts",children:"@oclif/plugin-autocomplete"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-create",children:(0,r.jsx)(n.code,{children:"rctl credentials create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set of Credentials\n\nEXAMPLES\n $ rctl credentials create\n Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/create.ts",children:"dist/commands/credentials/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a set of Credentials\n\nEXAMPLES\n $ rctl credentials delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/delete.ts",children:"dist/commands/credentials/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a set of Credentials\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/describe.ts",children:"dist/commands/credentials/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-get-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Credentials or a single set if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Credentials or a single set if ref is provided\n\nEXAMPLES\n $ rctl credentials get\n Ref Name Deny List Allow List\n 80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/get.ts",children:"dist/commands/credentials/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-update-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl credentials update\n Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/update.ts",children:"dist/commands/credentials/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-create",children:(0,r.jsx)(n.code,{children:"rctl domains create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set Domain\n\nEXAMPLES\n $ rctl domains create\n Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/create.ts",children:"dist/commands/domains/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl domains delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Domain\n\nEXAMPLES\n $ rctl domains delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/delete.ts",children:"dist/commands/domains/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl domains describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"show details of a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n show details of a Domain\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/describe.ts",children:"dist/commands/domains/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-get-ref",children:(0,r.jsx)(n.code,{children:"rctl domains get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Domains or a single Domain if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Domains or a single Domain if ref is provided\n\nEXAMPLES\n $ rctl domains get\n Ref Name URI \n ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/get.ts",children:"dist/commands/domains/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-update-ref",children:(0,r.jsx)(n.code,{children:"rctl domains update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Domain\n\nEXAMPLES\n $ rctl domains update\n Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/update.ts",children:"dist/commands/domains/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-create",children:(0,r.jsx)(n.code,{children:"rctl numbers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Number\n\nEXAMPLES\n $ rctl numbers create\n Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/create.ts",children:"dist/commands/numbers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Number\n\nEXAMPLES\n $ rctl numbers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/delete.ts",children:"dist/commands/numbers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Number\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/describe.ts",children:"dist/commands/numbers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Numbers or a single Number if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Numbers or a single Number if ref is provided\n\nEXAMPLES\n $ rctl numbers get\n Ref Name Telephony URL AOR Link Geo \n a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/get.ts",children:"dist/commands/numbers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl numbers update\n Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/update.ts",children:"dist/commands/numbers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-create",children:(0,r.jsx)(n.code,{children:"rctl peers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Peer\n\nEXAMPLES\n $ rctl peers create\n Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/create.ts",children:"dist/commands/peers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl peers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Peer\n\nEXAMPLES\n $ rctl peers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/delete.ts",children:"dist/commands/peers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl peers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Peer\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/describe.ts",children:"dist/commands/peers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl peers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Peers or a single Peer if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Peers or a single Peer if ref is provided\n\nEXAMPLES\n $ rctl peers get\n Ref Name Username AOR Balancing Algorithm Session Affinity \n 6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/get.ts",children:"dist/commands/peers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl peers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Peer\n\nEXAMPLES\n $ rctl peers update\n Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/update.ts",children:"dist/commands/peers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins",children:(0,r.jsx)(n.code,{children:"rctl plugins"})}),"\n",(0,r.jsx)(n.p,{children:"List installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins [--core]\n\nFLAGS\n --core Show core plugins.\n\nDESCRIPTION\n List installed plugins.\n\nEXAMPLES\n $ rctl plugins\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/index.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinspect-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:inspect PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Displays installation properties of a plugin."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:inspect PLUGIN...\n\nARGUMENTS\n PLUGIN [default: .] Plugin to inspect.\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nGLOBAL FLAGS\n --json Format output as json.\n\nDESCRIPTION\n Displays installation properties of a plugin.\n\nEXAMPLES\n $ rctl plugins:inspect myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/inspect.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/install.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginslink-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:link PLUGIN"})}),"\n",(0,r.jsx)(n.p,{children:"Links a plugin into the CLI for development."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:link PLUGIN\n\nARGUMENTS\n PATH [default: .] path to plugin\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Links a plugin into the CLI for development.\n Installation of a linked plugin will override a user-installed or core plugin.\n\n e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'\n command will override the user-installed or core plugin implementation. This is useful for development work.\n\n\nEXAMPLES\n $ rctl plugins:link myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/link.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/uninstall.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-2",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins-update",children:(0,r.jsx)(n.code,{children:"rctl plugins update"})}),"\n",(0,r.jsx)(n.p,{children:"Update installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins update [-h] [-v]\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Update installed plugins.\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/update.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-create",children:(0,r.jsx)(n.code,{children:"rctl trunks create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Trunk\n\nEXAMPLES\n $ rctl trunks create\n Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/create.ts",children:"dist/commands/trunks/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Trunk\n\nEXAMPLES\n $ rctl trunks delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/delete.ts",children:"dist/commands/trunks/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Trunk\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/describe.ts",children:"dist/commands/trunks/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-get-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Trunks or a single Trunk if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Trunks or a single Trunk if ref is provided\n\nEXAMPLES\n $ rctl trunks get\n Ref Name Inbound SIP URI \n 8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/get.ts",children:"dist/commands/trunks/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-update-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Trunk\n\nEXAMPLES\n $ rctl trunks update\n Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/update.ts",children:"dist/commands/trunks/update.ts"})]})})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var r=t(6540);const c={},l=r.createContext(c);function s(e){const n=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:s(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed175a37.da63f296.js b/assets/js/ed175a37.da63f296.js new file mode 100644 index 000000000..bfbe1ef56 --- /dev/null +++ b/assets/js/ed175a37.da63f296.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4236],{5306:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=t(4848),c=t(8453);const l={},s="CTL",i={id:"connect/command-line/ctl",title:"CTL",description:"Command-Line for Routr server.",source:"@site/docs/connect/command-line/ctl.md",sourceDirName:"connect/command-line",slug:"/connect/command-line/ctl",permalink:"/docs/2.11.5/connect/command-line/ctl",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/command-line/ctl.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/2.11.5/connect/command-line/overview"},next:{title:"Overview",permalink:"/docs/2.11.5/connect/nodesdk/overview"}},o={},d=[{value:"<code>rctl acl create</code>",id:"rctl-acl-create",level:2},{value:"<code>rctl acl delete [REF]</code>",id:"rctl-acl-delete-ref",level:2},{value:"<code>rctl acl describe [REF]</code>",id:"rctl-acl-describe-ref",level:2},{value:"<code>rctl acl get [REF]</code>",id:"rctl-acl-get-ref",level:2},{value:"<code>rctl acl update REF</code>",id:"rctl-acl-update-ref",level:2},{value:"<code>rctl agents create</code>",id:"rctl-agents-create",level:2},{value:"<code>rctl agents delete [REF]</code>",id:"rctl-agents-delete-ref",level:2},{value:"<code>rctl agents describe [REF]</code>",id:"rctl-agents-describe-ref",level:2},{value:"<code>rctl agents get [REF]</code>",id:"rctl-agents-get-ref",level:2},{value:"<code>rctl agents update REF</code>",id:"rctl-agents-update-ref",level:2},{value:"<code>rctl autocomplete [SHELL]</code>",id:"rctl-autocomplete-shell",level:2},{value:"<code>rctl credentials create</code>",id:"rctl-credentials-create",level:2},{value:"<code>rctl credentials delete [REF]</code>",id:"rctl-credentials-delete-ref",level:2},{value:"<code>rctl credentials describe [REF]</code>",id:"rctl-credentials-describe-ref",level:2},{value:"<code>rctl credentials get [REF]</code>",id:"rctl-credentials-get-ref",level:2},{value:"<code>rctl credentials update REF</code>",id:"rctl-credentials-update-ref",level:2},{value:"<code>rctl domains create</code>",id:"rctl-domains-create",level:2},{value:"<code>rctl domains delete [REF]</code>",id:"rctl-domains-delete-ref",level:2},{value:"<code>rctl domains describe [REF]</code>",id:"rctl-domains-describe-ref",level:2},{value:"<code>rctl domains get [REF]</code>",id:"rctl-domains-get-ref",level:2},{value:"<code>rctl domains update REF</code>",id:"rctl-domains-update-ref",level:2},{value:"<code>rctl numbers create</code>",id:"rctl-numbers-create",level:2},{value:"<code>rctl numbers delete [REF]</code>",id:"rctl-numbers-delete-ref",level:2},{value:"<code>rctl numbers describe [REF]</code>",id:"rctl-numbers-describe-ref",level:2},{value:"<code>rctl numbers get [REF]</code>",id:"rctl-numbers-get-ref",level:2},{value:"<code>rctl numbers update REF</code>",id:"rctl-numbers-update-ref",level:2},{value:"<code>rctl peers create</code>",id:"rctl-peers-create",level:2},{value:"<code>rctl peers delete [REF]</code>",id:"rctl-peers-delete-ref",level:2},{value:"<code>rctl peers describe [REF]</code>",id:"rctl-peers-describe-ref",level:2},{value:"<code>rctl peers get [REF]</code>",id:"rctl-peers-get-ref",level:2},{value:"<code>rctl peers update REF</code>",id:"rctl-peers-update-ref",level:2},{value:"<code>rctl plugins</code>",id:"rctl-plugins",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin",level:2},{value:"<code>rctl plugins:inspect PLUGIN...</code>",id:"rctl-pluginsinspect-plugin",level:2},{value:"<code>rctl plugins:install PLUGIN...</code>",id:"rctl-pluginsinstall-plugin-1",level:2},{value:"<code>rctl plugins:link PLUGIN</code>",id:"rctl-pluginslink-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-1",level:2},{value:"<code>rctl plugins:uninstall PLUGIN...</code>",id:"rctl-pluginsuninstall-plugin-2",level:2},{value:"<code>rctl plugins update</code>",id:"rctl-plugins-update",level:2},{value:"<code>rctl trunks create</code>",id:"rctl-trunks-create",level:2},{value:"<code>rctl trunks delete [REF]</code>",id:"rctl-trunks-delete-ref",level:2},{value:"<code>rctl trunks describe [REF]</code>",id:"rctl-trunks-describe-ref",level:2},{value:"<code>rctl trunks get [REF]</code>",id:"rctl-trunks-get-ref",level:2},{value:"<code>rctl trunks update REF</code>",id:"rctl-trunks-update-ref",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"ctl",children:"CTL"}),"\n",(0,r.jsx)(n.p,{children:"Command-Line for Routr server."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#usage",children:"Usage"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#commands",children:"Commands"})}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"usage",children:"Usage"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh-session",children:"$ npm install -g @routr/ctl\n$ rctl COMMAND\nrunning command...\n$ rctl (--version)\n@routr/ctl/2.1.11 linux-x64 node-v18.17.1\n$ rctl --help [COMMAND]\nUSAGE\n $ rctl COMMAND\n...\n"})}),"\n",(0,r.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-create",children:(0,r.jsx)(n.code,{children:"rctl acl create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new ACL\n\nEXAMPLES\n $ rctl acl create\n Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/create.ts",children:"dist/commands/acl/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl acl delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Access Control List"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Access Control List\n\nEXAMPLES\n $ rctl acl delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/delete.ts",children:"dist/commands/acl/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl acl describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an ACL\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/describe.ts",children:"dist/commands/acl/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-get-ref",children:(0,r.jsx)(n.code,{children:"rctl acl get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated ACLs or a single ACL if a ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated ACLs or a single ACL if a ref is provided\n\nEXAMPLES\n $ rctl acl get\n Ref Name Deny List Allow List\n 9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/get.ts",children:"dist/commands/acl/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-acl-update-ref",children:(0,r.jsx)(n.code,{children:"rctl acl update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing ACL"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an ACL\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing ACL\n\nEXAMPLES\n $ rctl acl update\n Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/acl/update.ts",children:"dist/commands/acl/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-create",children:(0,r.jsx)(n.code,{children:"rctl agents create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Agent\n\nEXAMPLES\n $ rctl agents create\n Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/create.ts",children:"dist/commands/agents/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl agents delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes an Agent\n\nEXAMPLES\n $ rctl agents delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/delete.ts",children:"dist/commands/agents/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl agents describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details of an Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details of an Agent\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/describe.ts",children:"dist/commands/agents/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-get-ref",children:(0,r.jsx)(n.code,{children:"rctl agents get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Agents or a single Agent if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF Optional Agents reference\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] The number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Agents or a single Agent if ref is provided\n\nEXAMPLES\n $ rctl agents get\n Ref Name Username Domain Privacy Enabled\n d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/get.ts",children:"dist/commands/agents/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-agents-update-ref",children:(0,r.jsx)(n.code,{children:"rctl agents update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Agent"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Agent\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Agent\n\nEXAMPLES\n $ rctl agents update\n Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/agents/update.ts",children:"dist/commands/agents/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-autocomplete-shell",children:(0,r.jsx)(n.code,{children:"rctl autocomplete [SHELL]"})}),"\n",(0,r.jsx)(n.p,{children:"display autocomplete installation instructions"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl autocomplete [SHELL] [-r]\n\nARGUMENTS\n SHELL shell type\n\nFLAGS\n -r, --refresh-cache Refresh cache (ignores displaying instructions)\n\nDESCRIPTION\n display autocomplete installation instructions\n\nEXAMPLES\n $ rctl autocomplete\n\n $ rctl autocomplete bash\n\n $ rctl autocomplete zsh\n\n $ rctl autocomplete --refresh-cache\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-autocomplete/blob/v1.4.6/src/commands/autocomplete/index.ts",children:"@oclif/plugin-autocomplete"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-create",children:(0,r.jsx)(n.code,{children:"rctl credentials create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set of Credentials\n\nEXAMPLES\n $ rctl credentials create\n Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/create.ts",children:"dist/commands/credentials/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a set of Credentials\n\nEXAMPLES\n $ rctl credentials delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/delete.ts",children:"dist/commands/credentials/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a set of Credentials\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/describe.ts",children:"dist/commands/credentials/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-get-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Credentials or a single set if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Credentials or a single set if ref is provided\n\nEXAMPLES\n $ rctl credentials get\n Ref Name Deny List Allow List\n 80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/get.ts",children:"dist/commands/credentials/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-credentials-update-ref",children:(0,r.jsx)(n.code,{children:"rctl credentials update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing set of Credentials\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl credentials update\n Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/credentials/update.ts",children:"dist/commands/credentials/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-create",children:(0,r.jsx)(n.code,{children:"rctl domains create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new set Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new set Domain\n\nEXAMPLES\n $ rctl domains create\n Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/create.ts",children:"dist/commands/domains/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl domains delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Domain\n\nEXAMPLES\n $ rctl domains delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/delete.ts",children:"dist/commands/domains/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl domains describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"show details of a Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n show details of a Domain\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/describe.ts",children:"dist/commands/domains/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-get-ref",children:(0,r.jsx)(n.code,{children:"rctl domains get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Domains or a single Domain if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Domains or a single Domain if ref is provided\n\nEXAMPLES\n $ rctl domains get\n Ref Name URI \n ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/get.ts",children:"dist/commands/domains/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-domains-update-ref",children:(0,r.jsx)(n.code,{children:"rctl domains update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Domain"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Domain\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Domain\n\nEXAMPLES\n $ rctl domains update\n Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/domains/update.ts",children:"dist/commands/domains/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-create",children:(0,r.jsx)(n.code,{children:"rctl numbers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Number\n\nEXAMPLES\n $ rctl numbers create\n Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/create.ts",children:"dist/commands/numbers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Number\n\nEXAMPLES\n $ rctl numbers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/delete.ts",children:"dist/commands/numbers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Number"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Number\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/describe.ts",children:"dist/commands/numbers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Numbers or a single Number if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Numbers or a single Number if ref is provided\n\nEXAMPLES\n $ rctl numbers get\n Ref Name Telephony URL AOR Link Geo \n a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/get.ts",children:"dist/commands/numbers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-numbers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl numbers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing set of Credentials"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Number\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing set of Credentials\n\nEXAMPLES\n $ rctl numbers update\n Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/numbers/update.ts",children:"dist/commands/numbers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-create",children:(0,r.jsx)(n.code,{children:"rctl peers create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Peer\n\nEXAMPLES\n $ rctl peers create\n Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/create.ts",children:"dist/commands/peers/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl peers delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Peer\n\nEXAMPLES\n $ rctl peers delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/delete.ts",children:"dist/commands/peers/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl peers describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Peer\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/describe.ts",children:"dist/commands/peers/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-get-ref",children:(0,r.jsx)(n.code,{children:"rctl peers get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Peers or a single Peer if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Peers or a single Peer if ref is provided\n\nEXAMPLES\n $ rctl peers get\n Ref Name Username AOR Balancing Algorithm Session Affinity \n 6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/get.ts",children:"dist/commands/peers/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-peers-update-ref",children:(0,r.jsx)(n.code,{children:"rctl peers update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Peer"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Peer\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Peer\n\nEXAMPLES\n $ rctl peers update\n Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/peers/update.ts",children:"dist/commands/peers/update.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins",children:(0,r.jsx)(n.code,{children:"rctl plugins"})}),"\n",(0,r.jsx)(n.p,{children:"List installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins [--core]\n\nFLAGS\n --core Show core plugins.\n\nDESCRIPTION\n List installed plugins.\n\nEXAMPLES\n $ rctl plugins\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/index.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinspect-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:inspect PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Displays installation properties of a plugin."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:inspect PLUGIN...\n\nARGUMENTS\n PLUGIN [default: .] Plugin to inspect.\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nGLOBAL FLAGS\n --json Format output as json.\n\nDESCRIPTION\n Displays installation properties of a plugin.\n\nEXAMPLES\n $ rctl plugins:inspect myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/inspect.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsinstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:install PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Installs a plugin into the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:install PLUGIN...\n\nARGUMENTS\n PLUGIN Plugin to install.\n\nFLAGS\n -f, --force Run yarn install with force flag.\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Installs a plugin into the CLI.\n Can be installed from npm or a git url.\n\n Installation of a user-installed plugin will override a core plugin.\n\n e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command\n will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in\n the CLI without the need to patch and update the whole CLI.\n\n\nALIASES\n $ rctl plugins add\n\nEXAMPLES\n $ rctl plugins:install myplugin \n\n $ rctl plugins:install https://github.com/someuser/someplugin\n\n $ rctl plugins:install someuser/someplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/install.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginslink-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:link PLUGIN"})}),"\n",(0,r.jsx)(n.p,{children:"Links a plugin into the CLI for development."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:link PLUGIN\n\nARGUMENTS\n PATH [default: .] path to plugin\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Links a plugin into the CLI for development.\n Installation of a linked plugin will override a user-installed or core plugin.\n\n e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'\n command will override the user-installed or core plugin implementation. This is useful for development work.\n\n\nEXAMPLES\n $ rctl plugins:link myplugin\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/link.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-1",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/uninstall.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-pluginsuninstall-plugin-2",children:(0,r.jsx)(n.code,{children:"rctl plugins:uninstall PLUGIN..."})}),"\n",(0,r.jsx)(n.p,{children:"Removes a plugin from the CLI."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins:uninstall PLUGIN...\n\nARGUMENTS\n PLUGIN plugin to uninstall\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Removes a plugin from the CLI.\n\nALIASES\n $ rctl plugins unlink\n $ rctl plugins remove\n"})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-plugins-update",children:(0,r.jsx)(n.code,{children:"rctl plugins update"})}),"\n",(0,r.jsx)(n.p,{children:"Update installed plugins."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl plugins update [-h] [-v]\n\nFLAGS\n -h, --help Show CLI help.\n -v, --verbose\n\nDESCRIPTION\n Update installed plugins.\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/oclif/plugin-plugins/blob/v2.4.7/src/commands/plugins/update.ts",children:"@oclif/plugin-plugins"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-create",children:(0,r.jsx)(n.code,{children:"rctl trunks create"})}),"\n",(0,r.jsx)(n.p,{children:"Creates a new Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks create [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Creates a new Trunk\n\nEXAMPLES\n $ rctl trunks create\n Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/create.ts",children:"dist/commands/trunks/create.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-delete-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks delete [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Deletes a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Deletes a Trunk\n\nEXAMPLES\n $ rctl trunks delete\n Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/delete.ts",children:"dist/commands/trunks/delete.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-describe-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks describe [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"shows details for a Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to the Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n shows details for a Trunk\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/describe.ts",children:"dist/commands/trunks/describe.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-get-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks get [REF]"})}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of paginated Trunks or a single Trunk if ref is provided"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]\n\nARGUMENTS\n REF optional reference to a Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n -s, --size=<value> [default: 50] the number of items to return\n -x, --extended extended output format\n\nDESCRIPTION\n Shows a list of paginated Trunks or a single Trunk if ref is provided\n\nEXAMPLES\n $ rctl trunks get\n Ref Name Inbound SIP URI \n 8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/get.ts",children:"dist/commands/trunks/get.ts"})]})}),"\n",(0,r.jsx)(n.h2,{id:"rctl-trunks-update-ref",children:(0,r.jsx)(n.code,{children:"rctl trunks update REF"})}),"\n",(0,r.jsx)(n.p,{children:"Updates an existing Trunk"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"USAGE\n $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]\n\nARGUMENTS\n REF reference to an existing Trunk\n\nFLAGS\n -c, --cacert=<value> path to the CA certificate to verify the server\n -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server\n -i, --insecure allow insecure connections to the routr server\n\nDESCRIPTION\n Updates an existing Trunk\n\nEXAMPLES\n $ rctl trunks update\n Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.em,{children:["See code: ",(0,r.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/v2.1.11/dist/commands/trunks/update.ts",children:"dist/commands/trunks/update.ts"})]})})]})}function u(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var r=t(6540);const c={},l=r.createContext(c);function s(e){const n=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:s(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed519cbf.c20eaab7.js b/assets/js/ed519cbf.566c1879.js similarity index 98% rename from assets/js/ed519cbf.c20eaab7.js rename to assets/js/ed519cbf.566c1879.js index 6ec2b78f0..529b204f1 100644 --- a/assets/js/ed519cbf.c20eaab7.js +++ b/assets/js/ed519cbf.566c1879.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7638],{3271:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var r=n(4848),s=n(8453);const i={},o="getNumber",d={id:"api/numbers/get",title:"getNumber",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/numbers/get.md",sourceDirName:"api/numbers",slug:"/api/numbers/get",permalink:"/docs/1.x.x/api/numbers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"},next:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getnumber",children:"getNumber"}),"\n",(0,r.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7638],{3316:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var r=n(4848),s=n(8453);const i={},o="getNumber",d={id:"api/numbers/get",title:"getNumber",description:"This method returns an Agent resource.",source:"@site/versioned_docs/version-1.x.x/api/numbers/get.md",sourceDirName:"api/numbers",slug:"/api/numbers/get",permalink:"/docs/1.x.x/api/numbers/get",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/api/numbers/get.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"deleteNumber",permalink:"/docs/1.x.x/api/numbers/delete"},next:{title:"listNumbers",permalink:"/docs/1.x.x/api/numbers/list"}},l={},c=[];function a(e){const t={code:"code",h1:"h1",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"getnumber",children:"getNumber"}),"\n",(0,r.jsx)(t.p,{children:"This method returns an Agent resource."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"URL"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"/numbers/{ref}"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Method"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.code,{children:"GET"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Parameters"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter Name"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Type"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Value"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ref"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"path"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"string"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Resource reference"})]})})]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Request body"})}),"\n",(0,r.jsx)(t.p,{children:"Do not supply a request body with this method."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Response"})}),"\n",(0,r.jsx)(t.p,{children:"If successful this method returns a Number."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Sample Call"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'GET /api/{apiversion}/numbers/dd50baa4\n{\n\n}\n\nHTTP/1.1 200 OK\n{\n "status": "200",\n "message": "Successful request",\n "data" : {\n \t"apiVersion": "v1beta1",\n \t"kind": "Number",\n \t"metadata": {\n "ref": "dd50baa4",\n \t\t"gwRef": "gweef506",\n \t\t"geoInfo": {\n \t\t\t"city": "City, State",\n \t\t\t"country": "Country",\n \t\t\t"countryISOCode": "US"\n \t\t}\n \t},\n \t"spec": {\n \t\t"location": {\n \t\t\t"telUrl": "tel:0000000000",\n \t\t\t"aorLink": "sip:1001@sip.local"\n \t\t}\n \t}\n }\n}\n'})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>d});var r=n(6540);const s={},i=r.createContext(s);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee7973d9.d3592e4d.js b/assets/js/ee7973d9.59e9fe3d.js similarity index 98% rename from assets/js/ee7973d9.d3592e4d.js rename to assets/js/ee7973d9.59e9fe3d.js index 604531673..4f0758526 100644 --- a/assets/js/ee7973d9.d3592e4d.js +++ b/assets/js/ee7973d9.59e9fe3d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2514],{2305:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=r(4848),t=r(8453);const i={},d="Peers",c={id:"configuration/peers",title:"Peers",description:"Like Agents, Peers represent SIP endpoints such as Media Servers.",source:"@site/versioned_docs/version-1.x.x/configuration/peers.md",sourceDirName:"configuration",slug:"/configuration/peers",permalink:"/docs/1.x.x/configuration/peers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/peers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"},next:{title:"Users",permalink:"/docs/1.x.x/configuration/users"}},o={},a=[{value:"Peer Resource",id:"peer-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"peers",children:"Peers"}),"\n",(0,n.jsx)(s.p,{children:"Like Agents, Peers represent SIP endpoints such as Media Servers."}),"\n",(0,n.jsx)(s.p,{children:"Unlike Agents, Peers aren't bound by a Domain."}),"\n",(0,n.jsxs)(s.p,{children:["The Peers configuration can be provided using the file ",(0,n.jsx)(s.code,{children:"config/peers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"peer-resource",children:"Peer Resource"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Property"}),(0,n.jsx)(s.th,{children:"Description"}),(0,n.jsx)(s.th,{children:"Required"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"apiVersion"}),(0,n.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"kind"}),(0,n.jsx)(s.td,{children:"Defines the type of resource"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"metadata.name"}),(0,n.jsx)(s.td,{children:"Friendly name for the SIP device"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.username"}),(0,n.jsx)(s.td,{children:"Peer's credential username"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.secret"}),(0,n.jsx)(s.td,{children:"Peer's credential secret"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.device"}),(0,n.jsx)(s.td,{children:"When set it is used by the location service"}),(0,n.jsx)(s.td,{children:"No"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.contactAddr"}),(0,n.jsx)(s.td,{children:"When set advertises this as the contactURI"}),(0,n.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,n.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk (Media Server)\n spec:\n credentials:\n username: ast\n secret: 'astsecret'\n device: astserver # If is not define the IP address will be used\n contactAddr: '192.168.1.2:6060'\n"})}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["This peer can be reached using the AOR: ",(0,n.jsx)(s.code,{children:"ast@astserver"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>c});var n=r(6540);const t={},i=n.createContext(t);function d(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[2514],{4086:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=r(4848),t=r(8453);const i={},d="Peers",c={id:"configuration/peers",title:"Peers",description:"Like Agents, Peers represent SIP endpoints such as Media Servers.",source:"@site/versioned_docs/version-1.x.x/configuration/peers.md",sourceDirName:"configuration",slug:"/configuration/peers",permalink:"/docs/1.x.x/configuration/peers",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/configuration/peers.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Numbers",permalink:"/docs/1.x.x/configuration/numbers"},next:{title:"Users",permalink:"/docs/1.x.x/configuration/users"}},o={},a=[{value:"Peer Resource",id:"peer-resource",level:2},{value:"Example",id:"example",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{id:"peers",children:"Peers"}),"\n",(0,n.jsx)(s.p,{children:"Like Agents, Peers represent SIP endpoints such as Media Servers."}),"\n",(0,n.jsx)(s.p,{children:"Unlike Agents, Peers aren't bound by a Domain."}),"\n",(0,n.jsxs)(s.p,{children:["The Peers configuration can be provided using the file ",(0,n.jsx)(s.code,{children:"config/peers.yml"})," located at the root of your Routr installation."]}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsx)(s.p,{children:"If using Redis this configuration gets stored in the database."}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"peer-resource",children:"Peer Resource"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Property"}),(0,n.jsx)(s.th,{children:"Description"}),(0,n.jsx)(s.th,{children:"Required"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"apiVersion"}),(0,n.jsx)(s.td,{children:"Indicates the version of the resource (Not yet implemented)"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"kind"}),(0,n.jsx)(s.td,{children:"Defines the type of resource"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"metadata.name"}),(0,n.jsx)(s.td,{children:"Friendly name for the SIP device"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.username"}),(0,n.jsx)(s.td,{children:"Peer's credential username"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.credentials.secret"}),(0,n.jsx)(s.td,{children:"Peer's credential secret"}),(0,n.jsx)(s.td,{children:"Yes"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.device"}),(0,n.jsx)(s.td,{children:"When set it is used by the location service"}),(0,n.jsx)(s.td,{children:"No"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"spec.contactAddr"}),(0,n.jsx)(s.td,{children:"When set advertises this as the contactURI"}),(0,n.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,n.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Peer\n metadata:\n name: Asterisk (Media Server)\n spec:\n credentials:\n username: ast\n secret: 'astsecret'\n device: astserver # If is not define the IP address will be used\n contactAddr: '192.168.1.2:6060'\n"})}),"\n",(0,n.jsxs)(s.blockquote,{children:["\n",(0,n.jsxs)(s.p,{children:["This peer can be reached using the AOR: ",(0,n.jsx)(s.code,{children:"ast@astserver"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>c});var n=r(6540);const t={},i=n.createContext(t);function d(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f0fdb5a0.6d1a037a.js b/assets/js/f0fdb5a0.6d1a037a.js new file mode 100644 index 000000000..e1742db5b --- /dev/null +++ b/assets/js/f0fdb5a0.6d1a037a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[4319],{6842:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});var s=t(4848),r=t(8453);const o={},l="Sending Call Events to NATS",i={id:"connect/sending-call-events-to-nats",title:"Sending Call Events to NATS",description:"Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATSPUBLISHERENABLED to true as well as the environment variable NATSPUBLISHERURL to the URL of your NATS server. For example:",source:"@site/versioned_docs/version-2.0.0/connect/sending-call-events-to-nats.md",sourceDirName:"connect",slug:"/connect/sending-call-events-to-nats",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/connect/sending-call-events-to-nats.md",tags:[],version:"2.0.0",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Securing the Server",permalink:"/docs/2.0.0/connect/securing-the-server"},next:{title:"Community",permalink:"/docs/2.0.0/community"}},c={},a=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"sending-call-events-to-nats",children:"Sending Call Events to NATS"}),"\n",(0,s.jsxs)(n.p,{children:["Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_ENABLED"})," to ",(0,s.jsx)(n.code,{children:"true"})," as well as the environment variable ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_URL"})," to the URL of your NATS server. For example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'version: "3"\nservices:\n routr:\n image: fonoster/routr-one:latest\n ports:\n - 51908:51908\n - 5060:5060/udp\n environment:\n - NATS_PUBLISHER_ENABLED=true\n - NATS_PUBLISHER_URL=nats:4222\n'})}),"\n",(0,s.jsx)(n.p,{children:"Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events.\nAs of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added."}),"\n",(0,s.jsx)(n.p,{children:"To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'nats context add nats \\\n --server demo.nats.io:4222 \\\n --description "nats events" \\\n --select\n'})}),"\n",(0,s.jsx)(n.p,{children:"You should then see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS context add",src:t(2774).A+"",width:"880",height:"430"})}),"\n",(0,s.jsxs)(n.p,{children:["In the previous command, we connected to the ",(0,s.jsx)(n.code,{children:"demo.nats.io"})," server, which is a public NATS server. You can use your own NATS server if you have one."]}),"\n",(0,s.jsxs)(n.p,{children:["Then, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.call.started"})," subject by running the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.started\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.started"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"from"}),": The caller's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"to"}),": The callee's phone number"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"startTime"}),": The time the call started formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Every header startarting with ",(0,s.jsx)(n.code,{children:"X-"})," is considered an extra header. For example, if you send a call with the following headers:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"X-My-Header: my-value\nX-Another-Header: another-value\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Then, the ",(0,s.jsx)(n.code,{children:"extraHeaders"})," field will contain the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "X-My-Header": "my-value",\n "X-Another-Header": "another-value"\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"After subscribing to the subject and making a call, you should see something like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"NATS call started",src:t(2112).A+"",width:"880",height:"430"})}),"\n",(0,s.jsx)(n.p,{children:"Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.call.ended\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.call.ended"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callId"}),": The unique identifier of the call"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"endTime"}),": The time the call ended formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"hangupCause"}),": The reason the call ended"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["Please see the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/edgeport/src/main/java/io/routr/HangupCauses.java",children:"HangupCause.java"})," class for a list of possible hangup causes."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Lastly, you can subscribe to the ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," subject to receive endpoint registered events."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"nats sub routr.endpoint.registered\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"routr.endpoint.registered"})," event contains the following fields:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"aor"}),": The address of record of the endpoint"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"registeredAt"}),": The time the endpoint registered formatted as an ISO 8601 string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"expires"}),": The time in seconds the endpoint will remain registered"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"extraHeaders"}),": Any extra headers that were sent with the call"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.code,{children:"NATS_PUBLISHER_SUBJECT"})," environment variable to change the based subject name. For example, you can set it to ",(0,s.jsx)(n.code,{children:"myserver"})," to receive call events in the ",(0,s.jsx)(n.code,{children:"myserver.calls.started"})," subject."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2774:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-context-add-nats-7fe6194a7f1fbc08702107ea126c85fd.png"},2112:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/nats-sub-routr-call-started-c75ef439e4a47b8697930de27b57552b.png"},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var s=t(6540);const r={},o=s.createContext(r);function l(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1b4aa58.96f800a4.js b/assets/js/f1b4aa58.96f800a4.js new file mode 100644 index 000000000..ed8dc90f1 --- /dev/null +++ b/assets/js/f1b4aa58.96f800a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8755],{212:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var r=n(4848),o=n(8453);const c={},s="Securing the Server",i={id:"connect/securing-the-server",title:"Securing the Server",description:"Coming soon.",source:"@site/docs/connect/securing-the-server.md",sourceDirName:"connect",slug:"/connect/securing-the-server",permalink:"/docs/2.11.5/connect/securing-the-server",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/securing-the-server.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebRTC Support",permalink:"/docs/2.11.5/connect/webrtc-support"},next:{title:"Sending Call Events to NATS",permalink:"/docs/2.11.5/connect/sending-call-events-to-nats"}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"securing-the-server",children:"Securing the Server"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const o={},c=r.createContext(o);function s(e){const t=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1b4aa58.d829509f.js b/assets/js/f1b4aa58.d829509f.js deleted file mode 100644 index 1caffcf11..000000000 --- a/assets/js/f1b4aa58.d829509f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8755],{5835:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>c,metadata:()=>i,toc:()=>a});var r=n(4848),o=n(8453);const c={},s="Securing the Server",i={id:"connect/securing-the-server",title:"Securing the Server",description:"Coming soon.",source:"@site/docs/connect/securing-the-server.md",sourceDirName:"connect",slug:"/connect/securing-the-server",permalink:"/docs/2.0.0/connect/securing-the-server",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/securing-the-server.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"WebRTC Support",permalink:"/docs/2.0.0/connect/webrtc-support"},next:{title:"Sending Call Events to NATS",permalink:"/docs/2.0.0/connect/sending-call-events-to-nats"}},u={},a=[];function d(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"securing-the-server",children:"Securing the Server"}),"\n",(0,r.jsx)(t.p,{children:"Coming soon."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var r=n(6540);const o={},c=r.createContext(o);function s(e){const t=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3f39cc5.ca80ae11.js b/assets/js/f3f39cc5.b7b9c5f3.js similarity index 97% rename from assets/js/f3f39cc5.ca80ae11.js rename to assets/js/f3f39cc5.b7b9c5f3.js index 927cc1544..60ca89455 100644 --- a/assets/js/f3f39cc5.ca80ae11.js +++ b/assets/js/f3f39cc5.b7b9c5f3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7387],{1850:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(4848),o=r(8453);const s={},i="Media",a={id:"introduction/media",title:"Media",description:"There is a subreddit collecting all Routr-related resources on the internet.",source:"@site/versioned_docs/version-1.x.x/introduction/media.md",sourceDirName:"introduction",slug:"/introduction/media",permalink:"/docs/1.x.x/introduction/media",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/media.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"},next:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"}},d={},l=[{value:"Blogs",id:"blogs",level:2},{value:"Tutorials",id:"tutorials",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"media",children:"Media"}),"\n",(0,n.jsxs)(t.p,{children:["There is a ",(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/Routr/",children:"subreddit"})," collecting all Routr-related resources on the internet."]}),"\n",(0,n.jsx)(t.p,{children:"The following selection of resources is particularly useful to get started with Routr."}),"\n",(0,n.jsx)(t.h2,{id:"blogs",children:"Blogs"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/tutorial-getting-started-with-routr-sip-server-f66c5216690a",children:"Getting started with Routr SIP Server"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/migrating-from-nashorn-to-graaljs-lessons-learn-2385aa62e35d",children:"Migrating Routr from Nashorn to GraalJS: Lessons Learn"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"tutorials",children:"Tutorials"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"/docs/1.x.x/guides/basic-setup",children:"Instructions and example a basic setup of Routr"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[7387],{3107:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(4848),o=r(8453);const s={},i="Media",a={id:"introduction/media",title:"Media",description:"There is a subreddit collecting all Routr-related resources on the internet.",source:"@site/versioned_docs/version-1.x.x/introduction/media.md",sourceDirName:"introduction",slug:"/introduction/media",permalink:"/docs/1.x.x/introduction/media",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/introduction/media.md",tags:[],version:"1.x.x",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/docs/1.x.x/introduction/glossary"},next:{title:"Routr 1.0RC3 - User Location Lookup Performance Tests",permalink:"/docs/1.x.x/introduction/performance-tests/user-location"}},d={},l=[{value:"Blogs",id:"blogs",level:2},{value:"Tutorials",id:"tutorials",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"media",children:"Media"}),"\n",(0,n.jsxs)(t.p,{children:["There is a ",(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/Routr/",children:"subreddit"})," collecting all Routr-related resources on the internet."]}),"\n",(0,n.jsx)(t.p,{children:"The following selection of resources is particularly useful to get started with Routr."}),"\n",(0,n.jsx)(t.h2,{id:"blogs",children:"Blogs"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/tutorial-getting-started-with-routr-sip-server-f66c5216690a",children:"Getting started with Routr SIP Server"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://medium.com/@pedrosanders/migrating-from-nashorn-to-graaljs-lessons-learn-2385aa62e35d",children:"Migrating Routr from Nashorn to GraalJS: Lessons Learn"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"tutorials",children:"Tutorials"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"/docs/1.x.x/guides/basic-setup",children:"Instructions and example a basic setup of Routr"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4357d2a.a6c56766.js b/assets/js/f4357d2a.a6c56766.js deleted file mode 100644 index 5d364b658..000000000 --- a/assets/js/f4357d2a.a6c56766.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6575],{696:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={sidebar_position:1},c="Docker installation",a={id:"connect/quick-start/docker",title:"Docker installation",description:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:',source:"@site/docs/connect/quick-start/docker.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/docker",permalink:"/docs/2.0.0/connect/quick-start/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/docker.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.0.0/connect/concepts"},next:{title:"Installing in Kubernetes",permalink:"/docs/2.0.0/connect/quick-start/kubernetes"}},i={},l=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"docker-installation",children:"Docker installation"}),"\n",(0,o.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.em,{children:"compose.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n\nvolumes:\n shared:\n'})}),"\n",(0,o.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,o.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see a containers with its status. Your output should look like the one below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,o.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,o.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,o.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:"And here is an example of creating a SIP Domain:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For additional examples, refer to the command line ",(0,o.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation."})]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4357d2a.dddf617a.js b/assets/js/f4357d2a.dddf617a.js new file mode 100644 index 000000000..20202fc33 --- /dev/null +++ b/assets/js/f4357d2a.dddf617a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6575],{2805:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),r=t(8453);const s={sidebar_position:1},c="Docker installation",a={id:"connect/quick-start/docker",title:"Docker installation",description:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:',source:"@site/docs/connect/quick-start/docker.md",sourceDirName:"connect/quick-start",slug:"/connect/quick-start/docker",permalink:"/docs/2.11.5/connect/quick-start/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/connect/quick-start/docker.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Concepts",permalink:"/docs/2.11.5/connect/concepts"},next:{title:"Installing in Kubernetes",permalink:"/docs/2.11.5/connect/quick-start/kubernetes"}},i={},l=[];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"docker-installation",children:"Docker installation"}),"\n",(0,o.jsx)(n.p,{children:'First, create a directory named "routr". Navigate into the new folder, and then copy the content below:'}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.em,{children:"compose.yaml"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'version: "3"\n\nservices:\n\n routr:\n image: fonoster/routr-one:latest\n environment:\n EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}\n ports:\n - 51908:51908\n - 5060:5060/udp\n\nvolumes:\n shared:\n'})}),"\n",(0,o.jsx)(n.p,{children:"Then, start the server with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Be sure to replace with your IP address\nDOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up\n"})}),"\n",(0,o.jsx)(n.p,{children:"Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker ps -a --format 'table {{.ID}}\\t{{.Image}}\\t{{.Status}}'\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see a containers with its status. Your output should look like the one below:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"CONTAINER ID IMAGE STATUS\n6c63fd573768 fonoster/routr-one:latest Up About a minute\n"})}),"\n",(0,o.jsx)(n.p,{children:'If the status of your service is "Up," you are ready to go.'}),"\n",(0,o.jsx)(n.p,{children:"Finally, install the command-line tool and start building your SIP Network."}),"\n",(0,o.jsx)(n.p,{children:"You can install the tool with npm as follows:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --location=global @routr/ctl\n"})}),"\n",(0,o.jsx)(n.p,{children:"And here is an example of creating a SIP Domain:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"rctl domains create --insecure\n"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"The --insecure flag is required as we did not set up the TLS settings."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For additional examples, refer to the command line ",(0,o.jsx)(n.a,{href:"https://www.npmjs.com/package/@routr/ctl",children:"documentation."})]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5184ac4.15ae4dba.js b/assets/js/f5184ac4.15ae4dba.js deleted file mode 100644 index ec7cbc2ca..000000000 --- a/assets/js/f5184ac4.15ae4dba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6099],{7982:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),r=t(8453);const s={},i="Location Service",c={id:"development/components/location",title:"Location Service",description:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.",source:"@site/docs/development/components/location.md",sourceDirName:"development/components",slug:"/development/components/location",permalink:"/docs/2.0.0/development/components/location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/location.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Message Dispatcher",permalink:"/docs/2.0.0/development/components/dispatcher"},next:{title:"Registry Service",permalink:"/docs/2.0.0/development/components/registry"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Location Service with Docker",id:"launching-the-location-service-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"location-service",children:"Location Service"}),"\n",(0,o.jsx)(n.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,o.jsx)(n.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,o.jsx)(n.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,o.jsxs)(n.p,{children:["Two balancing algorithms are available. The first is ",(0,o.jsx)(n.code,{children:"round-robin"}),", and the second is ",(0,o.jsx)(n.code,{children:"least-sessions"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,o.jsx)(n.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that the load balancing section sets the ",(0,o.jsx)(n.code,{children:"withSessionAffinity"})," to ",(0,o.jsx)(n.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every Asterisk server that registers using the ",(0,o.jsx)(n.code,{children:"asterisk"})," username will join the same group under the ",(0,o.jsx)(n.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,o.jsx)(n.p,{children:"To configure the Location Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"region"})}),(0,o.jsx)(n.td,{children:"Reserved for future use"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"bindAddr"})}),(0,o.jsx)(n.td,{children:"IPv4 interface on which to accept requests"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache"})}),(0,o.jsx)(n.td,{children:"Cache configuration"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.provider"})}),(0,o.jsxs)(n.td,{children:["Cache provider (Accepts either ",(0,o.jsx)(n.code,{children:"memory"})," or ",(0,o.jsx)(n.code,{children:"redis"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.parameters"})}),(0,o.jsx)(n.td,{children:"Cache parameters (Comma-separated key-value pairs)"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,o.jsx)(n.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"username"})}),(0,o.jsx)(n.td,{children:"Username (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"password"})}),(0,o.jsx)(n.td,{children:"Password (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"host"})}),(0,o.jsxs)(n.td,{children:["Redis host (Defaults to ",(0,o.jsx)(n.code,{children:"localhost"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"port"})}),(0,o.jsxs)(n.td,{children:["Redis port (Defaults to ",(0,o.jsx)(n.code,{children:"6379"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"secure"})}),(0,o.jsx)(n.td,{children:"Use secure connection for Redis"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Here is an example of a configuration file:"}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.code,{children:"location.yaml"})," or ",(0,o.jsx)(n.code,{children:"location.json"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'kind: Location\napiVersion: v2beta1\nmetadata:\n region: default\nspec:\n bindAddr: 0.0.0.0:51902\n cache:\n provider: redis\n parameters: "host=localhost,port=6379"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that using the ",(0,o.jsx)(n.code,{children:"memory"})," provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the ",(0,o.jsx)(n.code,{children:"least-session"})," algorithm and run multiple instances of the Location Service. In such cases, you will need the ",(0,o.jsx)(n.code,{children:"redis"})," provider."]}),"\n",(0,o.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,o.jsx)(n.p,{children:"Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.location.v2beta1;\n\nimport "google/protobuf/empty.proto";\nimport "common.proto";\nimport "processor.proto";\n\nservice Location {\n rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}\n rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}\n rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}\n}\n\n// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)\nmessage Route {\n string user = 1;\n string host = 2;\n string port = 3;\n string advertised_host = 13;\n string advertised_port = 14;\n fonoster.routr.common.v2beta1.Transport transport = 4;\n int64 registered_on = 5;\n int32 expires = 6;\n int32 session_count = 7;\n string edge_port_ref = 8;\n repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;\n repeated string localnets = 10;\n repeated string external_addrs = 11;\n // During route creation, an endpoint can request to add labels that can later be\n // used as selectors. For example, a Softphone can add a label `priority=1` to indicate\n // that it is the preferred endpoint for the given AOR.\n map<string, string> labels = 12;\n}\n\nmessage AddRouteRequest {\n // Address of record for the endpoint or trunk\n string aor = 1;\n Route route = 2;\n}\n\nmessage FindRoutesRequest {\n message Backend {\n enum Algoritm {\n ROUND_ROBIN = 0;\n LEAST_SESSIONS = 1;\n }\n string ref = 1;\n bool with_session_affinity = 2;\n Algoritm algorithm = 3;\n }\n string call_id = 1;\n string aor = 2;\n string session_affinity_ref = 3;\n Backend backend = 4;\n map<string, string> labels = 5;\n}\n\nmessage FindRoutesResponse {\n repeated Route routes = 1;\n}\n\nmessage RemoveRoutesRequest {\n string aor = 1;\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Upon receiving a valid ",(0,o.jsx)(n.code,{children:"AddRoute"})," request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition."]}),"\n",(0,o.jsxs)(n.p,{children:["Link to the ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/location.proto",children:"protobuf definition."})]}),"\n",(0,o.jsx)(n.h2,{id:"launching-the-location-service-with-docker",children:"Launching the Location Service with Docker"}),"\n",(0,o.jsxs)(n.p,{children:["The Location Service is available as a Docker image from ",(0,o.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-location",children:"Docker Hub"}),". To launch the Location Service with Docker, you can use the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port ",(0,o.jsx)(n.code,{children:"51902"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,o.jsx)(n.code,{children:"51902"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,o.jsxs)(n.p,{children:["One easy way to interact with the Location Service for testing and development is to use ",(0,o.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Location Service using gRPCurl:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto location.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.location.v2beta1.Location/AddRouteRequest\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>c});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5184ac4.fe1d3beb.js b/assets/js/f5184ac4.fe1d3beb.js new file mode 100644 index 000000000..69b7d53e6 --- /dev/null +++ b/assets/js/f5184ac4.fe1d3beb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6099],{2417:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),r=t(8453);const s={},i="Location Service",c={id:"development/components/location",title:"Location Service",description:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.",source:"@site/docs/development/components/location.md",sourceDirName:"development/components",slug:"/development/components/location",permalink:"/docs/2.11.5/development/components/location",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/location.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Message Dispatcher",permalink:"/docs/2.11.5/development/components/dispatcher"},next:{title:"Registry Service",permalink:"/docs/2.11.5/development/components/registry"}},a={},d=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the Location Service with Docker",id:"launching-the-location-service-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"location-service",children:"Location Service"}),"\n",(0,o.jsx)(n.p,{children:"In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests."}),"\n",(0,o.jsx)(n.p,{children:"Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful."}),"\n",(0,o.jsx)(n.p,{children:"For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected."}),"\n",(0,o.jsxs)(n.p,{children:["Two balancing algorithms are available. The first is ",(0,o.jsx)(n.code,{children:"round-robin"}),", and the second is ",(0,o.jsx)(n.code,{children:"least-sessions"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN."}),"\n",(0,o.jsx)(n.p,{children:"To do this, create a Peer configuration for your Asterisk server similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v2beta1\nkind: Peer\nref: peer-01\nmetadata:\n name: Asterisk (Media Server)\nspec:\n aor: sip:conference@sip.local\n username: asterisk\n credentialsRef: credentials-01\n loadBalancing:\n withSessionAffinity: true\n algorithm: least-sessions\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that the load balancing section sets the ",(0,o.jsx)(n.code,{children:"withSessionAffinity"})," to ",(0,o.jsx)(n.code,{children:"true"}),". We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server."]}),"\n",(0,o.jsxs)(n.p,{children:["Every Asterisk server that registers using the ",(0,o.jsx)(n.code,{children:"asterisk"})," username will join the same group under the ",(0,o.jsx)(n.code,{children:"sip:conference@sip.local"})," Address of Record (AOR)."]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,o.jsx)(n.p,{children:"To configure the Location Service, you must provide a YAML or JSON configuration with the following structure."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"region"})}),(0,o.jsx)(n.td,{children:"Reserved for future use"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"bindAddr"})}),(0,o.jsx)(n.td,{children:"IPv4 interface on which to accept requests"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache"})}),(0,o.jsx)(n.td,{children:"Cache configuration"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.provider"})}),(0,o.jsxs)(n.td,{children:["Cache provider (Accepts either ",(0,o.jsx)(n.code,{children:"memory"})," or ",(0,o.jsx)(n.code,{children:"redis"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"cache.parameters"})}),(0,o.jsx)(n.td,{children:"Cache parameters (Comma-separated key-value pairs)"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"cache.parameters"})," property is only needed if you are using the Redis provider."]}),"\n",(0,o.jsx)(n.p,{children:"The following table shows the available parameters for the Redis provider."}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"}),(0,o.jsx)(n.th,{children:"Required"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"username"})}),(0,o.jsx)(n.td,{children:"Username (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"password"})}),(0,o.jsx)(n.td,{children:"Password (if required by Redis)"}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"host"})}),(0,o.jsxs)(n.td,{children:["Redis host (Defaults to ",(0,o.jsx)(n.code,{children:"localhost"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"port"})}),(0,o.jsxs)(n.td,{children:["Redis port (Defaults to ",(0,o.jsx)(n.code,{children:"6379"}),")"]}),(0,o.jsx)(n.td,{children:"No"})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"secure"})}),(0,o.jsx)(n.td,{children:"Use secure connection for Redis"}),(0,o.jsx)(n.td,{children:"No"})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Here is an example of a configuration file:"}),"\n",(0,o.jsxs)(n.p,{children:["Filename: ",(0,o.jsx)(n.code,{children:"location.yaml"})," or ",(0,o.jsx)(n.code,{children:"location.json"})]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'kind: Location\napiVersion: v2beta1\nmetadata:\n region: default\nspec:\n bindAddr: 0.0.0.0:51902\n cache:\n provider: redis\n parameters: "host=localhost,port=6379"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Notice that using the ",(0,o.jsx)(n.code,{children:"memory"})," provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the ",(0,o.jsx)(n.code,{children:"least-session"})," algorithm and run multiple instances of the Location Service. In such cases, you will need the ",(0,o.jsx)(n.code,{children:"redis"})," provider."]}),"\n",(0,o.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,o.jsx)(n.p,{children:"Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.location.v2beta1;\n\nimport "google/protobuf/empty.proto";\nimport "common.proto";\nimport "processor.proto";\n\nservice Location {\n rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}\n rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}\n rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}\n}\n\n// A binding created by an endpoint (Softphone, PBX, Conference System, etc.)\nmessage Route {\n string user = 1;\n string host = 2;\n string port = 3;\n string advertised_host = 13;\n string advertised_port = 14;\n fonoster.routr.common.v2beta1.Transport transport = 4;\n int64 registered_on = 5;\n int32 expires = 6;\n int32 session_count = 7;\n string edge_port_ref = 8;\n repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;\n repeated string localnets = 10;\n repeated string external_addrs = 11;\n // During route creation, an endpoint can request to add labels that can later be\n // used as selectors. For example, a Softphone can add a label `priority=1` to indicate\n // that it is the preferred endpoint for the given AOR.\n map<string, string> labels = 12;\n}\n\nmessage AddRouteRequest {\n // Address of record for the endpoint or trunk\n string aor = 1;\n Route route = 2;\n}\n\nmessage FindRoutesRequest {\n message Backend {\n enum Algoritm {\n ROUND_ROBIN = 0;\n LEAST_SESSIONS = 1;\n }\n string ref = 1;\n bool with_session_affinity = 2;\n Algoritm algorithm = 3;\n }\n string call_id = 1;\n string aor = 2;\n string session_affinity_ref = 3;\n Backend backend = 4;\n map<string, string> labels = 5;\n}\n\nmessage FindRoutesResponse {\n repeated Route routes = 1;\n}\n\nmessage RemoveRoutesRequest {\n string aor = 1;\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Upon receiving a valid ",(0,o.jsx)(n.code,{children:"AddRoute"})," request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition."]}),"\n",(0,o.jsxs)(n.p,{children:["Link to the ",(0,o.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/location.proto",children:"protobuf definition."})]}),"\n",(0,o.jsx)(n.h2,{id:"launching-the-location-service-with-docker",children:"Launching the Location Service with Docker"}),"\n",(0,o.jsxs)(n.p,{children:["The Location Service is available as a Docker image from ",(0,o.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-location",children:"Docker Hub"}),". To launch the Location Service with Docker, you can use the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port ",(0,o.jsx)(n.code,{children:"51902"})," for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port ",(0,o.jsx)(n.code,{children:"51902"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,o.jsxs)(n.p,{children:["One easy way to interact with the Location Service for testing and development is to use ",(0,o.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a request to the Location Service using gRPCurl:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto location.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.location.v2beta1.Location/AddRouteRequest\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>c});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb8f7c97.d7fcc07c.js b/assets/js/fb8f7c97.d7fcc07c.js new file mode 100644 index 000000000..e8096ad44 --- /dev/null +++ b/assets/js/fb8f7c97.d7fcc07c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[3791],{3066:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var o=n(4848),s=n(8453);const i={},r="Testing with SEET",c={id:"development/testing-with-seet",title:"Testing with SEET",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/development/testing-with-seet.md",sourceDirName:"development",slug:"/development/testing-with-seet",permalink:"/docs/2.0.0/development/testing-with-seet",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/development/testing-with-seet.md",tags:[],version:"2.0.0",frontMatter:{}},d={},u=[];function p(e){const t={h1:"h1",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"testing-with-seet",children:"Testing with SEET"}),"\n",(0,o.jsx)(t.p,{children:"Coming soon."})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var o=n(6540);const s={},i=o.createContext(s);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd5b422d.07617914.js b/assets/js/fd5b422d.07617914.js new file mode 100644 index 000000000..0fa6fce47 --- /dev/null +++ b/assets/js/fd5b422d.07617914.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1616],{8162:(t,o,e)=>{e.r(o),e.d(o,{assets:()=>l,contentTitle:()=>s,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>u});var n=e(4848),i=e(8453);const r={},s="Deploying to Civo with Helm",c={id:"tutorials/deploying-to-civo-with-helm",title:"Deploying to Civo with Helm",description:"Coming soon.",source:"@site/versioned_docs/version-2.0.0/tutorials/deploying-to-civo-with-helm.md",sourceDirName:"tutorials",slug:"/tutorials/deploying-to-civo-with-helm",permalink:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-2.0.0/tutorials/deploying-to-civo-with-helm.md",tags:[],version:"2.0.0",frontMatter:{}},l={},u=[];function d(t){const o={h1:"h1",p:"p",...(0,i.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"deploying-to-civo-with-helm",children:"Deploying to Civo with Helm"}),"\n",(0,n.jsx)(o.p,{children:"Coming soon."})]})}function a(t={}){const{wrapper:o}={...(0,i.R)(),...t.components};return o?(0,n.jsx)(o,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},8453:(t,o,e)=>{e.d(o,{R:()=>s,x:()=>c});var n=e(6540);const i={},r=n.createContext(i);function s(t){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function c(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:s(t.components),n.createElement(r.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/ff3f7f2b.8416d230.js b/assets/js/ff3f7f2b.8416d230.js new file mode 100644 index 000000000..3dee9fd7c --- /dev/null +++ b/assets/js/ff3f7f2b.8416d230.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6903],{8997:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(4848),i=t(8453);const r={},s="Development with Gitpod",a={id:"development/development-mode-with-gitpod",title:"Development with Gitpod",description:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.",source:"@site/docs/development/development-mode-with-gitpod.md",sourceDirName:"development",slug:"/development/development-mode-with-gitpod",permalink:"/docs/2.11.5/development/development-mode-with-gitpod",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/development-mode-with-gitpod.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/docs/2.11.5/development/quick-start"},next:{title:"Overview",permalink:"/docs/2.11.5/development/components/overview"}},c={},d=[];function l(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"development-with-gitpod",children:"Development with Gitpod"}),"\n",(0,n.jsx)(o.p,{children:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories."}),"\n",(0,n.jsx)(o.p,{children:"To launch a Gitpod workspace, click the button below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/#https://github.com/fonoster/routr",children:(0,n.jsx)(o.img,{src:"https://gitpod.io/button/open-in-gitpod.svg",alt:"Open in Gitpod"})})}),"\n",(0,n.jsx)(o.p,{children:"This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode."}),"\n",(0,n.jsx)(o.p,{children:"While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod."}),"\n",(0,n.jsx)(o.p,{children:"First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/user/keys",children:"https://gitpod.io/user/keys"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod account keys",src:t(6803).A+"",width:"1358",height:"527"})}),"\n",(0,n.jsx)(o.p,{children:"On Linux or macOS, you can find your public key by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat ~/.ssh/id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"Or, if you are using Windows, you can find your public key using this command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat %USERPROFILE%\\.ssh\\id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"If you don't have a public key, you can generate one by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:'ssh-keygen -t rsa -b 4096 -C "your_email@example.com"\n'})}),"\n",(0,n.jsx)(o.p,{children:'Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/workspaces",children:"https://gitpod.io/workspaces"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod workspace",src:t(5430).A+"",width:"1360",height:"588"})}),"\n",(0,n.jsxs)(o.p,{children:["You want to be able to access port ",(0,n.jsx)(o.code,{children:"5060"})," from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that."]}),"\n",(0,n.jsxs)(o.p,{children:["To create the port forward, take the SSH connection string and add ",(0,n.jsx)(o.code,{children:"-L 5060:localhost:5060"})," to the end of the line. For example, your command might look like this:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh <workspace-ssh-connection> -L 5060:localhost:5060\n"})}),"\n",(0,n.jsx)(o.p,{children:'Be sure to replace "workspace SSH connection" with your local connection.'}),"\n",(0,n.jsx)(o.p,{children:"Here is an example of what the command might look like:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 \n"})}),"\n",(0,n.jsxs)(o.p,{children:["This command forwards traffic from your local port ",(0,n.jsx)(o.code,{children:"5060"})," to your Gitpod workspace's port ",(0,n.jsx)(o.code,{children:"5060"}),", allowing you to connect via SIP."]}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command."}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:'This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/main/config/resources",children:"https://github.com/fonoster/routr/blob/main/config/resources"})}),"\n",(0,n.jsx)(o.p,{children:"Feel free to explore these files and make changes as needed."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},6803:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-account-keys-0833e0da64fdd0fa6867611cb583a0fc.png"},5430:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-workspace-9a23cadbc9b3dfdfa8eda64fe4da4475.png"},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(6540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ff3f7f2b.b883c263.js b/assets/js/ff3f7f2b.b883c263.js deleted file mode 100644 index c1a12ffe1..000000000 --- a/assets/js/ff3f7f2b.b883c263.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[6903],{3532:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(4848),i=t(8453);const r={},s="Development with Gitpod",a={id:"development/development-mode-with-gitpod",title:"Development with Gitpod",description:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.",source:"@site/docs/development/development-mode-with-gitpod.md",sourceDirName:"development",slug:"/development/development-mode-with-gitpod",permalink:"/docs/2.0.0/development/development-mode-with-gitpod",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/development-mode-with-gitpod.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/docs/2.0.0/development/quick-start"},next:{title:"Overview",permalink:"/docs/2.0.0/development/components/overview"}},c={},d=[];function l(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"development-with-gitpod",children:"Development with Gitpod"}),"\n",(0,n.jsx)(o.p,{children:"Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories."}),"\n",(0,n.jsx)(o.p,{children:"To launch a Gitpod workspace, click the button below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/#https://github.com/fonoster/routr",children:(0,n.jsx)(o.img,{src:"https://gitpod.io/button/open-in-gitpod.svg",alt:"Open in Gitpod"})})}),"\n",(0,n.jsx)(o.p,{children:"This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode."}),"\n",(0,n.jsx)(o.p,{children:"While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod."}),"\n",(0,n.jsx)(o.p,{children:"First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/user/keys",children:"https://gitpod.io/user/keys"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod account keys",src:t(6803).A+"",width:"1358",height:"527"})}),"\n",(0,n.jsx)(o.p,{children:"On Linux or macOS, you can find your public key by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat ~/.ssh/id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"Or, if you are using Windows, you can find your public key using this command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"cat %USERPROFILE%\\.ssh\\id_rsa.pub\n"})}),"\n",(0,n.jsx)(o.p,{children:"If you don't have a public key, you can generate one by running the following command in your terminal:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:'ssh-keygen -t rsa -b 4096 -C "your_email@example.com"\n'})}),"\n",(0,n.jsx)(o.p,{children:'Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://gitpod.io/workspaces",children:"https://gitpod.io/workspaces"})}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"Gitpod workspace",src:t(5430).A+"",width:"1360",height:"588"})}),"\n",(0,n.jsxs)(o.p,{children:["You want to be able to access port ",(0,n.jsx)(o.code,{children:"5060"})," from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that."]}),"\n",(0,n.jsxs)(o.p,{children:["To create the port forward, take the SSH connection string and add ",(0,n.jsx)(o.code,{children:"-L 5060:localhost:5060"})," to the end of the line. For example, your command might look like this:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh <workspace-ssh-connection> -L 5060:localhost:5060\n"})}),"\n",(0,n.jsx)(o.p,{children:'Be sure to replace "workspace SSH connection" with your local connection.'}),"\n",(0,n.jsx)(o.p,{children:"Here is an example of what the command might look like:"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 \n"})}),"\n",(0,n.jsxs)(o.p,{children:["This command forwards traffic from your local port ",(0,n.jsx)(o.code,{children:"5060"})," to your Gitpod workspace's port ",(0,n.jsx)(o.code,{children:"5060"}),", allowing you to connect via SIP."]}),"\n",(0,n.jsxs)(o.blockquote,{children:["\n",(0,n.jsx)(o.p,{children:"Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command."}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:'This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:'}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://github.com/fonoster/routr/blob/main/config/resources",children:"https://github.com/fonoster/routr/blob/main/config/resources"})}),"\n",(0,n.jsx)(o.p,{children:"Feel free to explore these files and make changes as needed."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},6803:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-account-keys-0833e0da64fdd0fa6867611cb583a0fc.png"},5430:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/gitpod-workspace-9a23cadbc9b3dfdfa8eda64fe4da4475.png"},8453:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>a});var n=t(6540);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.6bdfffad.js b/assets/js/main.6bdfffad.js deleted file mode 100644 index 94a37f91c..000000000 --- a/assets/js/main.6bdfffad.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.6bdfffad.js.LICENSE.txt */ -(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8792],{9188:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(6540);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"017ddd06":[()=>n.e(9845).then(n.bind(n,6740)),"@site/versioned_docs/version-1.x.x/configuration/users.md",6740],"02617853":[()=>n.e(3191).then(n.bind(n,2744)),"@site/docs/development/components/dispatcher.md",2744],"06896101":[()=>n.e(3738).then(n.bind(n,2007)),"@site/docs/overview/deploy-with-docker.md",2007],"093b4e4f":[()=>n.e(4714).then(n.bind(n,2357)),"@site/versioned_docs/version-1.x.x/administration/webconsole.md",2357],"09b719bb":[()=>n.e(6541).then(n.bind(n,5722)),"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",5722],"0abf3980":[()=>n.e(3690).then(n.t.bind(n,4061,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",4061],"0f2bd920":[()=>n.e(2506).then(n.bind(n,1270)),"@site/versioned_docs/version-1.x.x/api/location/list.md",1270],"118e913f":[()=>n.e(1).then(n.bind(n,9279)),"@site/docs/overview/concepts.md",9279],"129db88c":[()=>n.e(2692).then(n.bind(n,7480)),"@site/docs/connect/webrtc-support.md",7480],"144994e6":[()=>n.e(1171).then(n.bind(n,8162)),"@site/docs/development/components/rtprelay.md",8162],17896441:[()=>Promise.all([n.e(1869),n.e(8401)]).then(n.bind(n,6766)),"@theme/DocItem",6766],"19dd4331":[()=>n.e(4126).then(n.bind(n,5624)),"@site/versioned_docs/version-1.x.x/api/agents/update.md",5624],"1a1a9e3d":[()=>n.e(8512).then(n.bind(n,332)),"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",332],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,2672)),"@theme/SearchPage",2672],"1ad9bfe0":[()=>n.e(3383).then(n.bind(n,6807)),"@site/docs/development/orchestration-with-docker.md",6807],"1b166456":[()=>n.e(208).then(n.bind(n,9778)),"@site/versioned_docs/version-1.x.x/api/sys/info.md",9778],"1cd31f12":[()=>n.e(5056).then(n.bind(n,5622)),"@site/versioned_docs/version-1.x.x/api/agents/delete.md",5622],"1ea220c7":[()=>n.e(6792).then(n.bind(n,1009)),"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",1009],"1ffdd7de":[()=>n.e(7782).then(n.bind(n,3437)),"@site/docs/faqs.md",3437],"210b7c69":[()=>n.e(1703).then(n.bind(n,9633)),"@site/docs/development/components/simpleauth.md",9633],"21169ea0":[()=>n.e(9504).then(n.bind(n,7235)),"@site/docs/development/orchestration-with-kubernetes.md",7235],"23efd64d":[()=>n.e(7225).then(n.bind(n,2575)),"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",2575],"26da1a01":[()=>n.e(2401).then(n.bind(n,1080)),"@site/docs/development/building-a-scaip-processor.md",1080],"2a36568f":[()=>n.e(2964).then(n.bind(n,7173)),"@site/docs/connect/home-or-office-setup.md",7173],"321dfeeb":[()=>n.e(537).then(n.bind(n,9683)),"@site/versioned_docs/version-1.x.x/api/overview.md",9683],"3325c53c":[()=>n.e(6944).then(n.bind(n,7496)),"@site/versioned_docs/version-1.x.x/introduction/installation.md",7496],"33664cb1":[()=>n.e(9953).then(n.bind(n,4987)),"@site/docs/development/components/edgeport.md",4987],"35bee977":[()=>n.e(1304).then(n.bind(n,5644)),"@site/versioned_docs/version-1.x.x/concepts.md",5644],"39d73575":[()=>n.e(1780).then(n.bind(n,2655)),"@site/docs/development/alterations/methods.md",2655],"3a673d53":[()=>n.e(831).then(n.bind(n,3202)),"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",3202],"3c0cfdd0":[()=>n.e(4480).then(n.bind(n,6456)),"@site/docs/connect/quick-start/kubernetes.md",6456],"3e7ceef0":[()=>n.e(5613).then(n.bind(n,7156)),"@site/versioned_docs/version-1.x.x/configuration/general.md",7156],"3f9d54d1":[()=>n.e(2333).then(n.bind(n,3451)),"@site/docs/development/custom-data-with-the-apiserver.md",3451],"40f2a0b4":[()=>n.e(6926).then(n.bind(n,125)),"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",125],"40f2f3c6":[()=>n.e(8353).then(n.bind(n,4765)),"@site/versioned_docs/version-1.x.x/api/domains/delete.md",4765],"411db075":[()=>n.e(8535).then(n.bind(n,7134)),"@site/versioned_docs/version-1.x.x/api/peers/create.md",7134],"43d3d555":[()=>n.e(3624).then(n.bind(n,4236)),"@site/docs/connect/nodesdk/sdk.md",4236],"4d0c799d":[()=>n.e(823).then(n.bind(n,2260)),"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",2260],"4d54d076":[()=>n.e(1459).then(n.bind(n,6564)),"@site/docs/contributing.md",6564],"4dcd5895":[()=>n.e(6615).then(n.bind(n,3022)),"@site/versioned_docs/version-1.x.x/api/numbers/update.md",3022],"4e27cd47":[()=>n.e(8253).then(n.bind(n,5846)),"@site/versioned_docs/version-1.x.x/api/location/create.md",5846],"4e3cbe94":[()=>n.e(6692).then(n.bind(n,7403)),"@site/docs/development/testing-with-seet.md",7403],"54969ead":[()=>n.e(364).then(n.bind(n,2994)),"@site/docs/development/metrics-events-logs-and-traces.md",2994],"5514a4b8":[()=>n.e(583).then(n.bind(n,405)),"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",405],"5a1924d4":[()=>n.e(2433).then(n.bind(n,4670)),"@site/docs/connect/concepts.md",4670],"5a510007":[()=>n.e(9012).then(n.bind(n,8671)),"@site/docs/tutorials/deploying-to-civo-with-helm.md",8671],"5e82a060":[()=>n.e(6038).then(n.bind(n,6118)),"@site/versioned_docs/version-1.x.x/api/gateways/list.md",6118],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ef0e9d6":[()=>n.e(911).then(n.bind(n,8999)),"@site/docs/community.md",8999],"64332b0f":[()=>n.e(8329).then(n.bind(n,4801)),"@site/versioned_docs/version-1.x.x/welcome.md",4801],"646468fb":[()=>n.e(821).then(n.bind(n,2013)),"@site/versioned_docs/version-1.x.x/api/location/delete.md",2013],"656951a7":[()=>n.e(5009).then(n.bind(n,5523)),"@site/versioned_docs/version-1.x.x/api/token.md",5523],"6a8a88b7":[()=>n.e(3244).then(n.bind(n,4846)),"@site/docs/development/introduction.md",4846],"6c14cd7d":[()=>n.e(6341).then(n.bind(n,5655)),"@site/versioned_docs/version-1.x.x/api/numbers/list.md",5655],"6c35bbce":[()=>n.e(4862).then(n.bind(n,3653)),"@site/versioned_docs/version-1.x.x/api/agents/list.md",3653],"6e2907e5":[()=>n.e(4366).then(n.bind(n,8213)),"@site/versioned_docs/version-1.x.x/api/sys/logs.md",8213],71153375:[()=>n.e(8911).then(n.bind(n,3017)),"@site/versioned_docs/version-1.x.x/api/config/get.md",3017],"72607e62":[()=>n.e(9042).then(n.bind(n,5831)),"@site/versioned_docs/version-1.x.x/api/registry.md",5831],"759bfbe1":[()=>n.e(1080).then(n.bind(n,1538)),"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",1538],"76273f75":[()=>n.e(3578).then(n.bind(n,9346)),"@site/docs/development/components/overview.md",9346],"7c32d245":[()=>n.e(529).then(n.bind(n,8786)),"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",8786],"7cf72cd4":[()=>n.e(8937).then(n.bind(n,1370)),"@site/docs/development/components/apiserver.md",1370],"7df8ae3f":[()=>n.e(2405).then(n.bind(n,5312)),"@site/versioned_docs/version-1.x.x/api/status/update.md",5312],"7efb1a82":[()=>n.e(767).then(n.bind(n,9586)),"@site/versioned_docs/version-1.x.x/configuration/numbers.md",9586],"81e5f1d0":[()=>n.e(9583).then(n.bind(n,4053)),"@site/versioned_docs/version-1.x.x/configuration/domains.md",4053],"8613bfde":[()=>n.e(3296).then(n.bind(n,7499)),"@site/docs/connect/sending-call-events-to-nats.md",7499],"876e022a":[()=>n.e(1214).then(n.bind(n,2481)),"@site/versioned_docs/version-1.x.x/configuration/gateways.md",2481],"8a9effda":[()=>n.e(3741).then(n.bind(n,8662)),"@site/versioned_docs/version-1.x.x/api/domains/list.md",8662],"8ac6f1f4":[()=>n.e(620).then(n.bind(n,7001)),"@site/docs/connect/nodesdk/overview.md",7001],"8d7e75fb":[()=>n.e(4719).then(n.bind(n,6102)),"@site/docs/overview/introduction.md",6102],"8f5f22a9":[()=>n.e(5362).then(n.t.bind(n,2556,19)),"~docs/default/version-1-x-x-metadata-prop-ec9.json",2556],"918bfdcb":[()=>n.e(1870).then(n.bind(n,1264)),"@site/versioned_docs/version-1.x.x/introduction/glossary.md",1264],"92a92b88":[()=>n.e(7940).then(n.bind(n,7149)),"@site/docs/development/building-a-processor.md",7149],"935f2afb":[()=>n.e(8581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],"943e77c3":[()=>n.e(1224).then(n.bind(n,9334)),"@site/versioned_docs/version-1.x.x/api/gateways/create.md",9334],"95069fb2":[()=>n.e(2358).then(n.bind(n,5203)),"@site/versioned_docs/version-1.x.x/api/peers/update.md",5203],"956a4ea6":[()=>n.e(4050).then(n.bind(n,6009)),"@site/docs/development/building-a-middleware.md",6009],"9799683e":[()=>n.e(6695).then(n.bind(n,1721)),"@site/versioned_docs/version-1.x.x/api/status/get.md",1721],"9840208a":[()=>n.e(8167).then(n.bind(n,4321)),"@site/versioned_docs/version-1.x.x/api/agents/create.md",4321],"99f83bea":[()=>n.e(4682).then(n.bind(n,1079)),"@site/versioned_docs/version-1.x.x/api/numbers/create.md",1079],"9a4dfeaa":[()=>n.e(7408).then(n.bind(n,8084)),"@site/versioned_docs/version-1.x.x/api/peers/get.md",8084],"9a5a69d5":[()=>n.e(7337).then(n.bind(n,1979)),"@site/versioned_docs/version-1.x.x/api/gateways/update.md",1979],"9beb87c2":[()=>n.e(3539).then(n.bind(n,4520)),"@site/docs/changelog.md",4520],"9d10a623":[()=>n.e(9955).then(n.bind(n,4374)),"@site/versioned_docs/version-1.x.x/api/domains/create.md",4374],"9fcefd11":[()=>n.e(3102).then(n.bind(n,4730)),"@site/docs/development/quick-start.md",4730],a0c5838c:[()=>n.e(3688).then(n.t.bind(n,7757,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7757],a30498ab:[()=>n.e(3857).then(n.bind(n,4036)),"@site/versioned_docs/version-1.x.x/configuration/agents.md",4036],a40a3312:[()=>n.e(9922).then(n.bind(n,2738)),"@site/versioned_docs/version-1.x.x/introduction/faq.md",2738],a4cb0559:[()=>n.e(9188).then(n.bind(n,8255)),"@site/versioned_docs/version-1.x.x/introduction/overview.md",8255],a552b93b:[()=>n.e(5872).then(n.bind(n,1013)),"@site/versioned_docs/version-1.x.x/api/peers/delete.md",1013],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a7c6e145:[()=>n.e(1079).then(n.bind(n,5138)),"@site/docs/development/extending-the-ctl.md",5138],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],a9d63626:[()=>n.e(7372).then(n.bind(n,1068)),"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",1068],b1e2c3e5:[()=>n.e(1953).then(n.bind(n,6891)),"@site/versioned_docs/version-1.x.x/api/domains/update.md",6891],b396445b:[()=>n.e(4082).then(n.bind(n,5286)),"@site/docs/development/alterations/overview.md",5286],b3bbf2ca:[()=>n.e(8190).then(n.bind(n,3036)),"@site/docs/development/building-a-chat-application.md",3036],b4dd6982:[()=>n.e(8732).then(n.bind(n,1744)),"@site/versioned_docs/version-1.x.x/api/config/update.md",1744],b5de05fe:[()=>n.e(803).then(n.bind(n,547)),"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",547],b8ab588d:[()=>n.e(5659).then(n.bind(n,5212)),"@site/versioned_docs/version-1.x.x/api/gateways/get.md",5212],bb373259:[()=>n.e(5804).then(n.bind(n,6501)),"@site/versioned_docs/version-1.x.x/introduction/comparison.md",6501],bc1a89ad:[()=>n.e(6346).then(n.bind(n,9866)),"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",9866],bc2f9ced:[()=>n.e(5365).then(n.bind(n,4734)),"@site/versioned_docs/version-1.x.x/api/peers/list.md",4734],bc843d59:[()=>n.e(3797).then(n.bind(n,142)),"@site/docs/development/components/registry.md",142],c2ef5137:[()=>n.e(9465).then(n.bind(n,6237)),"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",6237],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,192)),"@site/src/pages/index.js",192],c60c73ac:[()=>n.e(9537).then(n.bind(n,9175)),"@site/docs/development/components/requester.md",9175],d3c35fce:[()=>n.e(2607).then(n.bind(n,6652)),"@site/versioned_docs/version-1.x.x/api/domains/get.md",6652],d72ac48e:[()=>n.e(7063).then(n.bind(n,577)),"@site/docs/overview/architecture.md",577],d7a9d534:[()=>n.e(286).then(n.bind(n,5151)),"@site/docs/connect/introduction.md",5151],da51cc8f:[()=>n.e(9692).then(n.bind(n,3997)),"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",3997],db70960d:[()=>n.e(6549).then(n.bind(n,5214)),"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",5214],deaab6a5:[()=>n.e(6782).then(n.t.bind(n,1966,19)),"/home/runner/work/routr/routr/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],e10372bb:[()=>n.e(49).then(n.bind(n,123)),"@site/versioned_docs/version-1.x.x/introduction/community.md",123],ea5491a0:[()=>n.e(4011).then(n.bind(n,7163)),"@site/docs/connect/command-line/overview.md",7163],ec64d50d:[()=>n.e(9900).then(n.bind(n,3297)),"@site/versioned_docs/version-1.x.x/api/agents/get.md",3297],ed175a37:[()=>n.e(4236).then(n.bind(n,4995)),"@site/docs/connect/command-line/ctl.md",4995],ed519cbf:[()=>n.e(7638).then(n.bind(n,3271)),"@site/versioned_docs/version-1.x.x/api/numbers/get.md",3271],ee7973d9:[()=>n.e(2514).then(n.bind(n,2305)),"@site/versioned_docs/version-1.x.x/configuration/peers.md",2305],f1b4aa58:[()=>n.e(8755).then(n.bind(n,5835)),"@site/docs/connect/securing-the-server.md",5835],f3f39cc5:[()=>n.e(7387).then(n.bind(n,1850)),"@site/versioned_docs/version-1.x.x/introduction/media.md",1850],f4357d2a:[()=>n.e(6575).then(n.bind(n,696)),"@site/docs/connect/quick-start/docker.md",696],f5184ac4:[()=>n.e(6099).then(n.bind(n,7982)),"@site/docs/development/components/location.md",7982],ff3f7f2b:[()=>n.e(6903).then(n.bind(n,3532)),"@site/docs/development/development-mode-with-gitpod.md",3532]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/search",component:d("/search","9b7"),exact:!0},{path:"/docs",component:d("/docs","125"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","370"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","e79"),routes:[{path:"/docs/1.x.x/administration/cli/cheatsheet",component:d("/docs/1.x.x/administration/cli/cheatsheet","375"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/installation",component:d("/docs/1.x.x/administration/cli/installation","4dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/remote-access",component:d("/docs/1.x.x/administration/cli/remote-access","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/webconsole",component:d("/docs/1.x.x/administration/webconsole","62a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/create",component:d("/docs/1.x.x/api/agents/create","b97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/delete",component:d("/docs/1.x.x/api/agents/delete","b72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/get",component:d("/docs/1.x.x/api/agents/get","f9a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/list",component:d("/docs/1.x.x/api/agents/list","4c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/update",component:d("/docs/1.x.x/api/agents/update","b29"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/get",component:d("/docs/1.x.x/api/config/get","4bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/update",component:d("/docs/1.x.x/api/config/update","983"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/create",component:d("/docs/1.x.x/api/domains/create","815"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/delete",component:d("/docs/1.x.x/api/domains/delete","542"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/get",component:d("/docs/1.x.x/api/domains/get","c5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/list",component:d("/docs/1.x.x/api/domains/list","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/update",component:d("/docs/1.x.x/api/domains/update","633"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/create",component:d("/docs/1.x.x/api/gateways/create","404"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/delete",component:d("/docs/1.x.x/api/gateways/delete","de6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/get",component:d("/docs/1.x.x/api/gateways/get","d16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/list",component:d("/docs/1.x.x/api/gateways/list","5bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/update",component:d("/docs/1.x.x/api/gateways/update","8a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/create",component:d("/docs/1.x.x/api/location/create","ee5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/delete",component:d("/docs/1.x.x/api/location/delete","682"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/list",component:d("/docs/1.x.x/api/location/list","f64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/create",component:d("/docs/1.x.x/api/numbers/create","6ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/delete",component:d("/docs/1.x.x/api/numbers/delete","6a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/get",component:d("/docs/1.x.x/api/numbers/get","b9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/list",component:d("/docs/1.x.x/api/numbers/list","c63"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/update",component:d("/docs/1.x.x/api/numbers/update","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/overview",component:d("/docs/1.x.x/api/overview","d3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/create",component:d("/docs/1.x.x/api/peers/create","f5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/delete",component:d("/docs/1.x.x/api/peers/delete","349"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/get",component:d("/docs/1.x.x/api/peers/get","395"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/list",component:d("/docs/1.x.x/api/peers/list","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/update",component:d("/docs/1.x.x/api/peers/update","d81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/registry",component:d("/docs/1.x.x/api/registry","46f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/get",component:d("/docs/1.x.x/api/status/get","0e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/update",component:d("/docs/1.x.x/api/status/update","95d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/info",component:d("/docs/1.x.x/api/sys/info","bf8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/logs",component:d("/docs/1.x.x/api/sys/logs","847"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/token",component:d("/docs/1.x.x/api/token","069"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/concepts",component:d("/docs/1.x.x/concepts","b93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/agents",component:d("/docs/1.x.x/configuration/agents","4d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/domains",component:d("/docs/1.x.x/configuration/domains","4b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/gateways",component:d("/docs/1.x.x/configuration/gateways","cbd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/general",component:d("/docs/1.x.x/configuration/general","52e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/numbers",component:d("/docs/1.x.x/configuration/numbers","f3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/peers",component:d("/docs/1.x.x/configuration/peers","113"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/users",component:d("/docs/1.x.x/configuration/users","459"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/basic-setup",component:d("/docs/1.x.x/guides/basic-setup","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/routr-as-asterisk-frontend",component:d("/docs/1.x.x/guides/routr-as-asterisk-frontend","2a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-on-kubernetes",component:d("/docs/1.x.x/guides/running-on-kubernetes","7dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-with-docker-or-compose",component:d("/docs/1.x.x/guides/running-with-docker-or-compose","5c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/securing-the-signaling-path",component:d("/docs/1.x.x/guides/securing-the-signaling-path","99f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/community",component:d("/docs/1.x.x/introduction/community","060"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/comparison",component:d("/docs/1.x.x/introduction/comparison","595"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/faq",component:d("/docs/1.x.x/introduction/faq","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/glossary",component:d("/docs/1.x.x/introduction/glossary","85c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/installation",component:d("/docs/1.x.x/introduction/installation","1c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/media",component:d("/docs/1.x.x/introduction/media","f84"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/overview",component:d("/docs/1.x.x/introduction/overview","973"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/performance-tests/user-location",component:d("/docs/1.x.x/introduction/performance-tests/user-location","93b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/roadmap",component:d("/docs/1.x.x/introduction/roadmap","c45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/test-plan",component:d("/docs/1.x.x/introduction/test-plan","859"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/welcome",component:d("/docs/1.x.x/welcome","055"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/2.0.0",component:d("/docs/2.0.0","1e6"),routes:[{path:"/docs/2.0.0",component:d("/docs/2.0.0","45e"),routes:[{path:"/docs/2.0.0/changelog",component:d("/docs/2.0.0/changelog","abc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/community",component:d("/docs/2.0.0/community","943"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/ctl",component:d("/docs/2.0.0/connect/command-line/ctl","817"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/overview",component:d("/docs/2.0.0/connect/command-line/overview","928"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/concepts",component:d("/docs/2.0.0/connect/concepts","93c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/home-or-office-setup",component:d("/docs/2.0.0/connect/home-or-office-setup","28c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/introduction",component:d("/docs/2.0.0/connect/introduction","b89"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/overview",component:d("/docs/2.0.0/connect/nodesdk/overview","909"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/sdk",component:d("/docs/2.0.0/connect/nodesdk/sdk","d65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/docker",component:d("/docs/2.0.0/connect/quick-start/docker","8f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/kubernetes",component:d("/docs/2.0.0/connect/quick-start/kubernetes","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/securing-the-server",component:d("/docs/2.0.0/connect/securing-the-server","d31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/sending-call-events-to-nats",component:d("/docs/2.0.0/connect/sending-call-events-to-nats","f0a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/webrtc-support",component:d("/docs/2.0.0/connect/webrtc-support","dcc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/contributing",component:d("/docs/2.0.0/contributing","373"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/methods",component:d("/docs/2.0.0/development/alterations/methods","990"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/overview",component:d("/docs/2.0.0/development/alterations/overview","7a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-chat-application",component:d("/docs/2.0.0/development/building-a-chat-application","f4b"),exact:!0},{path:"/docs/2.0.0/development/building-a-middleware",component:d("/docs/2.0.0/development/building-a-middleware","ad6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-processor",component:d("/docs/2.0.0/development/building-a-processor","3aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-scaip-processor",component:d("/docs/2.0.0/development/building-a-scaip-processor","c5f"),exact:!0},{path:"/docs/2.0.0/development/components/apiserver",component:d("/docs/2.0.0/development/components/apiserver","3ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/dispatcher",component:d("/docs/2.0.0/development/components/dispatcher","49c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/edgeport",component:d("/docs/2.0.0/development/components/edgeport","a3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/location",component:d("/docs/2.0.0/development/components/location","ea7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/overview",component:d("/docs/2.0.0/development/components/overview","80e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/registry",component:d("/docs/2.0.0/development/components/registry","416"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/requester",component:d("/docs/2.0.0/development/components/requester","b17"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/rtprelay",component:d("/docs/2.0.0/development/components/rtprelay","816"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/simpleauth",component:d("/docs/2.0.0/development/components/simpleauth","141"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/custom-data-with-the-apiserver",component:d("/docs/2.0.0/development/custom-data-with-the-apiserver","9aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/development-mode-with-gitpod",component:d("/docs/2.0.0/development/development-mode-with-gitpod","503"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/extending-the-ctl",component:d("/docs/2.0.0/development/extending-the-ctl","aa9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/introduction",component:d("/docs/2.0.0/development/introduction","aca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/metrics-events-logs-and-traces",component:d("/docs/2.0.0/development/metrics-events-logs-and-traces","523"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-docker",component:d("/docs/2.0.0/development/orchestration-with-docker","05f"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-kubernetes",component:d("/docs/2.0.0/development/orchestration-with-kubernetes","694"),exact:!0},{path:"/docs/2.0.0/development/quick-start",component:d("/docs/2.0.0/development/quick-start","2f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/testing-with-seet",component:d("/docs/2.0.0/development/testing-with-seet","771"),exact:!0},{path:"/docs/2.0.0/faqs",component:d("/docs/2.0.0/faqs","72b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/architecture",component:d("/docs/2.0.0/overview/architecture","455"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/concepts",component:d("/docs/2.0.0/overview/concepts","482"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/deploy-with-docker",component:d("/docs/2.0.0/overview/deploy-with-docker","3ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/introduction",component:d("/docs/2.0.0/overview/introduction","8f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",component:d("/docs/2.0.0/tutorials/deploying-to-civo-with-helm","4df"),exact:!0},{path:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",component:d("/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser","502"),exact:!0},{path:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",component:d("/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes","450"),exact:!0},{path:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",component:d("/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr","b1f"),exact:!0}]}]}]},{path:"/",component:d("/","fcb"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(4625),i=n(545),s=n(8193);const l=[n(1911),n(119),n(6134),n(6294),n(1043)];var c=n(8328),u=n(6347),d=n(2831),p=n(4848);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5260),h=n(4586),g=n(6025),b=n(6342),v=n(9024),y=n(2131),x=n(4090),w=n(2967),k=n(440),S=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,y.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,u.zy)();return e+(0,k.applyTrailingSlash)((0,g.A)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.A,{tag:w.Cy,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.u)(c.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var j=n(6125),R=n(6988),L=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.qh,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${z}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${z}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function $(){const{siteConfig:{baseUrl:e}}=(0,h.A)();return(0,p.jsx)(p.Fragment,{children:!s.A.canUseDOM&&(0,p.jsx)(m.A,{children:(0,p.jsx)("script",{children:B(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,u.zy)();return t&&n===e?(0,p.jsx)($,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,h.A)(),a=(0,g.A)(e),{htmlLang:i,direction:s}=o[r];return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("html",{lang:i,dir:s}),(0,p.jsx)("title",{children:t}),(0,p.jsx)("meta",{property:"og:title",content:t}),(0,p.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,p.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,p.jsx)("link",{rel:"icon",href:a})]})}var H=n(7489),G=n(2303);function V(){const e=(0,G.A)();return(0,p.jsx)(m.A,{children:(0,p.jsx)("html",{"data-has-hydrated":e})})}function W(){const e=(0,d.v)(c.A),t=(0,u.zy)();return(0,p.jsx)(H.A,{children:(0,p.jsx)(R.l,{children:(0,p.jsxs)(j.x,{children:[(0,p.jsxs)(f,{children:[(0,p.jsx)(q,{}),(0,p.jsx)(C,{}),(0,p.jsx)(U,{}),(0,p.jsx)(I,{location:A(t),children:e})]}),(0,p.jsx)(V,{})]})})})}var K=n(4054);const Q=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Y=n(6921);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.vd,{children:(0,p.jsx)(a.Kd,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};O(window.location.pathname).then(s)}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-JX93S6PKN4"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"2.0.0","isLast":true,"path":"/docs/2.0.0","mainDocId":"overview/introduction","docs":[{"id":"changelog","path":"/docs/2.0.0/changelog","sidebar":"tutorialSidebar"},{"id":"community","path":"/docs/2.0.0/community","sidebar":"tutorialSidebar"},{"id":"connect/command-line/ctl","path":"/docs/2.0.0/connect/command-line/ctl","sidebar":"tutorialSidebar"},{"id":"connect/command-line/overview","path":"/docs/2.0.0/connect/command-line/overview","sidebar":"tutorialSidebar"},{"id":"connect/concepts","path":"/docs/2.0.0/connect/concepts","sidebar":"tutorialSidebar"},{"id":"connect/home-or-office-setup","path":"/docs/2.0.0/connect/home-or-office-setup","sidebar":"tutorialSidebar"},{"id":"connect/introduction","path":"/docs/2.0.0/connect/introduction","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/overview","path":"/docs/2.0.0/connect/nodesdk/overview","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/sdk","path":"/docs/2.0.0/connect/nodesdk/sdk","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/docker","path":"/docs/2.0.0/connect/quick-start/docker","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/kubernetes","path":"/docs/2.0.0/connect/quick-start/kubernetes","sidebar":"tutorialSidebar"},{"id":"connect/securing-the-server","path":"/docs/2.0.0/connect/securing-the-server","sidebar":"tutorialSidebar"},{"id":"connect/sending-call-events-to-nats","path":"/docs/2.0.0/connect/sending-call-events-to-nats","sidebar":"tutorialSidebar"},{"id":"connect/webrtc-support","path":"/docs/2.0.0/connect/webrtc-support","sidebar":"tutorialSidebar"},{"id":"contributing","path":"/docs/2.0.0/contributing","sidebar":"tutorialSidebar"},{"id":"development/alterations/methods","path":"/docs/2.0.0/development/alterations/methods","sidebar":"tutorialSidebar"},{"id":"development/alterations/overview","path":"/docs/2.0.0/development/alterations/overview","sidebar":"tutorialSidebar"},{"id":"development/building-a-chat-application","path":"/docs/2.0.0/development/building-a-chat-application"},{"id":"development/building-a-middleware","path":"/docs/2.0.0/development/building-a-middleware","sidebar":"tutorialSidebar"},{"id":"development/building-a-processor","path":"/docs/2.0.0/development/building-a-processor","sidebar":"tutorialSidebar"},{"id":"development/building-a-scaip-processor","path":"/docs/2.0.0/development/building-a-scaip-processor"},{"id":"development/components/apiserver","path":"/docs/2.0.0/development/components/apiserver","sidebar":"tutorialSidebar"},{"id":"development/components/dispatcher","path":"/docs/2.0.0/development/components/dispatcher","sidebar":"tutorialSidebar"},{"id":"development/components/edgeport","path":"/docs/2.0.0/development/components/edgeport","sidebar":"tutorialSidebar"},{"id":"development/components/location","path":"/docs/2.0.0/development/components/location","sidebar":"tutorialSidebar"},{"id":"development/components/overview","path":"/docs/2.0.0/development/components/overview","sidebar":"tutorialSidebar"},{"id":"development/components/registry","path":"/docs/2.0.0/development/components/registry","sidebar":"tutorialSidebar"},{"id":"development/components/requester","path":"/docs/2.0.0/development/components/requester","sidebar":"tutorialSidebar"},{"id":"development/components/rtprelay","path":"/docs/2.0.0/development/components/rtprelay","sidebar":"tutorialSidebar"},{"id":"development/components/simpleauth","path":"/docs/2.0.0/development/components/simpleauth","sidebar":"tutorialSidebar"},{"id":"development/custom-data-with-the-apiserver","path":"/docs/2.0.0/development/custom-data-with-the-apiserver","sidebar":"tutorialSidebar"},{"id":"development/development-mode-with-gitpod","path":"/docs/2.0.0/development/development-mode-with-gitpod","sidebar":"tutorialSidebar"},{"id":"development/extending-the-ctl","path":"/docs/2.0.0/development/extending-the-ctl","sidebar":"tutorialSidebar"},{"id":"development/introduction","path":"/docs/2.0.0/development/introduction","sidebar":"tutorialSidebar"},{"id":"development/metrics-events-logs-and-traces","path":"/docs/2.0.0/development/metrics-events-logs-and-traces"},{"id":"development/orchestration-with-docker","path":"/docs/2.0.0/development/orchestration-with-docker"},{"id":"development/orchestration-with-kubernetes","path":"/docs/2.0.0/development/orchestration-with-kubernetes"},{"id":"development/quick-start","path":"/docs/2.0.0/development/quick-start","sidebar":"tutorialSidebar"},{"id":"development/testing-with-seet","path":"/docs/2.0.0/development/testing-with-seet"},{"id":"faqs","path":"/docs/2.0.0/faqs","sidebar":"tutorialSidebar"},{"id":"overview/architecture","path":"/docs/2.0.0/overview/architecture","sidebar":"tutorialSidebar"},{"id":"overview/concepts","path":"/docs/2.0.0/overview/concepts","sidebar":"tutorialSidebar"},{"id":"overview/deploy-with-docker","path":"/docs/2.0.0/overview/deploy-with-docker","sidebar":"tutorialSidebar"},{"id":"overview/introduction","path":"/docs/2.0.0/overview/introduction","sidebar":"tutorialSidebar"},{"id":"tutorials/deploying-to-civo-with-helm","path":"/docs/2.0.0/tutorials/deploying-to-civo-with-helm"},{"id":"tutorials/ephemeral-agents-in-the-browser","path":"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser"},{"id":"tutorials/intercom-system-with-routr-and-kubernetes","path":"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes"},{"id":"tutorials/load-balancing-asterisk-with-routr","path":"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/2.0.0/overview/introduction","label":"overview/introduction"}}}},{"name":"1.x.x","label":"1.x.x","isLast":false,"path":"/docs/1.x.x","mainDocId":"welcome","docs":[{"id":"administration/cli/cheatsheet","path":"/docs/1.x.x/administration/cli/cheatsheet","sidebar":"tutorialSidebar"},{"id":"administration/cli/installation","path":"/docs/1.x.x/administration/cli/installation","sidebar":"tutorialSidebar"},{"id":"administration/cli/remote-access","path":"/docs/1.x.x/administration/cli/remote-access","sidebar":"tutorialSidebar"},{"id":"administration/webconsole","path":"/docs/1.x.x/administration/webconsole","sidebar":"tutorialSidebar"},{"id":"api/agents/create","path":"/docs/1.x.x/api/agents/create","sidebar":"tutorialSidebar"},{"id":"api/agents/delete","path":"/docs/1.x.x/api/agents/delete","sidebar":"tutorialSidebar"},{"id":"api/agents/get","path":"/docs/1.x.x/api/agents/get","sidebar":"tutorialSidebar"},{"id":"api/agents/list","path":"/docs/1.x.x/api/agents/list","sidebar":"tutorialSidebar"},{"id":"api/agents/update","path":"/docs/1.x.x/api/agents/update","sidebar":"tutorialSidebar"},{"id":"api/config/get","path":"/docs/1.x.x/api/config/get","sidebar":"tutorialSidebar"},{"id":"api/config/update","path":"/docs/1.x.x/api/config/update","sidebar":"tutorialSidebar"},{"id":"api/domains/create","path":"/docs/1.x.x/api/domains/create","sidebar":"tutorialSidebar"},{"id":"api/domains/delete","path":"/docs/1.x.x/api/domains/delete","sidebar":"tutorialSidebar"},{"id":"api/domains/get","path":"/docs/1.x.x/api/domains/get","sidebar":"tutorialSidebar"},{"id":"api/domains/list","path":"/docs/1.x.x/api/domains/list","sidebar":"tutorialSidebar"},{"id":"api/domains/update","path":"/docs/1.x.x/api/domains/update","sidebar":"tutorialSidebar"},{"id":"api/gateways/create","path":"/docs/1.x.x/api/gateways/create","sidebar":"tutorialSidebar"},{"id":"api/gateways/delete","path":"/docs/1.x.x/api/gateways/delete","sidebar":"tutorialSidebar"},{"id":"api/gateways/get","path":"/docs/1.x.x/api/gateways/get","sidebar":"tutorialSidebar"},{"id":"api/gateways/list","path":"/docs/1.x.x/api/gateways/list","sidebar":"tutorialSidebar"},{"id":"api/gateways/update","path":"/docs/1.x.x/api/gateways/update","sidebar":"tutorialSidebar"},{"id":"api/location/create","path":"/docs/1.x.x/api/location/create","sidebar":"tutorialSidebar"},{"id":"api/location/delete","path":"/docs/1.x.x/api/location/delete","sidebar":"tutorialSidebar"},{"id":"api/location/list","path":"/docs/1.x.x/api/location/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/create","path":"/docs/1.x.x/api/numbers/create","sidebar":"tutorialSidebar"},{"id":"api/numbers/delete","path":"/docs/1.x.x/api/numbers/delete","sidebar":"tutorialSidebar"},{"id":"api/numbers/get","path":"/docs/1.x.x/api/numbers/get","sidebar":"tutorialSidebar"},{"id":"api/numbers/list","path":"/docs/1.x.x/api/numbers/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/update","path":"/docs/1.x.x/api/numbers/update","sidebar":"tutorialSidebar"},{"id":"api/overview","path":"/docs/1.x.x/api/overview","sidebar":"tutorialSidebar"},{"id":"api/peers/create","path":"/docs/1.x.x/api/peers/create","sidebar":"tutorialSidebar"},{"id":"api/peers/delete","path":"/docs/1.x.x/api/peers/delete","sidebar":"tutorialSidebar"},{"id":"api/peers/get","path":"/docs/1.x.x/api/peers/get","sidebar":"tutorialSidebar"},{"id":"api/peers/list","path":"/docs/1.x.x/api/peers/list","sidebar":"tutorialSidebar"},{"id":"api/peers/update","path":"/docs/1.x.x/api/peers/update","sidebar":"tutorialSidebar"},{"id":"api/registry","path":"/docs/1.x.x/api/registry","sidebar":"tutorialSidebar"},{"id":"api/status/get","path":"/docs/1.x.x/api/status/get","sidebar":"tutorialSidebar"},{"id":"api/status/update","path":"/docs/1.x.x/api/status/update","sidebar":"tutorialSidebar"},{"id":"api/sys/info","path":"/docs/1.x.x/api/sys/info","sidebar":"tutorialSidebar"},{"id":"api/sys/logs","path":"/docs/1.x.x/api/sys/logs","sidebar":"tutorialSidebar"},{"id":"api/token","path":"/docs/1.x.x/api/token","sidebar":"tutorialSidebar"},{"id":"concepts","path":"/docs/1.x.x/concepts","sidebar":"tutorialSidebar"},{"id":"configuration/agents","path":"/docs/1.x.x/configuration/agents","sidebar":"tutorialSidebar"},{"id":"configuration/domains","path":"/docs/1.x.x/configuration/domains","sidebar":"tutorialSidebar"},{"id":"configuration/gateways","path":"/docs/1.x.x/configuration/gateways","sidebar":"tutorialSidebar"},{"id":"configuration/general","path":"/docs/1.x.x/configuration/general","sidebar":"tutorialSidebar"},{"id":"configuration/numbers","path":"/docs/1.x.x/configuration/numbers","sidebar":"tutorialSidebar"},{"id":"configuration/peers","path":"/docs/1.x.x/configuration/peers","sidebar":"tutorialSidebar"},{"id":"configuration/users","path":"/docs/1.x.x/configuration/users","sidebar":"tutorialSidebar"},{"id":"guides/basic-setup","path":"/docs/1.x.x/guides/basic-setup","sidebar":"tutorialSidebar"},{"id":"guides/routr-as-asterisk-frontend","path":"/docs/1.x.x/guides/routr-as-asterisk-frontend","sidebar":"tutorialSidebar"},{"id":"guides/running-on-kubernetes","path":"/docs/1.x.x/guides/running-on-kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/running-with-docker-or-compose","path":"/docs/1.x.x/guides/running-with-docker-or-compose","sidebar":"tutorialSidebar"},{"id":"guides/securing-the-signaling-path","path":"/docs/1.x.x/guides/securing-the-signaling-path","sidebar":"tutorialSidebar"},{"id":"introduction/community","path":"/docs/1.x.x/introduction/community","sidebar":"tutorialSidebar"},{"id":"introduction/comparison","path":"/docs/1.x.x/introduction/comparison","sidebar":"tutorialSidebar"},{"id":"introduction/faq","path":"/docs/1.x.x/introduction/faq","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/docs/1.x.x/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/installation","path":"/docs/1.x.x/introduction/installation","sidebar":"tutorialSidebar"},{"id":"introduction/media","path":"/docs/1.x.x/introduction/media","sidebar":"tutorialSidebar"},{"id":"introduction/overview","path":"/docs/1.x.x/introduction/overview","sidebar":"tutorialSidebar"},{"id":"introduction/performance-tests/user-location","path":"/docs/1.x.x/introduction/performance-tests/user-location","sidebar":"tutorialSidebar"},{"id":"introduction/roadmap","path":"/docs/1.x.x/introduction/roadmap","sidebar":"tutorialSidebar"},{"id":"introduction/test-plan","path":"/docs/1.x.x/introduction/test-plan","sidebar":"tutorialSidebar"},{"id":"welcome","path":"/docs/1.x.x/welcome","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/1.x.x/welcome","label":"welcome"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.1.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.1.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.1.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.1.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.1.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.1.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.1.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.1.1"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.1.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(9201),l=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(a.A,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.A,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,i.A)(),{withBaseUrl:w}=(0,u.h)(),k=(0,c.A)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.A)(_),C=_?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;T&&E&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:x}));const j=(0,r.useRef)(!1),R=n?o.k2:o.N_,L=l.A.canUseIntersectionObserver,N=(0,r.useRef)(),P=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!L&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&N.current&&N.current.disconnect()})),[N,T,L,E]);const O=T?.startsWith("#")??!1,D=!v.target||"_self"===v.target,I=!T||!E||!D||O;return g||!O&&I||k.collectLink(T),v.id&&k.collectAnchor(v.id),I?(0,d.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...v}):(0,d.jsx)(R,{...v,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,L&&e&&E&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,h:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.A)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.z)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>f,gk:()=>m,Gy:()=>d,HW:()=>v,ht:()=>p,r7:()=>g,jh:()=>h});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},1911:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(8181),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},9201:(e,t,n)=>{"use strict";n.d(t,{A:()=>Nt});var r=n(6540),o=n(8215),a=n(7489),i=n(9024),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const v={skipToContent:"skipToContent_fXgn"};function y(){return(0,u.jsx)(h,{className:v.skipToContent})}var x=n(6342),w=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.Mj)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var j=n(2069),R=n(3104);var L=n(9532),N=n(5600);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,N.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,L.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(P);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(3465);function K(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.A)(r),p=(0,X.A)(t),f=(0,X.A)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(He,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(He,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(961);function ve(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(9188),xe=["translations"];function we(){return we=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},we.apply(this,arguments)}function ke(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(l){s=!0,o=l}finally{try{i||null==n.return||n.return()}finally{if(s)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Se(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Se(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _e(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ee="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=_e(e,xe),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=ke((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Ee))}),[]),r.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ye.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ee?r.createElement(ve,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Te=n(5260),Ae=n(4255),je=n(1062),Re=n(2967);const Le={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Pe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Oe(e){let{state:t,onClose:n}=e;const r=(0,Ae.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function De(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.A)(),l=(0,je.C)(),c=function(){const{locale:e,tags:t}=(0,Re.af)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,x]=(0,r.useState)(void 0),w=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(9462).then(n.bind(n,9462)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),k=(0,r.useCallback)((()=>{w().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),v(!0)}))}),[w,v]),S=(0,r.useCallback)((()=>{v(!1),h.current?.remove()}),[v]),_=(0,r.useCallback)((e=>{w().then((()=>{v(!0),x(e.key)}))}),[w,v,x]),E=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(o,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Oe,{...e,onClose:S})),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:b,onOpen:k,onClose:S,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Te.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:w,onFocus:w,onMouseOver:w,onClick:k,ref:g,translations:Le.button}),b&&Ne&&h.current&&(0,be.createPortal)((0,u.jsx)(Ne,{onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:E,transformItems:C,hitComponent:Pe,transformSearchClient:A,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:f,placeholder:Le.placeholder,translations:Le.modal}),h.current)]})}function Ie(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(De,{...e.themeConfig.algolia})}const Me={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Fe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Me.navbarSearchContainer),children:t})}var ze=n(4070),Be=n(1754);var $e=n(5597);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const qe={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Fe,{className:n,children:(0,u.jsx)(Ie,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ze.zK)(r),i=(0,Be.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ze.zK)(r),i=(0,Be.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Be.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,ze.zK)(n),f=(0,ze.jh)(n),{savePreferredVersionName:m}=(0,$e.g1)(n),h=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,Be.Vd)(n)[0],b=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,v=t&&h.length>1?void 0:Ue(g).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:v,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:v,items:h,isActive:r?()=>!1:void 0})}};function He(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=qe[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ge(){const e=(0,j.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(He,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ve(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function We(){const e=0===(0,x.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ve,{onClick:()=>t.hide()}),t.content]})}function Ke(){const e=(0,j.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ge,{}),secondaryMenu:(0,u.jsx)(We,{})}):null}const Qe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ze(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,j.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,R.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Qe.navbarHideable,!d&&Qe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ye,{onClick:i.toggle}),(0,u.jsx)(Ke,{})]})}var Xe=n(440);const Je={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function et(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function tt(e){let{error:t}=e;const n=(0,Xe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Je.errorBoundaryError,children:n})}class nt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function ot(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function at(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ot,{})})}const it={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(nt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(He,{...e})},t)))})}function lt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ct(){const e=(0,j.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(lt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(at,{}),(0,u.jsx)(K,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(V,{className:it.colorModeToggle}),!o&&(0,u.jsx)(Fe,{children:(0,u.jsx)(Ie,{})})]})})}function ut(){return(0,u.jsx)(Ze,{children:(0,u.jsx)(ct,{})})}function dt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.A)(n),l=(0,X.A)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function pt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(dt,{item:t})},t.href??t.to)}function ft(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(pt,{item:e},t)))})]})}function mt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ft,{column:e},t)))})}function ht(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function gt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(dt,{item:t})}function bt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(gt,{item:e}),t.length!==n+1&&(0,u.jsx)(ht,{})]},n)))})})}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(mt,{columns:t}):(0,u.jsx)(bt,{links:t})}var yt=n(1122);const xt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.h)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(yt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:xt.footerLogoLink,target:t.target,children:(0,u.jsx)(wt,{logo:t})}):(0,u.jsx)(wt,{logo:t})}function St(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Et(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(_t,{style:o,links:n&&n.length>0&&(0,u.jsx)(vt,{links:n}),logo:r&&(0,u.jsx)(kt,{logo:r}),copyright:t&&(0,u.jsx)(St,{copyright:t})})}const Ct=r.memo(Et),Tt=(0,L.fM)([F.a,w.oq,R.Tv,$e.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(O,{children:t})})})}]);function At(e){let{children:t}=e;return(0,u.jsx)(Tt,{children:t})}var jt=n(1107);function Rt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(jt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(et,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(tt,{error:t})})]})})})}const Lt={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(At,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(y,{}),(0,u.jsx)(A,{}),(0,u.jsx)(ut,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,Lt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Rt,{...e}),children:t})}),!n&&(0,u.jsx)(Ct,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.A)(t.src),dark:(0,o.A)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.A)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>h,oq:()=>m});var r=n(6540),o=n(2303),a=n(9466),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(9466),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,XK:()=>x,g1:()=>y});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(1754),l=n(9532),c=n(9466),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function v(){const e=(0,r.useContext)(m);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=v(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function x(){const e=(0,o.Gy)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>s,w:()=>l});var r=n(6540),o=n(4586),a=n(7485);const i="q";function s(){return(0,a.l)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>_,Vd:()=>w,QB:()=>S,fW:()=>k,OF:()=>x,Y:()=>v});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(5597),l=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.v)(i),sidebarName:c,sidebarItems:u}}},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(4586);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,l:()=>l});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,o.W6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},9024:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>m});var r=n(6540),o=n(5066),a=n(5260),i=n(3102);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),c=n(481),u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.s)(t),{withBaseUrl:d}=(0,l.h)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.A,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,o.A)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(6540),o=n(8193),a=n(2303),i=(n(205),n(9532)),s=n(4848);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>i,af:()=>l,tU:()=>s});var r=n(4070),o=n(4586),a=n(5597);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,o.A)(),t=(0,r.Gy)(),n=(0,r.gk)(),l=(0,a.XK)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},9466:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>l});n(6540);const r="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(4586);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>s});var r=n(6540),o=n(1252),a=n(6025),i=n(8126);function s(){const{withBaseUrl:e}=(0,a.h)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>A,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),h||(0,s.A)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,x=void 0!==c&&c,w=i.getUserConfirmation,k=void 0===w?g:w,S=i.keyLength,_=void 0===S?6:S,E=e.basename?d(l(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return E&&(a=u(a,E)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,_)}var A=m();function j(e){(0,r.A)($,e),$.length=n.length,A.notifyListeners($.location,$.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(C(e.state))}function L(){P(C(y()))}var N=!1;function P(e){if(N)N=!1,j();else{A.confirmTransitionTo(e,"POP",k,(function(t){t?j({action:"POP",location:e}):function(e){var t=$.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(N=!0,M(o))}(e)}))}}var O=C(y()),D=[O.key];function I(e){return E+p(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,R),a&&window.addEventListener(v,L)):0===F&&(window.removeEventListener(b,R),a&&window.removeEventListener(v,L))}var B=!1;var $={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",a=f(e,t,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),x)window.location.href=t;else{var l=D.indexOf($.location.key),c=D.slice(0,l+1);c.push(a.key),D=c,j({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),x)window.location.replace(t);else{var l=D.indexOf($.location.key);-1!==l&&(D[l]=a.key),j({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=A.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:l},slash:{encodePath:l,decodePath:l}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function E(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,s.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?g:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(l(e.basename)):"",v=k[c],y=v.encodePath,x=v.decodePath;function C(){var e=x(_());return b&&(e=u(e,b)),f(e)}var T=m();function A(e){(0,r.A)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var j=!1,R=null;function L(){var e,t,n=_(),r=y(n);if(n!==r)E(r);else{var o=C(),i=B.location;if(!j&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===p(o))return;R=null,function(e){if(j)j=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?A({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var r=D.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(j=!0,I(o))}(e)}))}}(o)}}var N=_(),P=y(N);N!==P&&E(P);var O=C(),D=[p(O)];function I(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(w,L):0===M&&window.removeEventListener(w,L)}var z=!1;var B={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(_()!==o){R=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(p(B.location)),i=D.slice(0,a+1);i.push(t),D=i,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);_()!==o&&(R=t,E(o));var a=D.indexOf(p(B.location));-1!==a&&(D[a]=t),A({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=m();function d(e){(0,r.A)(x,e),x.length=x.entries.length,u.notifyListeners(x.location,x.action)}function h(){return Math.random().toString(36).substr(2,c)}var g=T(s,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?h():e.key||h())})),v=p;function y(e){var t=T(x.index+e,0,x.entries.length-1),r=x.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var x={length:b.length,action:"POP",location:b[g],index:g,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=x.index+1,n=x.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=x.index+e;return t>=0&&t<x.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return x}},4146:(e,t,n)=>{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g<i.length;++g){var b=i[g];if(!(a[b]||r&&r[b]||h&&h[b]||s&&s[b])){var v=p(n,b);try{c(t,b,v)}catch(y){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,_=n[2]||u,E=b||v;r.push({name:g||a++,prefix:h||"",delimiter:_,optional:S,repeat:k,partial:w,asterisk:!!x,pattern:E?c(E):x?".*":"[^"+l(_)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=s[u.name];if(null==p){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(p)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=l(p[f]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var p=l(c.prefix),f="(?:"+c.pattern+")";t.push(c),c.repeat&&(f+="(?:"+p+f+")*"),i+=f=c.optional?c.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var m=l(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function f(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(f(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;o(m);){for(var h in p={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var x={getIds:function(){var e=[];return x.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return x}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f={},m={};function h(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function v(e){return e[1].toUpperCase()}function y(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(m,e)||!d.call(f,e)&&(p.test(e)?m[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var x=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),k=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),T=Symbol.for("react.context"),A=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),R=Symbol.for("react.suspense_list"),L=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var P=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var I,M=Object.assign;function F(e){if(void 0===I)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);I=t&&t[1]||""}return"\n"+I+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function $(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function U(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case k:return"Portal";case E:return"Profiler";case _:return"StrictMode";case j:return"Suspense";case R:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case A:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case L:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case N:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===_?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function V(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&y(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function se(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ve(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ye(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var xe=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,Se=null,_e=null;function Ee(e){if(e=xo(e)){if("function"!=typeof ke)throw Error(a(280));var t=e.stateNode;t&&(t=ko(t),ke(e.stateNode,e.type,t))}}function Ce(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Te(){if(Se){var e=Se,t=_e;if(_e=Se=null,Ee(e),t)for(e=0;e<t.length;e++)Ee(t[e])}}function Ae(e,t){return e(t)}function je(){}var Re=!1;function Le(e,t,n){if(Re)return e(t,n);Re=!0;try{return Ae(e,t,n)}finally{Re=!1,(null!==Se||null!==_e)&&(je(),Te())}}function Ne(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Pe=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Pe=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Pe=!1}function De(e,t,n,r,o,a,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Ie=!0,Me=e}};function $e(e,t,n,r,o,a,i,s,l){Ie=!1,Me=null,De.apply(Be,arguments)}function Ue(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(Ue(e)!==e)throw Error(a(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ve(e):null}function Ve(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ve(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Ke=o.unstable_cancelCallback,Qe=o.unstable_shouldYield,Ye=o.unstable_requestPaint,Ze=o.unstable_now,Xe=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&0!=(4194240&a)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function ft(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function vt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var yt=0;function xt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var wt,kt,St,_t,Et,Ct=!1,Tt=[],At=null,jt=null,Rt=null,Lt=new Map,Nt=new Map,Pt=[],Ot="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":At=null;break;case"dragenter":case"dragleave":jt=null;break;case"mouseover":case"mouseout":Rt=null;break;case"pointerover":case"pointerout":Lt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Nt.delete(t.pointerId)}}function It(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=xo(t))&&kt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=yo(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void Et(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=xo(n))&&kt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);xe=r,n.target.dispatchEvent(r),xe=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==At&&Ft(At)&&(At=null),null!==jt&&Ft(jt)&&(jt=null),null!==Rt&&Ft(Rt)&&(Rt=null),Lt.forEach(zt),Nt.forEach(zt)}function $t(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function Ut(e){function t(t){return $t(t,e)}if(0<Tt.length){$t(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==At&&$t(At,e),null!==jt&&$t(jt,e),null!==Rt&&$t(Rt,e),Lt.forEach(t),Nt.forEach(t),n=0;n<Pt.length;n++)(r=Pt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Pt.length&&null===(n=Pt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Pt.shift()}var qt=x.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=1,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Vt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=4,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Qt(e,t,n,r);if(null===o)Hr(e,t,r,Kt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return At=It(At,e,t,n,r,o),!0;case"dragenter":return jt=It(jt,e,t,n,r,o),!0;case"mouseover":return Rt=It(Rt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Lt.set(a,It(Lt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Nt.set(a,It(Nt.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==o;){var a=xo(o);if(null!==a&&wt(a),null===(a=Qt(e,t,n,r))&&Hr(e,t,r,Kt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Kt=null;function Qt(e,t,n,r){if(Kt=null,null!==(e=yo(e=we(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Kt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,o="value"in Zt?Zt.value:Zt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,sn,ln,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),pn=on(dn),fn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:En,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=on(fn),hn=on(M({},fn,{dataTransfer:0})),gn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),vn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),yn=on(vn),xn=on(M({},cn,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _n(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function En(){return _n}var Cn=M({},dn,{key:function(e){if(e.key){var t=wn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?kn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:En,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Tn=on(Cn),An=on(M({},fn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),jn=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:En})),Rn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=M({},fn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Nn=on(Ln),Pn=[9,13,27,32],On=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var In=u&&"TextEvent"in window&&!Dn,Mn=u&&(!On||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Pn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Gn(e,t,n,r){Ce(r),0<(t=Vr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Vn=null,Wn=null;function Kn(e){Fr(e,0)}function Qn(e){if(W(wo(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Vn&&(Vn.detachEvent("onpropertychange",nr),Wn=Vn=null)}function nr(e){if("value"===e.propertyName&&Qn(Wn)){var t=[];Gn(t,Wn,e,we(e)),Le(Kn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Vn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Wn)}function ar(e,t){if("click"===e)return Qn(t)}function ir(e,t){if("input"===e||"change"===e)return Qn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!sr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,br=null,vr=null,yr=!1;function xr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;yr||null==gr||gr!==K(r)||("selectionStart"in(r=gr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},vr&&lr(vr,r)||(vr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},Sr={},_r={};function Er(e){if(Sr[e])return Sr[e];if(!kr[e])return e;var t,n=kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in _r)return Sr[e]=n[t];return e}u&&(_r=document.createElement("div").style,"AnimationEvent"in window||(delete kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var Cr=Er("animationend"),Tr=Er("animationiteration"),Ar=Er("animationstart"),jr=Er("transitionend"),Rr=new Map,Lr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Nr(e,t){Rr.set(e,t),l(t,[e])}for(var Pr=0;Pr<Lr.length;Pr++){var Or=Lr[Pr];Nr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Nr(Cr,"onAnimationEnd"),Nr(Tr,"onAnimationIteration"),Nr(Ar,"onAnimationStart"),Nr("dblclick","onDoubleClick"),Nr("focusin","onFocus"),Nr("focusout","onBlur"),Nr(jr,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ir=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,s,l,c){if($e.apply(this,arguments),Ie){if(!Ie)throw Error(a(198));var u=Me;Ie=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var $r="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[$r]){e[$r]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[$r]||(t[$r]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Yt(t)){case 1:var o=Gt;break;case 4:o=Vt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Pe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=yo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Le((function(){var r=a,o=we(n),i=[];e:{var s=Rr.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":c="focus",l=gn;break;case"focusout":c="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=jn;break;case Cr:case Tr:case Ar:l=bn;break;case jr:l=Rn;break;case"scroll":l=pn;break;case"wheel":l=Nn;break;case"copy":case"cut":case"paste":l=yn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=An}var u=0!=(4&t),d=!u&&"scroll"===e,p=u?null!==s?s+"Capture":null:s;u=[];for(var f,m=r;null!==m;){var h=(f=m).stateNode;if(5===f.tag&&null!==h&&(f=h,null!==p&&(null!=(h=Ne(m,p))&&u.push(Gr(m,h,f)))),d)break;m=m.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===xe||!(c=n.relatedTarget||n.fromElement)||!yo(c)&&!c[ho])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?yo(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=mn,h="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=An,h="onPointerLeave",p="onPointerEnter",m="pointer"),d=null==l?s:wo(l),f=null==c?s:wo(c),(s=new u(h,m+"leave",l,n,o)).target=d,s.relatedTarget=f,h=null,yo(o)===r&&((u=new u(p,m+"enter",c,n,o)).target=f,u.relatedTarget=d,h=u),d=h,l&&c)e:{for(p=c,m=0,f=u=l;f;f=Wr(f))m++;for(f=0,h=p;h;h=Wr(h))f++;for(;0<m-f;)u=Wr(u),m--;for(;0<f-m;)p=Wr(p),f--;for(;m--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==l&&Kr(i,s,l,u,!1),null!==c&&null!==d&&Kr(i,d,c,u,!0)}if("select"===(l=(s=r?wo(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var g=Yn;else if(Hn(s))if(Zn)g=ir;else{g=or;var b=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(g=ar);switch(g&&(g=g(e,r))?Gn(i,g,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&ee(s,"number",s.value)),b=r?wo(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(gr=b,br=r,vr=null);break;case"focusout":vr=br=gr=null;break;case"mousedown":yr=!0;break;case"contextmenu":case"mouseup":case"dragend":yr=!1,xr(i,n,o);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":xr(i,n,o)}var v;if(On)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Un?Bn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Mn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=en()):(Xt="value"in(Zt=o)?Zt.value:Zt.textContent,Un=!0)),0<(b=Vr(r,y)).length&&(y=new xn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=$n(n))&&(y.data=v))),(v=In?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!On&&Bn(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Vr(r,"onBeforeInput")).length&&(o=new xn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}Fr(i,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Vr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Ne(e,n))&&r.unshift(Gr(e,a,o)),null!=(a=Ne(e,t))&&r.push(Gr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Kr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Ne(n,a))&&i.unshift(Gr(n,l,s)):o||null!=(l=Ne(n,a))&&i.push(Gr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Qr,"\n").replace(Yr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(a(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);Ut(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var po=Math.random().toString(36).slice(2),fo="__reactFiber$"+po,mo="__reactProps$"+po,ho="__reactContainer$"+po,go="__reactEvents$"+po,bo="__reactListeners$"+po,vo="__reactHandles$"+po;function yo(e){var t=e[fo];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||n[fo]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[fo])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function xo(e){return!(e=e[fo]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function ko(e){return e[mo]||null}var So=[],_o=-1;function Eo(e){return{current:e}}function Co(e){0>_o||(e.current=So[_o],So[_o]=null,_o--)}function To(e,t){_o++,So[_o]=e.current,e.current=t}var Ao={},jo=Eo(Ao),Ro=Eo(!1),Lo=Ao;function No(e,t){var n=e.type.contextTypes;if(!n)return Ao;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Po(e){return null!=(e=e.childContextTypes)}function Oo(){Co(Ro),Co(jo)}function Do(e,t,n){if(jo.current!==Ao)throw Error(a(168));To(jo,t),To(Ro,n)}function Io(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,q(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ao,Lo=jo.current,To(jo,e),To(Ro,Ro.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Io(e,t,Lo),r.__reactInternalMemoizedMergedChildContext=e,Co(Ro),Co(jo),To(jo,e)):Co(Ro),To(Ro,n)}var zo=null,Bo=!1,$o=!1;function Uo(e){null===zo?zo=[e]:zo.push(e)}function qo(){if(!$o&&null!==zo){$o=!0;var e=0,t=yt;try{var n=zo;for(yt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Je,qo),o}finally{yt=t,$o=!1}}return null}var Ho=[],Go=0,Vo=null,Wo=0,Ko=[],Qo=0,Yo=null,Zo=1,Xo="";function Jo(e,t){Ho[Go++]=Wo,Ho[Go++]=Vo,Vo=e,Wo=t}function ea(e,t,n){Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=Yo,Yo=e;var r=Zo;e=Xo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Zo=1<<32-it(t)+o|n<<o|r,Xo=a+e}else Zo=1<<a|n<<o|r,Xo=e}function ta(e){null!==e.return&&(Jo(e,1),ea(e,1,0))}function na(e){for(;e===Vo;)Vo=Ho[--Go],Ho[Go]=null,Wo=Ho[--Go],Ho[Go]=null;for(;e===Yo;)Yo=Ko[--Qo],Ko[Qo]=null,Xo=Ko[--Qo],Ko[Qo]=null,Zo=Ko[--Qo],Ko[Qo]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(e,t){var n=Nc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function la(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Yo?{id:Zo,overflow:Xo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Nc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function pa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw fa(),Error(a(418));for(;t;)sa(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function fa(){for(var e=oa;e;)e=co(e.nextSibling)}function ma(){oa=ra=null,aa=!1}function ha(e){null===ia?ia=[e]:ia.push(e)}var ga=x.ReactCurrentBatchConfig;function ba(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var va=Eo(null),ya=null,xa=null,wa=null;function ka(){wa=xa=ya=null}function Sa(e){var t=va.current;Co(va),e._currentValue=t}function _a(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ea(e,t){ya=e,wa=xa=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(xs=!0),e.firstContext=null)}function Ca(e){var t=e._currentValue;if(wa!==e)if(e={context:e,memoizedValue:t,next:null},null===xa){if(null===ya)throw Error(a(308));xa=e,ya.dependencies={lanes:0,firstContext:e}}else xa=xa.next=e;return t}var Ta=null;function Aa(e){null===Ta?Ta=[e]:Ta.push(e)}function ja(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Aa(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ra(e,r)}function Ra(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var La=!1;function Na(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Oa(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Da(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&jl)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ra(e,n)}return null===(o=r.interleaved)?(t.next=t,Aa(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ra(e,n)}function Ia(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}function Ma(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Fa(e,t,n,r){var o=e.updateQueue;La=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var p=s.lane,f=s.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,h=s;switch(p=t,f=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(f,d,p);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(p="function"==typeof(m=h.payload)?m.call(f,d,p):m))break e;d=M({},d,p);break e;case 2:La=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[s]:p.push(s))}else f={eventTime:f,lane:p,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=f,l=d):u=u.next=f,i|=p;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(p=s).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Ml|=i,e.lanes=i,e.memoizedState=d}}function za(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Ba=(new r.Component).refs;function $a(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var Ua={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Oa(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Da(e,a,o))&&(rc(t,e,o,r),Ia(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tc(),r=nc(e),o=Oa(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Da(e,o,r))&&(rc(t,e,r,n),Ia(t,e,r))}};function qa(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function Ha(e,t,n){var r=!1,o=Ao,a=t.contextType;return"object"==typeof a&&null!==a?a=Ca(a):(o=Po(t)?Lo:jo.current,a=(r=null!=(r=t.contextTypes))?No(e,o):Ao),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Ua,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function Ga(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&Ua.enqueueReplaceState(t,t.state,null)}function Va(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Ba,Na(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Ca(a):(a=Po(t)?Lo:jo.current,o.context=No(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&($a(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&Ua.enqueueReplaceState(o,o.state,null),Fa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function Wa(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;t===Ba&&(t=o.refs={}),null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function Ka(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Qa(e){return(0,e._init)(e._payload)}function Ya(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Oc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===N&&Qa(a)===t.type)?((r=o(t,n.props)).ref=Wa(e,t,n),r.return=e,r):((r=Dc(n.type,n.key,n.props,null,e.mode,r)).ref=Wa(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Ic(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Fc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Dc(t.type,t.key,t.props,null,e.mode,n)).ref=Wa(e,null,t),n.return=e,n;case k:return(t=zc(t,e.mode,n)).return=e,t;case N:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Ic(t,e.mode,n,null)).return=e,t;Ka(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===o?c(e,t,n,r):null;case k:return n.key===o?u(e,t,n,r):null;case N:return f(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);Ka(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case w:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case k:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case N:return m(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);Ka(t,r)}return null}function h(o,a,s,l){for(var c=null,u=null,d=a,h=a=0,g=null;null!==d&&h<s.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=f(o,d,s[h],l);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,h),null===u?c=b:u.sibling=b,u=b,d=g}if(h===s.length)return n(o,d),aa&&Jo(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=p(o,s[h],l))&&(a=i(d,a,h),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,h),c}for(d=r(o,d);h<s.length;h++)null!==(g=m(d,o,h,s[h],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),a=i(g,a,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),c}function g(o,s,l,c){var u=D(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,h=s,g=s=0,b=null,v=l.next();null!==h&&!v.done;g++,v=l.next()){h.index>g?(b=h,h=null):b=h.sibling;var y=f(o,h,v.value,c);if(null===y){null===h&&(h=b);break}e&&h&&null===y.alternate&&t(o,h),s=i(y,s,g),null===d?u=y:d.sibling=y,d=y,h=b}if(v.done)return n(o,h),aa&&Jo(o,g),u;if(null===h){for(;!v.done;g++,v=l.next())null!==(v=p(o,v.value,c))&&(s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return aa&&Jo(o,g),u}for(h=r(o,h);!v.done;g++,v=l.next())null!==(v=m(h,o,g,v.value,c))&&(e&&null!==v.alternate&&h.delete(null===v.key?g:v.key),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return e&&h.forEach((function(e){return t(o,e)})),aa&&Jo(o,g),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case w:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===N&&Qa(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=Wa(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Ic(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Dc(i.type,i.key,i.props,null,r.mode,l)).ref=Wa(r,a,i),l.return=r,r=l)}return s(r);case k:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=zc(i,r.mode,l)).return=r,r=a}return s(r);case N:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return h(r,a,i,l);if(D(i))return g(r,a,i,l);Ka(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Fc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Za=Ya(!0),Xa=Ya(!1),Ja={},ei=Eo(Ja),ti=Eo(Ja),ni=Eo(Ja);function ri(e){if(e===Ja)throw Error(a(174));return e}function oi(e,t){switch(To(ni,t),To(ti,e),To(ei,Ja),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Co(ei),To(ei,t)}function ai(){Co(ei),Co(ti),Co(ni)}function ii(e){ri(ni.current);var t=ri(ei.current),n=le(t,e.type);t!==n&&(To(ti,e),To(ei,n))}function si(e){ti.current===e&&(Co(ei),Co(ti))}var li=Eo(0);function ci(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ui=[];function di(){for(var e=0;e<ui.length;e++)ui[e]._workInProgressVersionPrimary=null;ui.length=0}var pi=x.ReactCurrentDispatcher,fi=x.ReactCurrentBatchConfig,mi=0,hi=null,gi=null,bi=null,vi=!1,yi=!1,xi=0,wi=0;function ki(){throw Error(a(321))}function Si(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function _i(e,t,n,r,o,i){if(mi=i,hi=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,pi.current=null===e||null===e.memoizedState?ss:ls,e=n(r,o),yi){i=0;do{if(yi=!1,xi=0,25<=i)throw Error(a(301));i+=1,bi=gi=null,t.updateQueue=null,pi.current=cs,e=n(r,o)}while(yi)}if(pi.current=is,t=null!==gi&&null!==gi.next,mi=0,bi=gi=hi=null,vi=!1,t)throw Error(a(300));return e}function Ei(){var e=0!==xi;return xi=0,e}function Ci(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===bi?hi.memoizedState=bi=e:bi=bi.next=e,bi}function Ti(){if(null===gi){var e=hi.alternate;e=null!==e?e.memoizedState:null}else e=gi.next;var t=null===bi?hi.memoizedState:bi.next;if(null!==t)bi=t,gi=e;else{if(null===e)throw Error(a(310));e={memoizedState:(gi=e).memoizedState,baseState:gi.baseState,baseQueue:gi.baseQueue,queue:gi.queue,next:null},null===bi?hi.memoizedState=bi=e:bi=bi.next=e}return bi}function Ai(e,t){return"function"==typeof t?t(e):t}function ji(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=gi,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((mi&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var p={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(l=c=p,s=r):c=c.next=p,hi.lanes|=d,Ml|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(xs=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,hi.lanes|=i,Ml|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ri(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(xs=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Li(){}function Ni(e,t){var n=hi,r=Ti(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,xs=!0),r=r.queue,Hi(Di.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==bi&&1&bi.memoizedState.tag){if(n.flags|=2048,zi(9,Oi.bind(null,n,r,o,t),void 0,null),null===Rl)throw Error(a(349));0!=(30&mi)||Pi(n,t,o)}return o}function Pi(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=hi.updateQueue)?(t={lastEffect:null,stores:null},hi.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Oi(e,t,n,r){t.value=n,t.getSnapshot=r,Ii(t)&&Mi(e)}function Di(e,t,n){return n((function(){Ii(t)&&Mi(e)}))}function Ii(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function Mi(e){var t=Ra(e,1);null!==t&&rc(t,e,1,-1)}function Fi(e){var t=Ci();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Ai,lastRenderedState:e},t.queue=e,e=e.dispatch=ns.bind(null,hi,e),[t.memoizedState,e]}function zi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=hi.updateQueue)?(t={lastEffect:null,stores:null},hi.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Bi(){return Ti().memoizedState}function $i(e,t,n,r){var o=Ci();hi.flags|=e,o.memoizedState=zi(1|t,n,void 0,void 0===r?null:r)}function Ui(e,t,n,r){var o=Ti();r=void 0===r?null:r;var a=void 0;if(null!==gi){var i=gi.memoizedState;if(a=i.destroy,null!==r&&Si(r,i.deps))return void(o.memoizedState=zi(t,n,a,r))}hi.flags|=e,o.memoizedState=zi(1|t,n,a,r)}function qi(e,t){return $i(8390656,8,e,t)}function Hi(e,t){return Ui(2048,8,e,t)}function Gi(e,t){return Ui(4,2,e,t)}function Vi(e,t){return Ui(4,4,e,t)}function Wi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Ki(e,t,n){return n=null!=n?n.concat([e]):null,Ui(4,4,Wi.bind(null,t,e),n)}function Qi(){}function Yi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Zi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Xi(e,t,n){return 0==(21&mi)?(e.baseState&&(e.baseState=!1,xs=!0),e.memoizedState=n):(sr(n,t)||(n=ht(),hi.lanes|=n,Ml|=n,e.baseState=!0),t)}function Ji(e,t){var n=yt;yt=0!==n&&4>n?n:4,e(!0);var r=fi.transition;fi.transition={};try{e(!1),t()}finally{yt=n,fi.transition=r}}function es(){return Ti().memoizedState}function ts(e,t,n){var r=nc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rs(e))os(t,n);else if(null!==(n=ja(e,t,n,r))){rc(n,e,r,tc()),as(n,t,r)}}function ns(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rs(e))os(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Aa(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=ja(e,t,o,r))&&(rc(n,e,r,o=tc()),as(n,t,r))}}function rs(e){var t=e.alternate;return e===hi||null!==t&&t===hi}function os(e,t){yi=vi=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function as(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}var is={readContext:Ca,useCallback:ki,useContext:ki,useEffect:ki,useImperativeHandle:ki,useInsertionEffect:ki,useLayoutEffect:ki,useMemo:ki,useReducer:ki,useRef:ki,useState:ki,useDebugValue:ki,useDeferredValue:ki,useTransition:ki,useMutableSource:ki,useSyncExternalStore:ki,useId:ki,unstable_isNewReconciler:!1},ss={readContext:Ca,useCallback:function(e,t){return Ci().memoizedState=[e,void 0===t?null:t],e},useContext:Ca,useEffect:qi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,$i(4194308,4,Wi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return $i(4194308,4,e,t)},useInsertionEffect:function(e,t){return $i(4,2,e,t)},useMemo:function(e,t){var n=Ci();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ci();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ts.bind(null,hi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ci().memoizedState=e},useState:Fi,useDebugValue:Qi,useDeferredValue:function(e){return Ci().memoizedState=e},useTransition:function(){var e=Fi(!1),t=e[0];return e=Ji.bind(null,e[1]),Ci().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=hi,o=Ci();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Rl)throw Error(a(349));0!=(30&mi)||Pi(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,qi(Di.bind(null,r,i,e),[e]),r.flags|=2048,zi(9,Oi.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Ci(),t=Rl.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=xi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=wi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ls={readContext:Ca,useCallback:Yi,useContext:Ca,useEffect:Hi,useImperativeHandle:Ki,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Zi,useReducer:ji,useRef:Bi,useState:function(){return ji(Ai)},useDebugValue:Qi,useDeferredValue:function(e){return Xi(Ti(),gi.memoizedState,e)},useTransition:function(){return[ji(Ai)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ni,useId:es,unstable_isNewReconciler:!1},cs={readContext:Ca,useCallback:Yi,useContext:Ca,useEffect:Hi,useImperativeHandle:Ki,useInsertionEffect:Gi,useLayoutEffect:Vi,useMemo:Zi,useReducer:Ri,useRef:Bi,useState:function(){return Ri(Ai)},useDebugValue:Qi,useDeferredValue:function(e){var t=Ti();return null===gi?t.memoizedState=e:Xi(t,gi.memoizedState,e)},useTransition:function(){return[Ri(Ai)[0],Ti().memoizedState]},useMutableSource:Li,useSyncExternalStore:Ni,useId:es,unstable_isNewReconciler:!1};function us(e,t){try{var n="",r=t;do{n+=$(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function ds(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ps(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function ms(e,t,n){(n=Oa(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Gl||(Gl=!0,Vl=r),ps(0,t)},n}function hs(e,t,n){(n=Oa(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ps(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ps(0,t),"function"!=typeof r&&(null===Wl?Wl=new Set([this]):Wl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function gs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Cc.bind(null,e,t,n),t.then(e,e))}function bs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function vs(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Oa(-1,1)).tag=2,Da(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var ys=x.ReactCurrentOwner,xs=!1;function ws(e,t,n,r){t.child=null===e?Xa(t,null,n,r):Za(t,e.child,n,r)}function ks(e,t,n,r,o){n=n.render;var a=t.ref;return Ea(t,o),r=_i(e,t,n,r,a,o),n=Ei(),null===e||xs?(aa&&n&&ta(t),t.flags|=1,ws(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gs(e,t,o))}function Ss(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Pc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Dc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,_s(e,t,a,r,o))}if(a=e.child,0==(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Gs(e,t,o)}return t.flags|=1,(e=Oc(a,r)).ref=t.ref,e.return=t,t.child=e}function _s(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(xs=!1,t.pendingProps=r=a,0==(e.lanes&o))return t.lanes=e.lanes,Gs(e,t,o);0!=(131072&e.flags)&&(xs=!0)}}return Ts(e,t,n,r,o)}function Es(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Ol,Pl),Pl|=n;else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,To(Ol,Pl),Pl|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,To(Ol,Pl),Pl|=r}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,To(Ol,Pl),Pl|=r;return ws(e,t,o,n),t.child}function Cs(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ts(e,t,n,r,o){var a=Po(n)?Lo:jo.current;return a=No(t,a),Ea(t,o),n=_i(e,t,n,r,a,o),r=Ei(),null===e||xs?(aa&&r&&ta(t),t.flags|=1,ws(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Gs(e,t,o))}function As(e,t,n,r,o){if(Po(n)){var a=!0;Mo(t)}else a=!1;if(Ea(t,o),null===t.stateNode)Hs(e,t),Ha(t,n,r),Va(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Ca(c):c=No(t,c=Po(n)?Lo:jo.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&Ga(t,i,r,c),La=!1;var p=t.memoizedState;i.state=p,Fa(t,r,i,o),l=t.memoizedState,s!==r||p!==l||Ro.current||La?("function"==typeof u&&($a(t,n,u,r),l=t.memoizedState),(s=La||qa(t,n,s,r,p,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Pa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ba(t.type,s),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Ca(l):l=No(t,l=Po(n)?Lo:jo.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||p!==l)&&Ga(t,i,r,l),La=!1,p=t.memoizedState,i.state=p,Fa(t,r,i,o);var m=t.memoizedState;s!==d||p!==m||Ro.current||La?("function"==typeof f&&($a(t,n,f,r),m=t.memoizedState),(c=La||qa(t,n,c,r,p,m,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return js(e,t,n,r,a,o)}function js(e,t,n,r,o,a){Cs(e,t);var i=0!=(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Gs(e,t,a);r=t.stateNode,ys.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Za(t,e.child,null,a),t.child=Za(t,null,s,a)):ws(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function Rs(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),oi(e,t.containerInfo)}function Ls(e,t,n,r,o){return ma(),ha(o),t.flags|=256,ws(e,t,n,r),t.child}var Ns,Ps,Os,Ds,Is={dehydrated:null,treeContext:null,retryLane:0};function Ms(e){return{baseLanes:e,cachePool:null,transitions:null}}function Fs(e,t,n){var r,o=t.pendingProps,i=li.current,s=!1,l=0!=(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&0!=(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),To(li,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},0==(1&o)&&null!==s?(s.childLanes=0,s.pendingProps=l):s=Mc(l,o,0,null),e=Ic(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ms(n),t.memoizedState=Is,e):zs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,Bs(e,t,s,r=ds(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Mc({mode:"visible",children:r.children},o,0,null),(i=Ic(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&Za(t,e.child,null,s),t.child.memoizedState=Ms(s),t.memoizedState=Is,i);if(0==(1&t.mode))return Bs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,Bs(e,t,s,r=ds(i=Error(a(419)),r,void 0))}if(l=0!=(s&e.childLanes),xs||l){if(null!==(r=Rl)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!=(o&(r.suspendedLanes|s))?0:o)&&o!==i.retryLane&&(i.retryLane=o,Ra(e,o),rc(r,e,o,-1))}return gc(),Bs(e,t,s,r=ds(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=Yo,Zo=e.id,Xo=e.overflow,Yo=t),t=zs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 0==(1&l)&&t.child!==i?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Oc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?s=Oc(r,s):(s=Ic(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ms(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Is,o}return e=(s=e.child).sibling,o=Oc(s,{mode:"visible",children:o.children}),0==(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function zs(e,t){return(t=Mc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Bs(e,t,n,r){return null!==r&&ha(r),Za(t,e.child,null,n),(e=zs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function $s(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),_a(e.return,t,n)}function Us(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function qs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ws(e,t,r.children,n),0!=(2&(r=li.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&$s(e,n,t);else if(19===e.tag)$s(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(To(li,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ci(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Us(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ci(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Us(t,!0,n,null,a);break;case"together":Us(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Hs(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Gs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ml|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Oc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Oc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Vs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ws(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ks(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ws(t),null;case 1:case 17:return Po(t.type)&&Oo(),Ws(t),null;case 3:return r=t.stateNode,ai(),Co(Ro),Co(jo),di(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ia&&(sc(ia),ia=null))),Ps(e,t),Ws(t),null;case 5:si(t);var o=ri(ni.current);if(n=t.type,null!==e&&null!=t.stateNode)Os(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Ws(t),null}if(e=ri(ei.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[mo]=i,e=0!=(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var l in ve(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",""+c]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&zr("scroll",r)}switch(n){case"input":V(r),J(r,i,!0);break;case"textarea":V(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[fo]=t,e[mo]=r,Ns(e,t,!1,!1),t.stateNode=e;e:{switch(l=ye(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Y(e,r),o=Q(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in ve(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&pe(e,u):"number"==typeof u&&pe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&y(e,i,u,l))}switch(n){case"input":V(e),J(e,r,!1);break;case"textarea":V(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Ws(t),null;case 6:if(e&&null!=t.stateNode)Ds(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=ri(ni.current),ri(ei.current),pa(t)){if(r=t.stateNode,n=t.memoizedProps,r[fo]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Xr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fo]=t,t.stateNode=r}return Ws(t),null;case 13:if(Co(li),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&0!=(1&t.mode)&&0==(128&t.flags))fa(),ma(),t.flags|=98560,i=!1;else if(i=pa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[fo]=t}else ma(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Ws(t),i=!1}else null!==ia&&(sc(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 0!=(128&t.flags)?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!=(1&t.mode)&&(null===e||0!=(1&li.current)?0===Dl&&(Dl=3):gc())),null!==t.updateQueue&&(t.flags|=4),Ws(t),null);case 4:return ai(),Ps(e,t),null===e&&Ur(t.stateNode.containerInfo),Ws(t),null;case 10:return Sa(t.type._context),Ws(t),null;case 19:if(Co(li),null===(i=t.memoizedState))return Ws(t),null;if(r=0!=(128&t.flags),null===(l=i.rendering))if(r)Vs(i,!1);else{if(0!==Dl||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(l=ci(e))){for(t.flags|=128,Vs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(li,1&li.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>ql&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ci(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Vs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Ws(t),null}else 2*Ze()-i.renderingStartTime>ql&&1073741824!==n&&(t.flags|=128,r=!0,Vs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=li.current,To(li,r?1&n|2:1&n),t):(Ws(t),null);case 22:case 23:return pc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Pl)&&(Ws(t),6&t.subtreeFlags&&(t.flags|=8192)):Ws(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Qs(e,t){switch(na(t),t.tag){case 1:return Po(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ai(),Co(Ro),Co(jo),di(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return si(t),null;case 13:if(Co(li),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ma()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Co(li),null;case 4:return ai(),null;case 10:return Sa(t.type._context),null;case 22:case 23:return pc(),null;default:return null}}Ns=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ps=function(){},Os=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ri(ei.current);var a,i=null;switch(n){case"input":o=Q(e,o),r=Q(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ve(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ds=function(e,t,n,r){n!==r&&(t.flags|=4)};var Ys=!1,Zs=!1,Xs="function"==typeof WeakSet?WeakSet:Set,Js=null;function el(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function tl(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var nl=!1;function rl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&tl(t,n,a)}o=o.next}while(o!==r)}}function ol(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function al(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function il(e){var t=e.alternate;null!==t&&(e.alternate=null,il(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[mo],delete t[go],delete t[bo],delete t[vo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function sl(e){return 5===e.tag||3===e.tag||4===e.tag}function ll(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||sl(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}function ul(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(ul(e,t,n),e=e.sibling;null!==e;)ul(e,t,n),e=e.sibling}var dl=null,pl=!1;function fl(e,t,n){for(n=n.child;null!==n;)ml(e,t,n),n=n.sibling}function ml(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Zs||el(n,t);case 6:var r=dl,o=pl;dl=null,fl(e,t,n),pl=o,null!==(dl=r)&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):dl.removeChild(n.stateNode));break;case 18:null!==dl&&(pl?(e=dl,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),Ut(e)):lo(dl,n.stateNode));break;case 4:r=dl,o=pl,dl=n.stateNode.containerInfo,pl=!0,fl(e,t,n),dl=r,pl=o;break;case 0:case 11:case 14:case 15:if(!Zs&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(0!=(2&a)||0!=(4&a))&&tl(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Zs&&(el(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Ec(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Zs=(r=Zs)||null!==n.memoizedState,fl(e,t,n),Zs=r):fl(e,t,n);break;default:fl(e,t,n)}}function hl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xs),t.forEach((function(t){var r=jc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function gl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:dl=l.stateNode,pl=!1;break e;case 3:case 4:dl=l.stateNode.containerInfo,pl=!0;break e}l=l.return}if(null===dl)throw Error(a(160));ml(i,s,o),dl=null,pl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){Ec(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)bl(t,e),t=t.sibling}function bl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(gl(t,e),vl(e),4&r){try{rl(3,e,e.return),ol(3,e)}catch(g){Ec(e,e.return,g)}try{rl(5,e,e.return)}catch(g){Ec(e,e.return,g)}}break;case 1:gl(t,e),vl(e),512&r&&null!==n&&el(n,n.return);break;case 5:if(gl(t,e),vl(e),512&r&&null!==n&&el(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,"")}catch(g){Ec(e,e.return,g)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Z(o,i),ye(l,s);var u=ye(l,i);for(s=0;s<c.length;s+=2){var d=c[s],p=c[s+1];"style"===d?ge(o,p):"dangerouslySetInnerHTML"===d?de(o,p):"children"===d?pe(o,p):y(o,d,p,u)}switch(l){case"input":X(o,i);break;case"textarea":ae(o,i);break;case"select":var f=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(o,!!i.multiple,m,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[mo]=i}catch(g){Ec(e,e.return,g)}}break;case 6:if(gl(t,e),vl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(g){Ec(e,e.return,g)}}break;case 3:if(gl(t,e),vl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(g){Ec(e,e.return,g)}break;case 4:default:gl(t,e),vl(e);break;case 13:gl(t,e),vl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||(Ul=Ze())),4&r&&hl(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Zs=(u=Zs)||d,gl(t,e),Zs=u):gl(t,e),vl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Js=e,d=e.child;null!==d;){for(p=Js=d;null!==Js;){switch(m=(f=Js).child,f.tag){case 0:case 11:case 14:case 15:rl(4,f,f.return);break;case 1:el(f,f.return);var h=f.stateNode;if("function"==typeof h.componentWillUnmount){r=f,n=f.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){Ec(r,n,g)}}break;case 5:el(f,f.return);break;case 22:if(null!==f.memoizedState){kl(p);continue}}null!==m?(m.return=f,Js=m):kl(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{o=p.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(l=p.stateNode,s=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=he("display",s))}catch(g){Ec(e,e.return,g)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(g){Ec(e,e.return,g)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:gl(t,e),vl(e),4&r&&hl(e);case 21:}}function vl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(sl(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(pe(o,""),r.flags&=-33),ul(e,ll(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;cl(e,ll(e),i);break;default:throw Error(a(161))}}catch(s){Ec(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function yl(e,t,n){Js=e,xl(e,t,n)}function xl(e,t,n){for(var r=0!=(1&e.mode);null!==Js;){var o=Js,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Ys;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Zs;s=Ys;var c=Zs;if(Ys=i,(Zs=l)&&!c)for(Js=o;null!==Js;)l=(i=Js).child,22===i.tag&&null!==i.memoizedState?Sl(o):null!==l?(l.return=i,Js=l):Sl(o);for(;null!==a;)Js=a,xl(a,t,n),a=a.sibling;Js=o,Ys=s,Zs=c}wl(e)}else 0!=(8772&o.subtreeFlags)&&null!==a?(a.return=o,Js=a):wl(e)}}function wl(e){for(;null!==Js;){var t=Js;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Zs||ol(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Zs)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ba(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&za(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}za(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&Ut(p)}}}break;default:throw Error(a(163))}Zs||512&t.flags&&al(t)}catch(f){Ec(t,t.return,f)}}if(t===e){Js=null;break}if(null!==(n=t.sibling)){n.return=t.return,Js=n;break}Js=t.return}}function kl(e){for(;null!==Js;){var t=Js;if(t===e){Js=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Js=n;break}Js=t.return}}function Sl(e){for(;null!==Js;){var t=Js;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{ol(4,t)}catch(l){Ec(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){Ec(t,o,l)}}var a=t.return;try{al(t)}catch(l){Ec(t,a,l)}break;case 5:var i=t.return;try{al(t)}catch(l){Ec(t,i,l)}}}catch(l){Ec(t,t.return,l)}if(t===e){Js=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Js=s;break}Js=t.return}}var _l,El=Math.ceil,Cl=x.ReactCurrentDispatcher,Tl=x.ReactCurrentOwner,Al=x.ReactCurrentBatchConfig,jl=0,Rl=null,Ll=null,Nl=0,Pl=0,Ol=Eo(0),Dl=0,Il=null,Ml=0,Fl=0,zl=0,Bl=null,$l=null,Ul=0,ql=1/0,Hl=null,Gl=!1,Vl=null,Wl=null,Kl=!1,Ql=null,Yl=0,Zl=0,Xl=null,Jl=-1,ec=0;function tc(){return 0!=(6&jl)?Ze():-1!==Jl?Jl:Jl=Ze()}function nc(e){return 0==(1&e.mode)?1:0!=(2&jl)&&0!==Nl?Nl&-Nl:null!==ga.transition?(0===ec&&(ec=ht()),ec):0!==(e=yt)?e:e=void 0===(e=window.event)?16:Yt(e.type)}function rc(e,t,n,r){if(50<Zl)throw Zl=0,Xl=null,Error(a(185));bt(e,n,r),0!=(2&jl)&&e===Rl||(e===Rl&&(0==(2&jl)&&(Fl|=n),4===Dl&&lc(e,Nl)),oc(e,r),1===n&&0===jl&&0==(1&t.mode)&&(ql=Ze()+500,Bo&&qo()))}function oc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),s=1<<i,l=o[i];-1===l?0!=(s&n)&&0==(s&r)||(o[i]=ft(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=pt(e,e===Rl?Nl:0);if(0===r)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Bo=!0,Uo(e)}(cc.bind(null,e)):Uo(cc.bind(null,e)),io((function(){0==(6&jl)&&qo()})),n=null;else{switch(xt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Rc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Jl=-1,ec=0,0!=(6&jl))throw Error(a(327));var n=e.callbackNode;if(Sc()&&e.callbackNode!==n)return null;var r=pt(e,e===Rl?Nl:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=bc(e,r);else{t=r;var o=jl;jl|=2;var i=hc();for(Rl===e&&Nl===t||(Hl=null,ql=Ze()+500,fc(e,t));;)try{yc();break}catch(l){mc(e,l)}ka(),Cl.current=i,jl=o,null!==Ll?t=0:(Rl=null,Nl=0,t=Dl)}if(0!==t){if(2===t&&(0!==(o=mt(e))&&(r=o,t=ic(e,o))),1===t)throw n=Il,fc(e,0),lc(e,r),oc(e,Ze()),n;if(6===t)lc(e,r);else{if(o=e.current.alternate,0==(30&r)&&!function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!sr(a(),o))return!1}catch(s){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)&&(2===(t=bc(e,r))&&(0!==(i=mt(e))&&(r=i,t=ic(e,i))),1===t))throw n=Il,fc(e,0),lc(e,r),oc(e,Ze()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:kc(e,$l,Hl);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=Ul+500-Ze())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tc(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(kc.bind(null,e,$l,Hl),t);break}kc(e,$l,Hl);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*El(r/1960))-r)){e.timeoutHandle=ro(kc.bind(null,e,$l,Hl),r);break}kc(e,$l,Hl);break;default:throw Error(a(329))}}}return oc(e,Ze()),e.callbackNode===n?ac.bind(null,e):null}function ic(e,t){var n=Bl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=$l,$l=n,null!==t&&sc(t)),e}function sc(e){null===$l?$l=e:$l.push.apply($l,e)}function lc(e,t){for(t&=~zl,t&=~Fl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function cc(e){if(0!=(6&jl))throw Error(a(327));Sc();var t=pt(e,0);if(0==(1&t))return oc(e,Ze()),null;var n=bc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=ic(e,r))}if(1===n)throw n=Il,fc(e,0),lc(e,t),oc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,$l,Hl),oc(e,Ze()),null}function uc(e,t){var n=jl;jl|=1;try{return e(t)}finally{0===(jl=n)&&(ql=Ze()+500,Bo&&qo())}}function dc(e){null!==Ql&&0===Ql.tag&&0==(6&jl)&&Sc();var t=jl;jl|=1;var n=Al.transition,r=yt;try{if(Al.transition=null,yt=1,e)return e()}finally{yt=r,Al.transition=n,0==(6&(jl=t))&&qo()}}function pc(){Pl=Ol.current,Co(Ol)}function fc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ll)for(n=Ll.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:ai(),Co(Ro),Co(jo),di();break;case 5:si(r);break;case 4:ai();break;case 13:case 19:Co(li);break;case 10:Sa(r.type._context);break;case 22:case 23:pc()}n=n.return}if(Rl=e,Ll=e=Oc(e.current,null),Nl=Pl=t,Dl=0,Il=null,zl=Fl=Ml=0,$l=Bl=null,null!==Ta){for(t=0;t<Ta.length;t++)if(null!==(r=(n=Ta[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ta=null}return e}function mc(e,t){for(;;){var n=Ll;try{if(ka(),pi.current=is,vi){for(var r=hi.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}vi=!1}if(mi=0,bi=gi=hi=null,yi=!1,xi=0,Tl.current=null,null===n||null===n.return){Dl=1,Il=t,Ll=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Nl,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,p=d.tag;if(0==(1&d.mode)&&(0===p||11===p||15===p)){var f=d.alternate;f?(d.updateQueue=f.updateQueue,d.memoizedState=f.memoizedState,d.lanes=f.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=bs(s);if(null!==m){m.flags&=-257,vs(m,s,l,0,t),1&m.mode&&gs(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(0==(1&t)){gs(i,u,t),gc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var b=bs(s);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),vs(b,s,l,0,t),ha(us(c,l));break e}}i=c=us(c,l),4!==Dl&&(Dl=2),null===Bl?Bl=[i]:Bl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,ms(0,c,t));break e;case 1:l=c;var v=i.type,y=i.stateNode;if(0==(128&i.flags)&&("function"==typeof v.getDerivedStateFromError||null!==y&&"function"==typeof y.componentDidCatch&&(null===Wl||!Wl.has(y)))){i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,hs(i,l,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(x){t=x,Ll===n&&null!==n&&(Ll=n=n.return);continue}break}}function hc(){var e=Cl.current;return Cl.current=is,null===e?is:e}function gc(){0!==Dl&&3!==Dl&&2!==Dl||(Dl=4),null===Rl||0==(268435455&Ml)&&0==(268435455&Fl)||lc(Rl,Nl)}function bc(e,t){var n=jl;jl|=2;var r=hc();for(Rl===e&&Nl===t||(Hl=null,fc(e,t));;)try{vc();break}catch(o){mc(e,o)}if(ka(),jl=n,Cl.current=r,null!==Ll)throw Error(a(261));return Rl=null,Nl=0,Dl}function vc(){for(;null!==Ll;)xc(Ll)}function yc(){for(;null!==Ll&&!Qe();)xc(Ll)}function xc(e){var t=_l(e.alternate,e,Pl);e.memoizedProps=e.pendingProps,null===t?wc(e):Ll=t,Tl.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=Ks(n,t,Pl)))return void(Ll=n)}else{if(null!==(n=Qs(n,t)))return n.flags&=32767,void(Ll=n);if(null===e)return Dl=6,void(Ll=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Ll=t);Ll=t=e}while(null!==t);0===Dl&&(Dl=5)}function kc(e,t,n){var r=yt,o=Al.transition;try{Al.transition=null,yt=1,function(e,t,n,r){do{Sc()}while(null!==Ql);if(0!=(6&jl))throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===Rl&&(Ll=Rl=null,Nl=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||Kl||(Kl=!0,Rc(tt,(function(){return Sc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=Al.transition,Al.transition=null;var s=yt;yt=1;var l=jl;jl|=4,Tl.current=null,function(e,t){if(eo=Ht,fr(e=pr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(w){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var m;p!==n||0!==o&&3!==p.nodeType||(l=s+o),p!==i||0!==r&&3!==p.nodeType||(c=s+r),3===p.nodeType&&(s+=p.nodeValue.length),null!==(m=p.firstChild);)f=p,p=m;for(;;){if(p===e)break t;if(f===n&&++u===o&&(l=s),f===i&&++d===r&&(c=s),null!==(m=p.nextSibling))break;f=(p=f).parentNode}p=m}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Js=t;null!==Js;)if(e=(t=Js).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Js=e;else for(;null!==Js;){t=Js;try{var h=t.alternate;if(0!=(1024&t.flags))switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,b=h.memoizedState,v=t.stateNode,y=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:ba(t.type,g),b);v.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var x=t.stateNode.containerInfo;1===x.nodeType?x.textContent="":9===x.nodeType&&x.documentElement&&x.removeChild(x.documentElement);break;default:throw Error(a(163))}}catch(w){Ec(t,t.return,w)}if(null!==(e=t.sibling)){e.return=t.return,Js=e;break}Js=t.return}h=nl,nl=!1}(e,n),bl(n,e),mr(to),Ht=!!eo,to=eo=null,e.current=n,yl(n,e,o),Ye(),jl=l,yt=s,Al.transition=i}else e.current=n;if(Kl&&(Kl=!1,Ql=e,Yl=o),i=e.pendingLanes,0===i&&(Wl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),oc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Gl)throw Gl=!1,e=Vl,Vl=null,e;0!=(1&Yl)&&0!==e.tag&&Sc(),i=e.pendingLanes,0!=(1&i)?e===Xl?Zl++:(Zl=0,Xl=e):Zl=0,qo()}(e,t,n,r)}finally{Al.transition=o,yt=r}return null}function Sc(){if(null!==Ql){var e=xt(Yl),t=Al.transition,n=yt;try{if(Al.transition=null,yt=16>e?16:e,null===Ql)var r=!1;else{if(e=Ql,Ql=null,Yl=0,0!=(6&jl))throw Error(a(331));var o=jl;for(jl|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(0!=(16&Js.flags)){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Js=u;null!==Js;){var d=Js;switch(d.tag){case 0:case 11:case 15:rl(8,d,i)}var p=d.child;if(null!==p)p.return=d,Js=p;else for(;null!==Js;){var f=(d=Js).sibling,m=d.return;if(il(d),d===u){Js=null;break}if(null!==f){f.return=m,Js=f;break}Js=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var b=g.sibling;g.sibling=null,g=b}while(null!==g)}}Js=i}}if(0!=(2064&i.subtreeFlags)&&null!==s)s.return=i,Js=s;else e:for(;null!==Js;){if(0!=(2048&(i=Js).flags))switch(i.tag){case 0:case 11:case 15:rl(9,i,i.return)}var v=i.sibling;if(null!==v){v.return=i.return,Js=v;break e}Js=i.return}}var y=e.current;for(Js=y;null!==Js;){var x=(s=Js).child;if(0!=(2064&s.subtreeFlags)&&null!==x)x.return=s,Js=x;else e:for(s=y;null!==Js;){if(0!=(2048&(l=Js).flags))try{switch(l.tag){case 0:case 11:case 15:ol(9,l)}}catch(k){Ec(l,l.return,k)}if(l===s){Js=null;break e}var w=l.sibling;if(null!==w){w.return=l.return,Js=w;break e}Js=l.return}}if(jl=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(k){}r=!0}return r}finally{yt=n,Al.transition=t}}return!1}function _c(e,t,n){e=Da(e,t=ms(0,t=us(n,t),1),1),t=tc(),null!==e&&(bt(e,1,t),oc(e,t))}function Ec(e,t,n){if(3===e.tag)_c(e,e,n);else for(;null!==t;){if(3===t.tag){_c(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Wl||!Wl.has(r))){t=Da(t,e=hs(t,e=us(n,e),1),1),e=tc(),null!==t&&(bt(t,1,e),oc(t,e));break}}t=t.return}}function Cc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Nl&n)===n&&(4===Dl||3===Dl&&(130023424&Nl)===Nl&&500>Ze()-Ul?fc(e,0):zl|=n),oc(e,t)}function Tc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=tc();null!==(e=Ra(e,t))&&(bt(e,t,n),oc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Tc(e,n)}function jc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Tc(e,n)}function Rc(e,t){return We(e,t)}function Lc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Nc(e,t,n,r){return new Lc(e,t,n,r)}function Pc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Oc(e,t){var n=e.alternate;return null===n?((n=Nc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Dc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Pc(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case S:return Ic(n.children,o,i,t);case _:s=8,o|=8;break;case E:return(e=Nc(12,n,t,2|o)).elementType=E,e.lanes=i,e;case j:return(e=Nc(13,n,t,o)).elementType=j,e.lanes=i,e;case R:return(e=Nc(19,n,t,o)).elementType=R,e.lanes=i,e;case P:return Mc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:s=10;break e;case T:s=9;break e;case A:s=11;break e;case L:s=14;break e;case N:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Nc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Ic(e,t,n,r){return(e=Nc(7,e,r,t)).lanes=n,e}function Mc(e,t,n,r){return(e=Nc(22,e,r,t)).elementType=P,e.lanes=n,e.stateNode={isHidden:!1},e}function Fc(e,t,n){return(e=Nc(6,e,null,t)).lanes=n,e}function zc(e,t,n){return(t=Nc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Bc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function $c(e,t,n,r,o,a,i,s,l){return e=new Bc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Nc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Na(a),e}function Uc(e){if(!e)return Ao;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Po(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Po(n))return Io(e,n,t)}return t}function qc(e,t,n,r,o,a,i,s,l){return(e=$c(n,r,!0,e,0,a,0,s,l)).context=Uc(null),n=e.current,(a=Oa(r=tc(),o=nc(n))).callback=null!=t?t:null,Da(n,a,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function Hc(e,t,n,r){var o=t.current,a=tc(),i=nc(o);return n=Uc(n),null===t.context?t.context=n:t.pendingContext=n,(t=Oa(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Da(o,t,i))&&(rc(e,o,i,a),Ia(e,o,i)),i}function Gc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Vc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Wc(e,t){Vc(e,t),(e=e.alternate)&&Vc(e,t)}_l=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Ro.current)xs=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return xs=!1,function(e,t,n){switch(t.tag){case 3:Rs(t),ma();break;case 5:ii(t);break;case 1:Po(t.type)&&Mo(t);break;case 4:oi(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(va,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(li,1&li.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Fs(e,t,n):(To(li,1&li.current),null!==(e=Gs(e,t,n))?e.sibling:null);To(li,1&li.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return qs(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(li,li.current),r)break;return null;case 22:case 23:return t.lanes=0,Es(e,t,n)}return Gs(e,t,n)}(e,t,n);xs=0!=(131072&e.flags)}else xs=!1,aa&&0!=(1048576&t.flags)&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hs(e,t),e=t.pendingProps;var o=No(t,jo.current);Ea(t,n),o=_i(null,t,r,e,o,n);var i=Ei();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Po(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Na(t),o.updater=Ua,t.stateNode=o,o._reactInternals=t,Va(t,r,e,n),t=js(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),ws(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hs(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Pc(e)?1:0;if(null!=e){if((e=e.$$typeof)===A)return 11;if(e===L)return 14}return 2}(r),e=ba(r,e),o){case 0:t=Ts(null,t,r,e,n);break e;case 1:t=As(null,t,r,e,n);break e;case 11:t=ks(null,t,r,e,n);break e;case 14:t=Ss(null,t,r,ba(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Ts(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 1:return r=t.type,o=t.pendingProps,As(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 3:e:{if(Rs(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Pa(e,t),Fa(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ls(e,t,r,n,o=us(Error(a(423)),t));break e}if(r!==o){t=Ls(e,t,r,n,o=us(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=Xa(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ma(),r===o){t=Gs(e,t,n);break e}ws(e,t,r,n)}t=t.child}return t;case 5:return ii(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),Cs(e,t),ws(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Fs(e,t,n);case 4:return oi(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Za(t,null,r,n):ws(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,ks(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 7:return ws(e,t,t.pendingProps,n),t.child;case 8:case 12:return ws(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,To(va,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!Ro.current){t=Gs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=Oa(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),_a(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),_a(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}ws(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ea(t,n),r=r(o=Ca(o)),t.flags|=1,ws(e,t,r,n),t.child;case 14:return o=ba(r=t.type,t.pendingProps),Ss(e,t,r,o=ba(r.type,o),n);case 15:return _s(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ba(r,o),Hs(e,t),t.tag=1,Po(r)?(e=!0,Mo(t)):e=!1,Ea(t,n),Ha(t,r,o),Va(t,r,o,n),js(null,t,r,!0,e,n);case 19:return qs(e,t,n);case 22:return Es(e,t,n)}throw Error(a(156,t.tag))};var Kc="function"==typeof reportError?reportError:function(e){console.error(e)};function Qc(e){this._internalRoot=e}function Yc(e){this._internalRoot=e}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function eu(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Gc(i);s.call(e)}}Hc(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Gc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[ho]=i.current,Ur(8===e.nodeType?e.parentNode:e),dc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Gc(l);s.call(e)}}var l=$c(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=l,e[ho]=l.current,Ur(8===e.nodeType?e.parentNode:e),dc((function(){Hc(t,l,n,r)})),l}(n,t,e,o,r);return Gc(i)}Yc.prototype.render=Qc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));Hc(e,t,null,null)},Yc.prototype.unmount=Qc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;dc((function(){Hc(null,e,null,null)})),t[ho]=null}},Yc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Pt.length&&0!==t&&t<Pt[n].priority;n++);Pt.splice(n,0,e),0===n&&Mt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(vt(t,1|n),oc(t,Ze()),0==(6&jl)&&(ql=Ze()+500,qo()))}break;case 13:dc((function(){var t=Ra(e,1);if(null!==t){var n=tc();rc(t,e,1,n)}})),Wc(e,1)}},kt=function(e){if(13===e.tag){var t=Ra(e,134217728);if(null!==t)rc(t,e,134217728,tc());Wc(e,134217728)}},St=function(e){if(13===e.tag){var t=nc(e),n=Ra(e,t);if(null!==n)rc(n,e,t,tc());Wc(e,t)}},_t=function(){return yt},Et=function(e,t){var n=yt;try{return yt=e,t()}finally{yt=n}},ke=function(e,t,n){switch(t){case"input":if(X(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=ko(r);if(!o)throw Error(a(90));W(r),X(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ae=uc,je=dc;var tu={usingClientEntryPoint:!1,Events:[xo,wo,ko,Ce,Te,uc]},nu={findFiberByHostInstance:yo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},ru={bundleType:nu.bundleType,version:nu.version,rendererPackageName:nu.rendererPackageName,rendererConfig:nu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:x.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:nu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ou=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ou.isDisabled&&ou.supportsFiber)try{ot=ou.inject(ru),at=ou}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Zc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Zc(e))throw Error(a(299));var n=!1,r="",o=Kc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=$c(e,1,!1,null,0,n,0,r,o),e[ho]=t.current,Ur(8===e.nodeType?e.parentNode:e),new Qc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return dc(e)},t.hydrate=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Zc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Kc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,s),e[ho]=t.current,Ur(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Yc(t)},t.render=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Xc(e))throw Error(a(40));return!!e._reactRootContainer&&(dc((function(){eu(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=uc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Xc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return eu(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),s=n.n(i),l=n(311),c=n.n(l),u=n(2833),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},x=Object.keys(g).map((function(e){return g[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},_=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},E=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},A=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var s=a[i],l=p({},r[s],o[s]);r[s]=l}return e}),[]).reverse()},j=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},R=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},P=[g.NOSCRIPT,g.SCRIPT,g.STYLE],O=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=R(t);return o?"<"+e+' data-rh="true" '+o+">"+O(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+O(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+O(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=L(e.metaTags,y),a=L(t,b),i=L(n,v);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,o.priority),M(g.LINK,a.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,p,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:l,titleAttributes:c},r)}},B=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),W(g.TITLE,t)}(u,d);var p={baseTag:V(g.BASE,n),linkTags:V(g.LINK,o),metaTags:V(g.META,a),noscriptTags:V(g.NOSCRIPT,i),scriptTags:V(g.SCRIPT,l),styleTags:V(g.STYLE,c)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)})),t&&t(),s(e,f,m)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(g.LINK,["rel","href"],e),metaTags:A(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:A(g.SCRIPT,["src","innerHTML"],e),styleTags:A(g.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:j(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){K(t,(function(){Q=null}))})):(K(t),Q=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case g.BODY:return p({},o,{bodyAttributes:p({},a)});case g.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(x.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+x.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=h(r,Z),s=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Y,p({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,x=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case g:case h:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=g,t.Memo=h,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===c},t.isContextProvider=function(e){return w(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===p},t.isFragment=function(e){return w(e)===a},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===h},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===s},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(6540),l=n(5556),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return c.push(g),"function"==typeof m.webpack&&u.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),p=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),p}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return s.Children.only(this.props.children)},t}(s.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}a(g,"propTypes",{report:l.func.isRequired}),a(g,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>s});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{Kd:()=>u,N_:()=>g,k2:()=>y});var r=n(6347),o=n(2892),a=n(6540),i=n(1513),s=n(8168),l=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);a.Component;var d=function(e,t){return"function"==typeof e?e(t):e},p=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},f=function(e){return e},m=a.forwardRef;void 0===m&&(m=f);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.A)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=f!==m&&t||n,a.createElement("a",u)}));var g=m((function(e,t){var n=e.component,o=void 0===n?h:n,u=e.replace,g=e.to,b=e.innerRef,v=(0,l.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=p(d(g,e.location),e.location),l=r?n.createHref(r):"",h=(0,s.A)({},v,{href:l,navigate:function(){var t=d(g,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(p(t));(u||r?n.replace:n.push)(t)}});return f!==m?h.ref=t||b:h.innerRef=b,a.createElement(o,h)}))})),b=function(e){return e},v=a.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,f=e.activeStyle,m=e.className,h=e.exact,y=e.isActive,x=e.location,w=e.sensitive,k=e.strict,S=e.style,_=e.to,E=e.innerRef,C=(0,l.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=x||e.location,i=p(d(_,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.B6)(n.pathname,{path:T,exact:h,sensitive:w,strict:k}):null,j=!!(y?y(A,n):A),R="function"==typeof m?m(j):m,L="function"==typeof S?S(j):S;j&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,u),L=(0,s.A)({},L,f));var N=(0,s.A)({"aria-current":j&&o||null,className:R,style:L,to:i},C);return b!==v?N.ref=t||E:N.innerRef=E,a.createElement(g,N)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>y,W6:()=>N,XZ:()=>v,dO:()=>R,qh:()=>_,zy:()=>P});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(1513),l=n(1561),c=n(8168),u=n(5302),d=n.n(u),p=(n(4363),n(8587)),f=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},o.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),v=g("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var x={},w=1e4,k=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=x[n]||(x[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return k<w&&(r[e]=a,k++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],p=l.slice(1),f=e===u;return a&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,a=(0,c.A)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(v.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.AO)(e)}function A(e){return function(){(0,l.A)(!1)}}function j(){}o.Component;var R=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(a.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var L=o.useContext;function N(){return L(b)}function P(){return L(v).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function v(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=b.prototype;var x=y.prototype=new v;x.constructor=y,h(x,b.prototype),x.isPureReactComponent=!0;var w=Array.isArray,k=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function A(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function j(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+A(l,0):a,w(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),j(i,t,o,"",(function(e){return e}))):null!=i&&(C(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",w(e))for(var c=0;c<e.length;c++){var u=a+A(s=e[c],c);l+=j(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=j(s=s.value,t,o,u=a+A(s,c++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function R(e,t,n){if(null==e)return e;var r=[],o=0;return j(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function L(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var N={current:null},P={transition:null},O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:P,ReactCurrentOwner:S};t.Children={map:R,forEach:function(e,t,n){R(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return R(e,(function(){t++})),t},toArray:function(e){return R(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=i,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=h({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)k.call(t,c)&&!_.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return N.current.useCallback(e,t)},t.useContext=function(e){return N.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return N.current.useDeferredValue(e)},t.useEffect=function(e,t){return N.current.useEffect(e,t)},t.useId=function(){return N.current.useId()},t.useImperativeHandle=function(e,t,n){return N.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return N.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return N.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return N.current.useMemo(e,t)},t.useReducer=function(e,t,n){return N.current.useReducer(e,t,n)},t.useRef=function(e){return N.current.useRef(e)},t.useState=function(e){return N.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return N.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return N.current.useTransition()},t.version="18.2.0"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,p=null,f=3,m=!1,h=!1,g=!1,b="function"==typeof setTimeout?setTimeout:null,v="function"==typeof clearTimeout?clearTimeout:null,y="undefined"!=typeof setImmediate?setImmediate:null;function x(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function w(e){if(g=!1,x(e),!h)if(null!==r(c))h=!0,P(k);else{var t=r(u);null!==t&&O(w,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,v(C),C=-1),m=!0;var a=f;try{for(x(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!j());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var s=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?p.callback=s:p===r(c)&&o(c),x(n)}else o(c);p=r(c)}if(null!==p)var l=!0;else{var d=r(u);null!==d&&O(w,d.startTime-n),l=!1}return l}finally{p=null,f=a,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,_=!1,E=null,C=-1,T=5,A=-1;function j(){return!(t.unstable_now()-A<T)}function R(){if(null!==E){var e=t.unstable_now();A=e;var n=!0;try{n=E(!0,e)}finally{n?S():(_=!1,E=null)}}else _=!1}if("function"==typeof y)S=function(){y(R)};else if("undefined"!=typeof MessageChannel){var L=new MessageChannel,N=L.port2;L.port1.onmessage=R,S=function(){N.postMessage(null)}}else S=function(){b(R,0)};function P(e){E=e,_||(_=!0,S())}function O(e,n){C=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,P(k))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):T=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(v(C),C=-1):g=!0,O(w,a-i))):(e.sortIndex=s,n(c,e),h||m||(h=!0,P(k))),e},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Routr Docs",tagline:"The future of programmable SIP servers",favicon:"img/favicon.ico",url:"https://routr.io",baseUrl:"/",organizationName:"fonoster",projectName:"routr",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",onBrokenAnchors:"ignore",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{lastVersion:"current",versions:{current:{label:"2.0.0",path:"2.0.0"}},sidebarPath:"/home/runner/work/routr/routr/docs/sidebars.js",editUrl:"https://github.com/fonoster/routr-website/edit/main"},theme:{customCss:"/home/runner/work/routr/routr/docs/src/css/custom.css"},gtag:{trackingID:"G-JX93S6PKN4",anonymizeIP:!0}}]],plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/docs/2.0.0/overview/introduction",from:["/docs/overview/introduction","/docs"]},{to:"/docs/2.0.0/contributing",from:["/docs/contributing"]},{to:"/docs/2.0.0/community",from:["/docs/community"]},{to:"/docs/2.0.0/development/introduction",from:["/docs/development/introduction"]}]}]],themeConfig:{algolia:{appId:"VLT67PBOP0",apiKey:"ac3a064eec614a9ade617bafd5de55de",indexName:"routr",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},image:"img/docusaurus-social-card.jpg",navbar:{logo:{alt:"Routr Logo",src:"img/logo.svg"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers",label:"Training",position:"left"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://github.com/fonoster/routr",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Quick Links",items:[{label:"Docs",to:"/docs/2.0.0/overview/introduction"},{label:"Training",href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers"}]},{title:"Community",items:[{label:"GitHub Discussions",href:"https://github.com/fonoster/routr/discussions"},{label:"Discord",href:"https://discord.gg/4QWgSz4hTC"},{label:"Twitter",href:"https://twitter.com/fonoster"}]},{title:"More",items:[{label:"Blog",to:"https://learn.fonoster.com/blog"},{label:"GitHub",href:"https://github.com/fonoster/routr"}]}],copyright:"Copyright \xa9 2024 Fonoster, Inc. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!0,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}n.d(t,{A:()=>r})},8215:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},5066:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},8181:(e,t,n)=>{"use strict";n.d(t,{f4:()=>J,My:()=>C});var r=n(6540);function o(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=o(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}const a=function(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=o(e))&&(r&&(r+=" "),r+=t);return r};var i,s,l,c,u,d=Object.create,p=Object.defineProperty,f=Object.defineProperties,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,g=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable,w=(e,t,n)=>t in e?p(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,k=(e,t)=>{for(var n in t||(t={}))y.call(t,n)&&w(e,n,t[n]);if(b)for(var n of b(t))x.call(t,n)&&w(e,n,t[n]);return e},S=(e,t)=>f(e,h(t)),_=(e,t)=>{var n={};for(var r in e)y.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&x.call(e,r)&&(n[r]=e[r]);return n},E=(i={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new s;return l(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,s,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var m=0;m<f.length;++m){if(d&&d.cause==p+","+m)return;var h=f[m],g=h.inside,b=!!h.lookbehind,v=!!h.greedy,y=h.alias;if(v&&!h.pattern.global){var x=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,x+"g")}for(var w=h.pattern||h,k=s.next,S=u;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,C=1;if(v){if(!(E=a(w,S,e,b))||E.index>=e.length)break;var T=E.index,A=E.index+E[0].length,j=S;for(j+=k.value.length;T>=j;)j+=(k=k.next).value.length;if(S=j-=k.value.length,k.value instanceof o)continue;for(var R=k;R!==t.tail&&(j<A||"string"==typeof R.value);R=R.next)C++,j+=R.value.length;C--,_=e.slice(S,j),E.index-=S}else if(!(E=a(w,0,_,b)))continue;T=E.index;var L=E[0],N=_.slice(0,T),P=_.slice(T+L.length),O=S+_.length;d&&O>d.reach&&(d.reach=O);var D=k.prev;if(N&&(D=l(t,D,N),S+=N.length),c(t,D,C),k=l(t,D,new o(p,g?r.tokenize(L,g):L,y,L)),P&&l(t,k,P),C>1){var I={cause:p+","+m,reach:O};i(e,t,n,k.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return s||(0,i[g(i)[0]])((s={exports:{}}).exports,s),s.exports}),C=((e,t,n)=>(n=null!=e?d(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of g(t))y.call(e,o)||o===n||p(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(E());C.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},C.languages.markup.tag.inside["attr-value"].inside.entity=C.languages.markup.entity,C.languages.markup.doctype.inside["internal-subset"].inside=C.languages.markup,C.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(C.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:C.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:C.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},C.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(C.languages.markup.tag,"addAttribute",{value:function(e,t){C.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:C.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),C.languages.html=C.languages.markup,C.languages.mathml=C.languages.markup,C.languages.svg=C.languages.markup,C.languages.xml=C.languages.extend("markup",{}),C.languages.ssml=C.languages.xml,C.languages.atom=C.languages.xml,C.languages.rss=C.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(C),C.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},C.languages.javascript=C.languages.extend("clike",{"class-name":[C.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),C.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,C.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:C.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:C.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:C.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:C.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:C.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),C.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:C.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),C.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),C.languages.markup&&(C.languages.markup.tag.addInlined("script","javascript"),C.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),C.languages.js=C.languages.javascript,C.languages.actionscript=C.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),C.languages.actionscript["class-name"].alias="function",delete C.languages.actionscript.parameter,delete C.languages.actionscript["literal-property"],C.languages.markup&&C.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:C.languages.markup}}),c=/#(?!\{).+/,u={pattern:/#\{[^}]+\}/,alias:"variable"},(l=C).languages.coffeescript=l.languages.extend("javascript",{comment:c,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:u}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),l.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:c,interpolation:u}}}),l.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:l.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:u}}]}),l.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete l.languages.coffeescript["template-string"],l.languages.coffee=l.languages.coffeescript,function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(C),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(C),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(C),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(C),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n)):s[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(C),C.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:C.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},C.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<o.length)){var s=p(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&0<=o.indexOf(c.content)&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&0==--o)return a}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),C.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,l,p,f,m,h,g,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++c,l=h.substring(0,g),m=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(m,f)).length&&((p=[1,1]).push.apply(p,s(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,m),f=h.substring(g+i.length),m=[],l&&m.push(l),m.push(p),f&&(t(h=[f]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(m)),a+=m.length-1):b.content=m)):(g=b.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,s,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(C),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(C),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(C),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(C),C.languages.n4js=C.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),C.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),C.languages.n4jsd=C.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(C),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(C),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(C),C.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},C.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=C.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(C),C.languages.c=C.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),C.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),C.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},C.languages.c.string],char:C.languages.c.char,comment:C.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:C.languages.c}}}}),C.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete C.languages.c.boolean,C.languages.objectivec=C.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete C.languages.objectivec["class-name"],C.languages.objc=C.languages.objectivec,C.languages.reason=C.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),C.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete C.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(C),C.languages.go=C.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),C.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete C.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(C),C.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},C.languages.python["string-interpolation"].inside.interpolation.inside.rest=C.languages.python,C.languages.py=C.languages.python;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>A,duotoneLight:()=>j,github:()=>R,jettwaveDark:()=>q,jettwaveLight:()=>H,nightOwl:()=>L,nightOwlLight:()=>N,oceanicNext:()=>D,okaidia:()=>I,oneDark:()=>G,oneLight:()=>V,palenight:()=>M,shadesOfPurple:()=>F,synthwave84:()=>z,ultramin:()=>B,vsDark:()=>$,vsLight:()=>U});var T={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},A={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},j={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},R={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},L={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},N={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},P="#c5a5c5",O="#8dc891",D={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:P}},{types:["attr-value"],style:{color:O}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:O}},{types:["punctuation"],style:{color:O}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:P}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},I={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},M={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},F={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},z={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},B={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},$={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},U={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},q={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},H={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},G={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},V={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},W=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=k(k({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=S(k({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Q=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},Y=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},Z=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Y(c,u.type),u.alias&&(c=Y(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(K),p=d.length;s.push({types:c,content:d[0]});for(let t=1;t<p;t++)Q(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return Q(s),l},X=({children:e,language:t,code:n,theme:o,prism:i})=>{const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(W(t,e)),a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)((()=>{t===a.current&&e===i.current||(a.current=t,i.current=e,o(W(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:i}=n,s=_(n,["className","style","line"]);const l=S(k({},s),{className:a("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=k(k({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,r.useCallback)((e=>{var n=e,{token:r,className:o,style:i}=n,s=_(n,["token","className","style"]);const l=S(k({},s),{className:a("token",...r.types,o),children:r.content,style:t(r)});return null!=i&&(l.style=k(k({},l.style||{}),i)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const a=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return Z([t]);const e={code:t,grammar:n,language:o,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),Z(e.tokens)}),[t,n,o])})({prism:i,language:s,code:n,grammar:i.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,S(k({},e),{prism:e.prism||C,theme:e.theme||$,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search-9b7":{"__comp":"1a4e3797","__context":{"plugin":"a0c5838c"}},"/docs-125":{"__comp":"5e95c892","__context":{"plugin":"deaab6a5"}},"/docs/1.x.x-370":{"__comp":"a7bd4aaa","version":"8f5f22a9"},"/docs/1.x.x-e79":{"__comp":"a94703ab"},"/docs/1.x.x/administration/cli/cheatsheet-375":{"__comp":"17896441","content":"b5de05fe"},"/docs/1.x.x/administration/cli/installation-4dc":{"__comp":"17896441","content":"5514a4b8"},"/docs/1.x.x/administration/cli/remote-access-97c":{"__comp":"17896441","content":"bc1a89ad"},"/docs/1.x.x/administration/webconsole-62a":{"__comp":"17896441","content":"093b4e4f"},"/docs/1.x.x/api/agents/create-b97":{"__comp":"17896441","content":"9840208a"},"/docs/1.x.x/api/agents/delete-b72":{"__comp":"17896441","content":"1cd31f12"},"/docs/1.x.x/api/agents/get-f9a":{"__comp":"17896441","content":"ec64d50d"},"/docs/1.x.x/api/agents/list-4c3":{"__comp":"17896441","content":"6c35bbce"},"/docs/1.x.x/api/agents/update-b29":{"__comp":"17896441","content":"19dd4331"},"/docs/1.x.x/api/config/get-4bc":{"__comp":"17896441","content":"71153375"},"/docs/1.x.x/api/config/update-983":{"__comp":"17896441","content":"b4dd6982"},"/docs/1.x.x/api/domains/create-815":{"__comp":"17896441","content":"9d10a623"},"/docs/1.x.x/api/domains/delete-542":{"__comp":"17896441","content":"40f2f3c6"},"/docs/1.x.x/api/domains/get-c5a":{"__comp":"17896441","content":"d3c35fce"},"/docs/1.x.x/api/domains/list-3bc":{"__comp":"17896441","content":"8a9effda"},"/docs/1.x.x/api/domains/update-633":{"__comp":"17896441","content":"b1e2c3e5"},"/docs/1.x.x/api/gateways/create-404":{"__comp":"17896441","content":"943e77c3"},"/docs/1.x.x/api/gateways/delete-de6":{"__comp":"17896441","content":"40f2a0b4"},"/docs/1.x.x/api/gateways/get-d16":{"__comp":"17896441","content":"b8ab588d"},"/docs/1.x.x/api/gateways/list-5bf":{"__comp":"17896441","content":"5e82a060"},"/docs/1.x.x/api/gateways/update-8a3":{"__comp":"17896441","content":"9a5a69d5"},"/docs/1.x.x/api/location/create-ee5":{"__comp":"17896441","content":"4e27cd47"},"/docs/1.x.x/api/location/delete-682":{"__comp":"17896441","content":"646468fb"},"/docs/1.x.x/api/location/list-f64":{"__comp":"17896441","content":"0f2bd920"},"/docs/1.x.x/api/numbers/create-6ef":{"__comp":"17896441","content":"99f83bea"},"/docs/1.x.x/api/numbers/delete-6a0":{"__comp":"17896441","content":"4d0c799d"},"/docs/1.x.x/api/numbers/get-b9d":{"__comp":"17896441","content":"ed519cbf"},"/docs/1.x.x/api/numbers/list-c63":{"__comp":"17896441","content":"6c14cd7d"},"/docs/1.x.x/api/numbers/update-a01":{"__comp":"17896441","content":"4dcd5895"},"/docs/1.x.x/api/overview-d3c":{"__comp":"17896441","content":"321dfeeb"},"/docs/1.x.x/api/peers/create-f5b":{"__comp":"17896441","content":"411db075"},"/docs/1.x.x/api/peers/delete-349":{"__comp":"17896441","content":"a552b93b"},"/docs/1.x.x/api/peers/get-395":{"__comp":"17896441","content":"9a4dfeaa"},"/docs/1.x.x/api/peers/list-70b":{"__comp":"17896441","content":"bc2f9ced"},"/docs/1.x.x/api/peers/update-d81":{"__comp":"17896441","content":"95069fb2"},"/docs/1.x.x/api/registry-46f":{"__comp":"17896441","content":"72607e62"},"/docs/1.x.x/api/status/get-0e4":{"__comp":"17896441","content":"9799683e"},"/docs/1.x.x/api/status/update-95d":{"__comp":"17896441","content":"7df8ae3f"},"/docs/1.x.x/api/sys/info-bf8":{"__comp":"17896441","content":"1b166456"},"/docs/1.x.x/api/sys/logs-847":{"__comp":"17896441","content":"6e2907e5"},"/docs/1.x.x/api/token-069":{"__comp":"17896441","content":"656951a7"},"/docs/1.x.x/concepts-b93":{"__comp":"17896441","content":"35bee977"},"/docs/1.x.x/configuration/agents-4d7":{"__comp":"17896441","content":"a30498ab"},"/docs/1.x.x/configuration/domains-4b7":{"__comp":"17896441","content":"81e5f1d0"},"/docs/1.x.x/configuration/gateways-cbd":{"__comp":"17896441","content":"876e022a"},"/docs/1.x.x/configuration/general-52e":{"__comp":"17896441","content":"3e7ceef0"},"/docs/1.x.x/configuration/numbers-f3e":{"__comp":"17896441","content":"7efb1a82"},"/docs/1.x.x/configuration/peers-113":{"__comp":"17896441","content":"ee7973d9"},"/docs/1.x.x/configuration/users-459":{"__comp":"17896441","content":"017ddd06"},"/docs/1.x.x/guides/basic-setup-890":{"__comp":"17896441","content":"da51cc8f"},"/docs/1.x.x/guides/routr-as-asterisk-frontend-2a0":{"__comp":"17896441","content":"09b719bb"},"/docs/1.x.x/guides/running-on-kubernetes-7dc":{"__comp":"17896441","content":"1ea220c7"},"/docs/1.x.x/guides/running-with-docker-or-compose-5c2":{"__comp":"17896441","content":"23efd64d"},"/docs/1.x.x/guides/securing-the-signaling-path-99f":{"__comp":"17896441","content":"a9d63626"},"/docs/1.x.x/introduction/community-060":{"__comp":"17896441","content":"e10372bb"},"/docs/1.x.x/introduction/comparison-595":{"__comp":"17896441","content":"bb373259"},"/docs/1.x.x/introduction/faq-e8b":{"__comp":"17896441","content":"a40a3312"},"/docs/1.x.x/introduction/glossary-85c":{"__comp":"17896441","content":"918bfdcb"},"/docs/1.x.x/introduction/installation-1c1":{"__comp":"17896441","content":"3325c53c"},"/docs/1.x.x/introduction/media-f84":{"__comp":"17896441","content":"f3f39cc5"},"/docs/1.x.x/introduction/overview-973":{"__comp":"17896441","content":"a4cb0559"},"/docs/1.x.x/introduction/performance-tests/user-location-93b":{"__comp":"17896441","content":"7c32d245"},"/docs/1.x.x/introduction/roadmap-c45":{"__comp":"17896441","content":"3a673d53"},"/docs/1.x.x/introduction/test-plan-859":{"__comp":"17896441","content":"759bfbe1"},"/docs/1.x.x/welcome-055":{"__comp":"17896441","content":"64332b0f"},"/docs/2.0.0-1e6":{"__comp":"a7bd4aaa","version":"935f2afb"},"/docs/2.0.0-45e":{"__comp":"a94703ab"},"/docs/2.0.0/changelog-abc":{"__comp":"17896441","content":"9beb87c2"},"/docs/2.0.0/community-943":{"__comp":"17896441","content":"5ef0e9d6"},"/docs/2.0.0/connect/command-line/ctl-817":{"__comp":"17896441","content":"ed175a37"},"/docs/2.0.0/connect/command-line/overview-928":{"__comp":"17896441","content":"ea5491a0"},"/docs/2.0.0/connect/concepts-93c":{"__comp":"17896441","content":"5a1924d4"},"/docs/2.0.0/connect/home-or-office-setup-28c":{"__comp":"17896441","content":"2a36568f"},"/docs/2.0.0/connect/introduction-b89":{"__comp":"17896441","content":"d7a9d534"},"/docs/2.0.0/connect/nodesdk/overview-909":{"__comp":"17896441","content":"8ac6f1f4"},"/docs/2.0.0/connect/nodesdk/sdk-d65":{"__comp":"17896441","content":"43d3d555"},"/docs/2.0.0/connect/quick-start/docker-8f4":{"__comp":"17896441","content":"f4357d2a"},"/docs/2.0.0/connect/quick-start/kubernetes-ca7":{"__comp":"17896441","content":"3c0cfdd0"},"/docs/2.0.0/connect/securing-the-server-d31":{"__comp":"17896441","content":"f1b4aa58"},"/docs/2.0.0/connect/sending-call-events-to-nats-f0a":{"__comp":"17896441","content":"8613bfde"},"/docs/2.0.0/connect/webrtc-support-dcc":{"__comp":"17896441","content":"129db88c"},"/docs/2.0.0/contributing-373":{"__comp":"17896441","content":"4d54d076"},"/docs/2.0.0/development/alterations/methods-990":{"__comp":"17896441","content":"39d73575"},"/docs/2.0.0/development/alterations/overview-7a2":{"__comp":"17896441","content":"b396445b"},"/docs/2.0.0/development/building-a-chat-application-f4b":{"__comp":"17896441","content":"b3bbf2ca"},"/docs/2.0.0/development/building-a-middleware-ad6":{"__comp":"17896441","content":"956a4ea6"},"/docs/2.0.0/development/building-a-processor-3aa":{"__comp":"17896441","content":"92a92b88"},"/docs/2.0.0/development/building-a-scaip-processor-c5f":{"__comp":"17896441","content":"26da1a01"},"/docs/2.0.0/development/components/apiserver-3ea":{"__comp":"17896441","content":"7cf72cd4"},"/docs/2.0.0/development/components/dispatcher-49c":{"__comp":"17896441","content":"02617853"},"/docs/2.0.0/development/components/edgeport-a3e":{"__comp":"17896441","content":"33664cb1"},"/docs/2.0.0/development/components/location-ea7":{"__comp":"17896441","content":"f5184ac4"},"/docs/2.0.0/development/components/overview-80e":{"__comp":"17896441","content":"76273f75"},"/docs/2.0.0/development/components/registry-416":{"__comp":"17896441","content":"bc843d59"},"/docs/2.0.0/development/components/requester-b17":{"__comp":"17896441","content":"c60c73ac"},"/docs/2.0.0/development/components/rtprelay-816":{"__comp":"17896441","content":"144994e6"},"/docs/2.0.0/development/components/simpleauth-141":{"__comp":"17896441","content":"210b7c69"},"/docs/2.0.0/development/custom-data-with-the-apiserver-9aa":{"__comp":"17896441","content":"3f9d54d1"},"/docs/2.0.0/development/development-mode-with-gitpod-503":{"__comp":"17896441","content":"ff3f7f2b"},"/docs/2.0.0/development/extending-the-ctl-aa9":{"__comp":"17896441","content":"a7c6e145"},"/docs/2.0.0/development/introduction-aca":{"__comp":"17896441","content":"6a8a88b7"},"/docs/2.0.0/development/metrics-events-logs-and-traces-523":{"__comp":"17896441","content":"54969ead"},"/docs/2.0.0/development/orchestration-with-docker-05f":{"__comp":"17896441","content":"1ad9bfe0"},"/docs/2.0.0/development/orchestration-with-kubernetes-694":{"__comp":"17896441","content":"21169ea0"},"/docs/2.0.0/development/quick-start-2f8":{"__comp":"17896441","content":"9fcefd11"},"/docs/2.0.0/development/testing-with-seet-771":{"__comp":"17896441","content":"4e3cbe94"},"/docs/2.0.0/faqs-72b":{"__comp":"17896441","content":"1ffdd7de"},"/docs/2.0.0/overview/architecture-455":{"__comp":"17896441","content":"d72ac48e"},"/docs/2.0.0/overview/concepts-482":{"__comp":"17896441","content":"118e913f"},"/docs/2.0.0/overview/deploy-with-docker-3ac":{"__comp":"17896441","content":"06896101"},"/docs/2.0.0/overview/introduction-8f9":{"__comp":"17896441","content":"8d7e75fb"},"/docs/2.0.0/tutorials/deploying-to-civo-with-helm-4df":{"__comp":"17896441","content":"5a510007"},"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser-502":{"__comp":"17896441","content":"c2ef5137"},"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes-450":{"__comp":"17896441","content":"1a1a9e3d"},"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr-b1f":{"__comp":"17896441","content":"db70960d"},"/-fcb":{"__comp":"c4f5d8e4","__context":{"plugin":"0abf3980"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.ae0b9811.js b/assets/js/main.ae0b9811.js new file mode 100644 index 000000000..d61857251 --- /dev/null +++ b/assets/js/main.ae0b9811.js @@ -0,0 +1,2 @@ +/*! For license information please see main.ae0b9811.js.LICENSE.txt */ +(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[8792],{9188:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(6540);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"017ddd06":[()=>n.e(9845).then(n.bind(n,3731)),"@site/versioned_docs/version-1.x.x/configuration/users.md",3731],"02617853":[()=>n.e(3191).then(n.bind(n,6163)),"@site/docs/development/components/dispatcher.md",6163],"0457fa99":[()=>n.e(1238).then(n.bind(n,4718)),"@site/versioned_docs/version-2.0.0/overview/deploy-with-docker.md",4718],"06896101":[()=>n.e(3738).then(n.bind(n,9588)),"@site/docs/overview/deploy-with-docker.md",9588],"093b4e4f":[()=>n.e(4714).then(n.bind(n,2122)),"@site/versioned_docs/version-1.x.x/administration/webconsole.md",2122],"09b719bb":[()=>n.e(6541).then(n.bind(n,3389)),"@site/versioned_docs/version-1.x.x/guides/routr-as-asterisk-frontend.md",3389],"09d90b28":[()=>n.e(8563).then(n.bind(n,1151)),"@site/versioned_docs/version-2.0.0/development/components/registry.md",1151],"0d48220f":[()=>n.e(9825).then(n.bind(n,5992)),"@site/versioned_docs/version-2.0.0/connect/introduction.md",5992],"0f2bd920":[()=>n.e(2506).then(n.bind(n,1741)),"@site/versioned_docs/version-1.x.x/api/location/list.md",1741],"118e913f":[()=>n.e(1).then(n.bind(n,8408)),"@site/docs/overview/concepts.md",8408],"129db88c":[()=>n.e(2692).then(n.bind(n,2469)),"@site/docs/connect/webrtc-support.md",2469],"144994e6":[()=>n.e(1171).then(n.bind(n,1689)),"@site/docs/development/components/rtprelay.md",1689],"157aa7fa":[()=>n.e(1922).then(n.bind(n,64)),"@site/versioned_docs/version-2.0.0/connect/command-line/ctl.md",64],17896441:[()=>Promise.all([n.e(1869),n.e(8401)]).then(n.bind(n,5150)),"@theme/DocItem",5150],"19dd4331":[()=>n.e(4126).then(n.bind(n,3723)),"@site/versioned_docs/version-1.x.x/api/agents/update.md",3723],"1a1a9e3d":[()=>n.e(8512).then(n.bind(n,215)),"@site/docs/tutorials/intercom-system-with-routr-and-kubernetes.md",215],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,2672)),"@theme/SearchPage",2672],"1a5391ac":[()=>n.e(9795).then(n.bind(n,3113)),"@site/versioned_docs/version-2.0.0/development/components/apiserver.md",3113],"1ad9bfe0":[()=>n.e(3383).then(n.bind(n,9760)),"@site/docs/development/orchestration-with-docker.md",9760],"1b166456":[()=>n.e(208).then(n.bind(n,7499)),"@site/versioned_docs/version-1.x.x/api/sys/info.md",7499],"1b36d84b":[()=>n.e(751).then(n.bind(n,4754)),"@site/versioned_docs/version-2.0.0/development/orchestration-with-docker.md",4754],"1caae7f3":[()=>n.e(5188).then(n.bind(n,2214)),"@site/versioned_docs/version-2.0.0/tutorials/load-balancing-asterisk-with-routr.md",2214],"1cd31f12":[()=>n.e(5056).then(n.bind(n,1597)),"@site/versioned_docs/version-1.x.x/api/agents/delete.md",1597],"1da39e10":[()=>n.e(6593).then(n.bind(n,3473)),"@site/versioned_docs/version-2.0.0/development/alterations/overview.md",3473],"1ea220c7":[()=>n.e(6792).then(n.bind(n,9952)),"@site/versioned_docs/version-1.x.x/guides/running-on-kubernetes.md",9952],"1ffdd7de":[()=>n.e(7782).then(n.bind(n,5888)),"@site/docs/faqs.md",5888],"210b7c69":[()=>n.e(1703).then(n.bind(n,5054)),"@site/docs/development/components/simpleauth.md",5054],"21169ea0":[()=>n.e(9504).then(n.bind(n,4640)),"@site/docs/development/orchestration-with-kubernetes.md",4640],"23efd64d":[()=>n.e(7225).then(n.bind(n,6152)),"@site/versioned_docs/version-1.x.x/guides/running-with-docker-or-compose.md",6152],"26da1a01":[()=>n.e(2401).then(n.bind(n,4769)),"@site/docs/development/building-a-scaip-processor.md",4769],"295fe310":[()=>n.e(242).then(n.bind(n,1393)),"@site/versioned_docs/version-2.0.0/tutorials/intercom-system-with-routr-and-kubernetes.md",1393],"2a36568f":[()=>n.e(2964).then(n.bind(n,2860)),"@site/docs/connect/home-or-office-setup.md",2860],"321dfeeb":[()=>n.e(537).then(n.bind(n,7142)),"@site/versioned_docs/version-1.x.x/api/overview.md",7142],"3325c53c":[()=>n.e(6944).then(n.bind(n,579)),"@site/versioned_docs/version-1.x.x/introduction/installation.md",579],"335fd65a":[()=>n.e(3452).then(n.bind(n,6e3)),"@site/versioned_docs/version-2.0.0/development/components/simpleauth.md",6e3],"33664cb1":[()=>n.e(9953).then(n.bind(n,7904)),"@site/docs/development/components/edgeport.md",7904],"35bee977":[()=>n.e(1304).then(n.bind(n,229)),"@site/versioned_docs/version-1.x.x/concepts.md",229],"39d73575":[()=>n.e(1780).then(n.bind(n,5352)),"@site/docs/development/alterations/methods.md",5352],"3a673d53":[()=>n.e(831).then(n.bind(n,8719)),"@site/versioned_docs/version-1.x.x/introduction/roadmap.md",8719],"3c0cfdd0":[()=>n.e(4480).then(n.bind(n,6597)),"@site/docs/connect/quick-start/kubernetes.md",6597],"3d1fe28c":[()=>n.e(2918).then(n.bind(n,5448)),"@site/versioned_docs/version-2.0.0/development/building-a-middleware.md",5448],"3e7ceef0":[()=>n.e(5613).then(n.bind(n,3507)),"@site/versioned_docs/version-1.x.x/configuration/general.md",3507],"3f9d54d1":[()=>n.e(2333).then(n.bind(n,1282)),"@site/docs/development/custom-data-with-the-apiserver.md",1282],"40f2a0b4":[()=>n.e(6926).then(n.bind(n,598)),"@site/versioned_docs/version-1.x.x/api/gateways/delete.md",598],"40f2f3c6":[()=>n.e(8353).then(n.bind(n,3688)),"@site/versioned_docs/version-1.x.x/api/domains/delete.md",3688],"411db075":[()=>n.e(8535).then(n.bind(n,6651)),"@site/versioned_docs/version-1.x.x/api/peers/create.md",6651],"43d3d555":[()=>n.e(3624).then(n.bind(n,6671)),"@site/docs/connect/nodesdk/sdk.md",6671],"4591c4c7":[()=>n.e(5315).then(n.bind(n,9011)),"@site/versioned_docs/version-2.0.0/connect/quick-start/kubernetes.md",9011],"4d0c799d":[()=>n.e(823).then(n.bind(n,8949)),"@site/versioned_docs/version-1.x.x/api/numbers/delete.md",8949],"4d54d076":[()=>n.e(1459).then(n.bind(n,913)),"@site/docs/contributing.md",913],"4dcd5895":[()=>n.e(6615).then(n.bind(n,243)),"@site/versioned_docs/version-1.x.x/api/numbers/update.md",243],"4e27cd47":[()=>n.e(8253).then(n.bind(n,5977)),"@site/versioned_docs/version-1.x.x/api/location/create.md",5977],"4e3cbe94":[()=>n.e(6692).then(n.bind(n,5980)),"@site/docs/development/testing-with-seet.md",5980],"4e8389ca":[()=>n.e(9884).then(n.bind(n,5547)),"@site/versioned_docs/version-2.0.0/development/components/overview.md",5547],"4f841ba9":[()=>n.e(7326).then(n.bind(n,5591)),"@site/versioned_docs/version-2.0.0/connect/quick-start/docker.md",5591],"54969ead":[()=>n.e(364).then(n.bind(n,4791)),"@site/docs/development/metrics-events-logs-and-traces.md",4791],"5514a4b8":[()=>n.e(583).then(n.bind(n,1658)),"@site/versioned_docs/version-1.x.x/administration/cli/installation.md",1658],"5816b036":[()=>n.e(4860).then(n.t.bind(n,5028,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-2-11-5-270.json",5028],"5a1924d4":[()=>n.e(2433).then(n.bind(n,5939)),"@site/docs/connect/concepts.md",5939],"5a510007":[()=>n.e(9012).then(n.bind(n,5584)),"@site/docs/tutorials/deploying-to-civo-with-helm.md",5584],"5e82a060":[()=>n.e(6038).then(n.bind(n,2485)),"@site/versioned_docs/version-1.x.x/api/gateways/list.md",2485],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ef0e9d6":[()=>n.e(911).then(n.bind(n,5548)),"@site/docs/community.md",5548],"5f06ffd7":[()=>n.e(391).then(n.t.bind(n,3744,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-2-0-0-e63.json",3744],"638e7455":[()=>n.e(1071).then(n.bind(n,4615)),"@site/versioned_docs/version-2.0.0/development/development-mode-with-gitpod.md",4615],"63bd238e":[()=>n.e(2512).then(n.bind(n,3548)),"@site/versioned_docs/version-2.0.0/development/components/requester.md",3548],"64332b0f":[()=>n.e(8329).then(n.bind(n,46)),"@site/versioned_docs/version-1.x.x/welcome.md",46],"646468fb":[()=>n.e(821).then(n.bind(n,5934)),"@site/versioned_docs/version-1.x.x/api/location/delete.md",5934],"656951a7":[()=>n.e(5009).then(n.bind(n,3428)),"@site/versioned_docs/version-1.x.x/api/token.md",3428],"67679d6c":[()=>n.e(4133).then(n.bind(n,6353)),"@site/versioned_docs/version-2.0.0/development/metrics-events-logs-and-traces.md",6353],"6a8a88b7":[()=>n.e(3244).then(n.bind(n,9967)),"@site/docs/development/introduction.md",9967],"6c14cd7d":[()=>n.e(6341).then(n.bind(n,6446)),"@site/versioned_docs/version-1.x.x/api/numbers/list.md",6446],"6c35bbce":[()=>n.e(4862).then(n.bind(n,5814)),"@site/versioned_docs/version-1.x.x/api/agents/list.md",5814],"6e2907e5":[()=>n.e(4366).then(n.bind(n,6384)),"@site/versioned_docs/version-1.x.x/api/sys/logs.md",6384],"6e84f360":[()=>n.e(5719).then(n.bind(n,4275)),"@site/versioned_docs/version-2.0.0/contributing.md",4275],"6e8a13e2":[()=>n.e(7176).then(n.t.bind(n,365,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-1-x-x-be9.json",365],71153375:[()=>n.e(8911).then(n.bind(n,3796)),"@site/versioned_docs/version-1.x.x/api/config/get.md",3796],"72607e62":[()=>n.e(9042).then(n.bind(n,8330)),"@site/versioned_docs/version-1.x.x/api/registry.md",8330],"738c2db3":[()=>n.e(4161).then(n.bind(n,2222)),"@site/versioned_docs/version-2.0.0/connect/command-line/overview.md",2222],"759bfbe1":[()=>n.e(1080).then(n.bind(n,451)),"@site/versioned_docs/version-1.x.x/introduction/test-plan.md",451],"76273f75":[()=>n.e(3578).then(n.bind(n,7422)),"@site/docs/development/components/overview.md",7422],"7a552015":[()=>n.e(2913).then(n.bind(n,210)),"@site/versioned_docs/version-2.0.0/development/components/edgeport.md",210],"7b98d5f9":[()=>n.e(4013).then(n.bind(n,5113)),"@site/versioned_docs/version-2.0.0/changelog.md",5113],"7c32d245":[()=>n.e(529).then(n.bind(n,5475)),"@site/versioned_docs/version-1.x.x/introduction/performance-tests/user-location.md",5475],"7cf72cd4":[()=>n.e(8937).then(n.bind(n,7047)),"@site/docs/development/components/apiserver.md",7047],"7df8ae3f":[()=>n.e(2405).then(n.bind(n,1751)),"@site/versioned_docs/version-1.x.x/api/status/update.md",1751],"7efb1a82":[()=>n.e(767).then(n.bind(n,6385)),"@site/versioned_docs/version-1.x.x/configuration/numbers.md",6385],"80948d28":[()=>n.e(5066).then(n.bind(n,6910)),"@site/versioned_docs/version-2.0.0/development/alterations/methods.md",6910],"80d7fb78":[()=>n.e(7305).then(n.bind(n,9447)),"@site/versioned_docs/version-2.0.0/development/components/location.md",9447],"81e5f1d0":[()=>n.e(9583).then(n.bind(n,650)),"@site/versioned_docs/version-1.x.x/configuration/domains.md",650],"8613bfde":[()=>n.e(3296).then(n.bind(n,7020)),"@site/docs/connect/sending-call-events-to-nats.md",7020],"876e022a":[()=>n.e(1214).then(n.bind(n,8972)),"@site/versioned_docs/version-1.x.x/configuration/gateways.md",8972],"8a5aafb8":[()=>n.e(6531).then(n.bind(n,8039)),"@site/versioned_docs/version-2.0.0/development/extending-the-ctl.md",8039],"8a9effda":[()=>n.e(3741).then(n.bind(n,9499)),"@site/versioned_docs/version-1.x.x/api/domains/list.md",9499],"8ac6f1f4":[()=>n.e(620).then(n.bind(n,164)),"@site/docs/connect/nodesdk/overview.md",164],"8d7e75fb":[()=>n.e(4719).then(n.bind(n,1453)),"@site/docs/overview/introduction.md",1453],"918bfdcb":[()=>n.e(1870).then(n.bind(n,5103)),"@site/versioned_docs/version-1.x.x/introduction/glossary.md",5103],"921a01ce":[()=>n.e(4101).then(n.bind(n,1599)),"@site/versioned_docs/version-2.0.0/development/building-a-scaip-processor.md",1599],"92394f36":[()=>n.e(8847).then(n.bind(n,6783)),"@site/versioned_docs/version-2.0.0/development/components/rtprelay.md",6783],"92a92b88":[()=>n.e(7940).then(n.bind(n,8304)),"@site/docs/development/building-a-processor.md",8304],"943e77c3":[()=>n.e(1224).then(n.bind(n,1585)),"@site/versioned_docs/version-1.x.x/api/gateways/create.md",1585],"95069fb2":[()=>n.e(2358).then(n.bind(n,2026)),"@site/versioned_docs/version-1.x.x/api/peers/update.md",2026],"956a4ea6":[()=>n.e(4050).then(n.bind(n,874)),"@site/docs/development/building-a-middleware.md",874],"9799683e":[()=>n.e(6695).then(n.bind(n,7432)),"@site/versioned_docs/version-1.x.x/api/status/get.md",7432],"97b3c809":[()=>n.e(5366).then(n.bind(n,3872)),"@site/versioned_docs/version-2.0.0/development/custom-data-with-the-apiserver.md",3872],"9840208a":[()=>n.e(8167).then(n.bind(n,1206)),"@site/versioned_docs/version-1.x.x/api/agents/create.md",1206],"99054fd6":[()=>n.e(5912).then(n.bind(n,3791)),"@site/versioned_docs/version-2.0.0/connect/webrtc-support.md",3791],"99333fd2":[()=>n.e(898).then(n.bind(n,1603)),"@site/versioned_docs/version-2.0.0/development/quick-start.md",1603],"99f83bea":[()=>n.e(4682).then(n.bind(n,8510)),"@site/versioned_docs/version-1.x.x/api/numbers/create.md",8510],"9a4dfeaa":[()=>n.e(7408).then(n.bind(n,1267)),"@site/versioned_docs/version-1.x.x/api/peers/get.md",1267],"9a5a69d5":[()=>n.e(7337).then(n.bind(n,9352)),"@site/versioned_docs/version-1.x.x/api/gateways/update.md",9352],"9a5b155b":[()=>n.e(9515).then(n.bind(n,2204)),"@site/versioned_docs/version-2.0.0/overview/architecture.md",2204],"9bac311e":[()=>n.e(2172).then(n.bind(n,4533)),"@site/versioned_docs/version-2.0.0/connect/concepts.md",4533],"9beb87c2":[()=>n.e(3539).then(n.bind(n,5851)),"@site/docs/changelog.md",5851],"9d10a623":[()=>n.e(9955).then(n.bind(n,4595)),"@site/versioned_docs/version-1.x.x/api/domains/create.md",4595],"9fcefd11":[()=>n.e(3102).then(n.bind(n,4833)),"@site/docs/development/quick-start.md",4833],a0c4fcbf:[()=>n.e(468).then(n.bind(n,1431)),"@site/versioned_docs/version-2.0.0/overview/introduction.md",1431],a1c2ddfb:[()=>n.e(3094).then(n.bind(n,2986)),"@site/versioned_docs/version-2.0.0/connect/home-or-office-setup.md",2986],a30498ab:[()=>n.e(3857).then(n.bind(n,4193)),"@site/versioned_docs/version-1.x.x/configuration/agents.md",4193],a3b8e457:[()=>n.e(8998).then(n.bind(n,3390)),"@site/versioned_docs/version-2.0.0/development/orchestration-with-kubernetes.md",3390],a40a3312:[()=>n.e(9922).then(n.bind(n,5891)),"@site/versioned_docs/version-1.x.x/introduction/faq.md",5891],a4cb0559:[()=>n.e(9188).then(n.bind(n,3280)),"@site/versioned_docs/version-1.x.x/introduction/overview.md",3280],a552b93b:[()=>n.e(5872).then(n.bind(n,1472)),"@site/versioned_docs/version-1.x.x/api/peers/delete.md",1472],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a7c6e145:[()=>n.e(1079).then(n.bind(n,1429)),"@site/docs/development/extending-the-ctl.md",1429],a90f077e:[()=>n.e(9572).then(n.bind(n,8209)),"@site/versioned_docs/version-2.0.0/development/building-a-chat-application.md",8209],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],a9d63626:[()=>n.e(7372).then(n.bind(n,5469)),"@site/versioned_docs/version-1.x.x/guides/securing-the-signaling-path.md",5469],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],ac1de8bb:[()=>n.e(9423).then(n.bind(n,5778)),"@site/versioned_docs/version-2.0.0/connect/nodesdk/overview.md",5778],ae057106:[()=>n.e(5558).then(n.bind(n,9142)),"@site/versioned_docs/version-2.0.0/overview/concepts.md",9142],b1e2c3e5:[()=>n.e(1953).then(n.bind(n,6594)),"@site/versioned_docs/version-1.x.x/api/domains/update.md",6594],b396445b:[()=>n.e(4082).then(n.bind(n,3675)),"@site/docs/development/alterations/overview.md",3675],b3bbf2ca:[()=>n.e(8190).then(n.bind(n,4475)),"@site/docs/development/building-a-chat-application.md",4475],b4dd6982:[()=>n.e(8732).then(n.bind(n,8739)),"@site/versioned_docs/version-1.x.x/api/config/update.md",8739],b5de05fe:[()=>n.e(803).then(n.bind(n,3144)),"@site/versioned_docs/version-1.x.x/administration/cli/cheatsheet.md",3144],b7547532:[()=>n.e(9830).then(n.bind(n,4525)),"@site/versioned_docs/version-2.0.0/connect/nodesdk/sdk.md",4525],b8ab588d:[()=>n.e(5659).then(n.bind(n,9249)),"@site/versioned_docs/version-1.x.x/api/gateways/get.md",9249],bb373259:[()=>n.e(5804).then(n.bind(n,5254)),"@site/versioned_docs/version-1.x.x/introduction/comparison.md",5254],bc1a89ad:[()=>n.e(6346).then(n.bind(n,9251)),"@site/versioned_docs/version-1.x.x/administration/cli/remote-access.md",9251],bc2f9ced:[()=>n.e(5365).then(n.bind(n,5107)),"@site/versioned_docs/version-1.x.x/api/peers/list.md",5107],bc843d59:[()=>n.e(3797).then(n.bind(n,2257)),"@site/docs/development/components/registry.md",2257],c0ec735e:[()=>n.e(4306).then(n.bind(n,3096)),"@site/versioned_docs/version-2.0.0/tutorials/ephemeral-agents-in-the-browser.md",3096],c141421f:[()=>n.e(957).then(n.t.bind(n,936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",936],c2140537:[()=>n.e(2080).then(n.bind(n,7205)),"@site/versioned_docs/version-2.0.0/development/introduction.md",7205],c2ef5137:[()=>n.e(9465).then(n.bind(n,1026)),"@site/docs/tutorials/ephemeral-agents-in-the-browser.md",1026],c3b57956:[()=>n.e(1579).then(n.bind(n,1890)),"@site/versioned_docs/version-2.0.0/community.md",1890],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,192)),"@site/src/pages/index.js",192],c60c73ac:[()=>n.e(9537).then(n.bind(n,8134)),"@site/docs/development/components/requester.md",8134],c76972da:[()=>n.e(8644).then(n.bind(n,7750)),"@site/versioned_docs/version-2.0.0/faqs.md",7750],c9a0b018:[()=>n.e(2489).then(n.bind(n,5029)),"@site/versioned_docs/version-2.0.0/development/components/dispatcher.md",5029],ce58c4f8:[()=>n.e(5387).then(n.bind(n,5358)),"@site/versioned_docs/version-2.0.0/development/building-a-processor.md",5358],d3c35fce:[()=>n.e(2607).then(n.bind(n,219)),"@site/versioned_docs/version-1.x.x/api/domains/get.md",219],d72ac48e:[()=>n.e(7063).then(n.bind(n,3938)),"@site/docs/overview/architecture.md",3938],d7a9d534:[()=>n.e(286).then(n.bind(n,1098)),"@site/docs/connect/introduction.md",1098],da51cc8f:[()=>n.e(9692).then(n.bind(n,1820)),"@site/versioned_docs/version-1.x.x/guides/basic-setup.md",1820],db24a52a:[()=>n.e(6842).then(n.bind(n,8818)),"@site/versioned_docs/version-2.0.0/connect/securing-the-server.md",8818],db70960d:[()=>n.e(6549).then(n.bind(n,3736)),"@site/docs/tutorials/load-balancing-asterisk-with-routr.md",3736],e10372bb:[()=>n.e(49).then(n.bind(n,8106)),"@site/versioned_docs/version-1.x.x/introduction/community.md",8106],ea5491a0:[()=>n.e(4011).then(n.bind(n,8236)),"@site/docs/connect/command-line/overview.md",8236],ec64d50d:[()=>n.e(9900).then(n.bind(n,588)),"@site/versioned_docs/version-1.x.x/api/agents/get.md",588],ed175a37:[()=>n.e(4236).then(n.bind(n,5306)),"@site/docs/connect/command-line/ctl.md",5306],ed519cbf:[()=>n.e(7638).then(n.bind(n,3316)),"@site/versioned_docs/version-1.x.x/api/numbers/get.md",3316],ee7973d9:[()=>n.e(2514).then(n.bind(n,4086)),"@site/versioned_docs/version-1.x.x/configuration/peers.md",4086],f0fdb5a0:[()=>n.e(4319).then(n.bind(n,6842)),"@site/versioned_docs/version-2.0.0/connect/sending-call-events-to-nats.md",6842],f1b4aa58:[()=>n.e(8755).then(n.bind(n,212)),"@site/docs/connect/securing-the-server.md",212],f3f39cc5:[()=>n.e(7387).then(n.bind(n,3107)),"@site/versioned_docs/version-1.x.x/introduction/media.md",3107],f4357d2a:[()=>n.e(6575).then(n.bind(n,2805)),"@site/docs/connect/quick-start/docker.md",2805],f5184ac4:[()=>n.e(6099).then(n.bind(n,2417)),"@site/docs/development/components/location.md",2417],fb8f7c97:[()=>n.e(3791).then(n.bind(n,3066)),"@site/versioned_docs/version-2.0.0/development/testing-with-seet.md",3066],fd5b422d:[()=>n.e(1616).then(n.bind(n,8162)),"@site/versioned_docs/version-2.0.0/tutorials/deploying-to-civo-with-helm.md",8162],ff3f7f2b:[()=>n.e(6903).then(n.bind(n,8997)),"@site/docs/development/development-mode-with-gitpod.md",8997]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/search",component:d("/search","5de"),exact:!0},{path:"/docs",component:d("/docs","c22"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","208"),routes:[{path:"/docs/1.x.x",component:d("/docs/1.x.x","12a"),routes:[{path:"/docs/1.x.x/administration/cli/cheatsheet",component:d("/docs/1.x.x/administration/cli/cheatsheet","c34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/installation",component:d("/docs/1.x.x/administration/cli/installation","e9c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/cli/remote-access",component:d("/docs/1.x.x/administration/cli/remote-access","e05"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/administration/webconsole",component:d("/docs/1.x.x/administration/webconsole","4eb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/create",component:d("/docs/1.x.x/api/agents/create","e17"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/delete",component:d("/docs/1.x.x/api/agents/delete","a85"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/get",component:d("/docs/1.x.x/api/agents/get","8fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/list",component:d("/docs/1.x.x/api/agents/list","36b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/agents/update",component:d("/docs/1.x.x/api/agents/update","412"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/get",component:d("/docs/1.x.x/api/config/get","17e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/config/update",component:d("/docs/1.x.x/api/config/update","cd2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/create",component:d("/docs/1.x.x/api/domains/create","812"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/delete",component:d("/docs/1.x.x/api/domains/delete","590"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/get",component:d("/docs/1.x.x/api/domains/get","5d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/list",component:d("/docs/1.x.x/api/domains/list","728"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/domains/update",component:d("/docs/1.x.x/api/domains/update","92e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/create",component:d("/docs/1.x.x/api/gateways/create","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/delete",component:d("/docs/1.x.x/api/gateways/delete","801"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/get",component:d("/docs/1.x.x/api/gateways/get","869"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/list",component:d("/docs/1.x.x/api/gateways/list","fda"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/gateways/update",component:d("/docs/1.x.x/api/gateways/update","c13"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/create",component:d("/docs/1.x.x/api/location/create","095"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/delete",component:d("/docs/1.x.x/api/location/delete","f70"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/location/list",component:d("/docs/1.x.x/api/location/list","c04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/create",component:d("/docs/1.x.x/api/numbers/create","41c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/delete",component:d("/docs/1.x.x/api/numbers/delete","630"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/get",component:d("/docs/1.x.x/api/numbers/get","eb2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/list",component:d("/docs/1.x.x/api/numbers/list","156"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/numbers/update",component:d("/docs/1.x.x/api/numbers/update","363"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/overview",component:d("/docs/1.x.x/api/overview","b1f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/create",component:d("/docs/1.x.x/api/peers/create","2a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/delete",component:d("/docs/1.x.x/api/peers/delete","c5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/get",component:d("/docs/1.x.x/api/peers/get","c96"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/list",component:d("/docs/1.x.x/api/peers/list","5a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/peers/update",component:d("/docs/1.x.x/api/peers/update","630"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/registry",component:d("/docs/1.x.x/api/registry","cac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/get",component:d("/docs/1.x.x/api/status/get","7cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/status/update",component:d("/docs/1.x.x/api/status/update","b46"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/info",component:d("/docs/1.x.x/api/sys/info","885"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/sys/logs",component:d("/docs/1.x.x/api/sys/logs","630"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/api/token",component:d("/docs/1.x.x/api/token","c10"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/concepts",component:d("/docs/1.x.x/concepts","a03"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/agents",component:d("/docs/1.x.x/configuration/agents","6dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/domains",component:d("/docs/1.x.x/configuration/domains","c64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/gateways",component:d("/docs/1.x.x/configuration/gateways","86e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/general",component:d("/docs/1.x.x/configuration/general","c35"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/numbers",component:d("/docs/1.x.x/configuration/numbers","439"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/peers",component:d("/docs/1.x.x/configuration/peers","4b1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/configuration/users",component:d("/docs/1.x.x/configuration/users","afb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/basic-setup",component:d("/docs/1.x.x/guides/basic-setup","3d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/routr-as-asterisk-frontend",component:d("/docs/1.x.x/guides/routr-as-asterisk-frontend","7d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-on-kubernetes",component:d("/docs/1.x.x/guides/running-on-kubernetes","eee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/running-with-docker-or-compose",component:d("/docs/1.x.x/guides/running-with-docker-or-compose","770"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/guides/securing-the-signaling-path",component:d("/docs/1.x.x/guides/securing-the-signaling-path","734"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/community",component:d("/docs/1.x.x/introduction/community","ed0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/comparison",component:d("/docs/1.x.x/introduction/comparison","b2f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/faq",component:d("/docs/1.x.x/introduction/faq","ecc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/glossary",component:d("/docs/1.x.x/introduction/glossary","831"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/installation",component:d("/docs/1.x.x/introduction/installation","425"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/media",component:d("/docs/1.x.x/introduction/media","f80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/overview",component:d("/docs/1.x.x/introduction/overview","f6c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/performance-tests/user-location",component:d("/docs/1.x.x/introduction/performance-tests/user-location","09d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/roadmap",component:d("/docs/1.x.x/introduction/roadmap","0a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/introduction/test-plan",component:d("/docs/1.x.x/introduction/test-plan","9f3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/1.x.x/welcome",component:d("/docs/1.x.x/welcome","3fa"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/2.0.0",component:d("/docs/2.0.0","5a6"),routes:[{path:"/docs/2.0.0",component:d("/docs/2.0.0","cd5"),routes:[{path:"/docs/2.0.0/changelog",component:d("/docs/2.0.0/changelog","159"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/community",component:d("/docs/2.0.0/community","94e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/ctl",component:d("/docs/2.0.0/connect/command-line/ctl","fd9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/command-line/overview",component:d("/docs/2.0.0/connect/command-line/overview","d4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/concepts",component:d("/docs/2.0.0/connect/concepts","2db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/home-or-office-setup",component:d("/docs/2.0.0/connect/home-or-office-setup","be1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/introduction",component:d("/docs/2.0.0/connect/introduction","ffc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/overview",component:d("/docs/2.0.0/connect/nodesdk/overview","593"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/nodesdk/sdk",component:d("/docs/2.0.0/connect/nodesdk/sdk","46a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/docker",component:d("/docs/2.0.0/connect/quick-start/docker","abd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/quick-start/kubernetes",component:d("/docs/2.0.0/connect/quick-start/kubernetes","716"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/securing-the-server",component:d("/docs/2.0.0/connect/securing-the-server","421"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/sending-call-events-to-nats",component:d("/docs/2.0.0/connect/sending-call-events-to-nats","984"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/connect/webrtc-support",component:d("/docs/2.0.0/connect/webrtc-support","c64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/contributing",component:d("/docs/2.0.0/contributing","f1d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/methods",component:d("/docs/2.0.0/development/alterations/methods","ac2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/alterations/overview",component:d("/docs/2.0.0/development/alterations/overview","3be"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-chat-application",component:d("/docs/2.0.0/development/building-a-chat-application","c00"),exact:!0},{path:"/docs/2.0.0/development/building-a-middleware",component:d("/docs/2.0.0/development/building-a-middleware","e86"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-processor",component:d("/docs/2.0.0/development/building-a-processor","884"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/building-a-scaip-processor",component:d("/docs/2.0.0/development/building-a-scaip-processor","073"),exact:!0},{path:"/docs/2.0.0/development/components/apiserver",component:d("/docs/2.0.0/development/components/apiserver","d0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/dispatcher",component:d("/docs/2.0.0/development/components/dispatcher","9e9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/edgeport",component:d("/docs/2.0.0/development/components/edgeport","176"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/location",component:d("/docs/2.0.0/development/components/location","830"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/overview",component:d("/docs/2.0.0/development/components/overview","a9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/registry",component:d("/docs/2.0.0/development/components/registry","5b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/requester",component:d("/docs/2.0.0/development/components/requester","659"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/rtprelay",component:d("/docs/2.0.0/development/components/rtprelay","85f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/components/simpleauth",component:d("/docs/2.0.0/development/components/simpleauth","e74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/custom-data-with-the-apiserver",component:d("/docs/2.0.0/development/custom-data-with-the-apiserver","352"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/development-mode-with-gitpod",component:d("/docs/2.0.0/development/development-mode-with-gitpod","733"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/extending-the-ctl",component:d("/docs/2.0.0/development/extending-the-ctl","a5d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/introduction",component:d("/docs/2.0.0/development/introduction","eb8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/metrics-events-logs-and-traces",component:d("/docs/2.0.0/development/metrics-events-logs-and-traces","849"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-docker",component:d("/docs/2.0.0/development/orchestration-with-docker","3cd"),exact:!0},{path:"/docs/2.0.0/development/orchestration-with-kubernetes",component:d("/docs/2.0.0/development/orchestration-with-kubernetes","707"),exact:!0},{path:"/docs/2.0.0/development/quick-start",component:d("/docs/2.0.0/development/quick-start","e66"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/development/testing-with-seet",component:d("/docs/2.0.0/development/testing-with-seet","3d3"),exact:!0},{path:"/docs/2.0.0/faqs",component:d("/docs/2.0.0/faqs","848"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/architecture",component:d("/docs/2.0.0/overview/architecture","842"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/concepts",component:d("/docs/2.0.0/overview/concepts","6ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/deploy-with-docker",component:d("/docs/2.0.0/overview/deploy-with-docker","940"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/overview/introduction",component:d("/docs/2.0.0/overview/introduction","63f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.0.0/tutorials/deploying-to-civo-with-helm",component:d("/docs/2.0.0/tutorials/deploying-to-civo-with-helm","20c"),exact:!0},{path:"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser",component:d("/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser","5c4"),exact:!0},{path:"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes",component:d("/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes","741"),exact:!0},{path:"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr",component:d("/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr","28d"),exact:!0}]}]},{path:"/docs/2.11.5",component:d("/docs/2.11.5","eea"),routes:[{path:"/docs/2.11.5",component:d("/docs/2.11.5","43c"),routes:[{path:"/docs/2.11.5/changelog",component:d("/docs/2.11.5/changelog","cd7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/community",component:d("/docs/2.11.5/community","2eb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/command-line/ctl",component:d("/docs/2.11.5/connect/command-line/ctl","c09"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/command-line/overview",component:d("/docs/2.11.5/connect/command-line/overview","fb8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/concepts",component:d("/docs/2.11.5/connect/concepts","55e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/home-or-office-setup",component:d("/docs/2.11.5/connect/home-or-office-setup","e01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/introduction",component:d("/docs/2.11.5/connect/introduction","550"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/nodesdk/overview",component:d("/docs/2.11.5/connect/nodesdk/overview","7f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/nodesdk/sdk",component:d("/docs/2.11.5/connect/nodesdk/sdk","52d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/quick-start/docker",component:d("/docs/2.11.5/connect/quick-start/docker","6fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/quick-start/kubernetes",component:d("/docs/2.11.5/connect/quick-start/kubernetes","fe1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/securing-the-server",component:d("/docs/2.11.5/connect/securing-the-server","789"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/sending-call-events-to-nats",component:d("/docs/2.11.5/connect/sending-call-events-to-nats","535"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/connect/webrtc-support",component:d("/docs/2.11.5/connect/webrtc-support","bb2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/contributing",component:d("/docs/2.11.5/contributing","926"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/alterations/methods",component:d("/docs/2.11.5/development/alterations/methods","be6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/alterations/overview",component:d("/docs/2.11.5/development/alterations/overview","e9e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/building-a-chat-application",component:d("/docs/2.11.5/development/building-a-chat-application","b05"),exact:!0},{path:"/docs/2.11.5/development/building-a-middleware",component:d("/docs/2.11.5/development/building-a-middleware","576"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/building-a-processor",component:d("/docs/2.11.5/development/building-a-processor","6b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/building-a-scaip-processor",component:d("/docs/2.11.5/development/building-a-scaip-processor","42b"),exact:!0},{path:"/docs/2.11.5/development/components/apiserver",component:d("/docs/2.11.5/development/components/apiserver","653"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/dispatcher",component:d("/docs/2.11.5/development/components/dispatcher","b3a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/edgeport",component:d("/docs/2.11.5/development/components/edgeport","fee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/location",component:d("/docs/2.11.5/development/components/location","908"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/overview",component:d("/docs/2.11.5/development/components/overview","bc8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/registry",component:d("/docs/2.11.5/development/components/registry","e95"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/requester",component:d("/docs/2.11.5/development/components/requester","cee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/rtprelay",component:d("/docs/2.11.5/development/components/rtprelay","993"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/components/simpleauth",component:d("/docs/2.11.5/development/components/simpleauth","6f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/custom-data-with-the-apiserver",component:d("/docs/2.11.5/development/custom-data-with-the-apiserver","c05"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/development-mode-with-gitpod",component:d("/docs/2.11.5/development/development-mode-with-gitpod","a94"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/extending-the-ctl",component:d("/docs/2.11.5/development/extending-the-ctl","afa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/introduction",component:d("/docs/2.11.5/development/introduction","b5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/metrics-events-logs-and-traces",component:d("/docs/2.11.5/development/metrics-events-logs-and-traces","ef0"),exact:!0},{path:"/docs/2.11.5/development/orchestration-with-docker",component:d("/docs/2.11.5/development/orchestration-with-docker","550"),exact:!0},{path:"/docs/2.11.5/development/orchestration-with-kubernetes",component:d("/docs/2.11.5/development/orchestration-with-kubernetes","b10"),exact:!0},{path:"/docs/2.11.5/development/quick-start",component:d("/docs/2.11.5/development/quick-start","a7f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/development/testing-with-seet",component:d("/docs/2.11.5/development/testing-with-seet","a57"),exact:!0},{path:"/docs/2.11.5/faqs",component:d("/docs/2.11.5/faqs","505"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/overview/architecture",component:d("/docs/2.11.5/overview/architecture","a98"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/overview/concepts",component:d("/docs/2.11.5/overview/concepts","ba9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/overview/deploy-with-docker",component:d("/docs/2.11.5/overview/deploy-with-docker","c61"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/overview/introduction",component:d("/docs/2.11.5/overview/introduction","754"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/2.11.5/tutorials/deploying-to-civo-with-helm",component:d("/docs/2.11.5/tutorials/deploying-to-civo-with-helm","891"),exact:!0},{path:"/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser",component:d("/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser","4ce"),exact:!0},{path:"/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes",component:d("/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes","488"),exact:!0},{path:"/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr",component:d("/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr","a86"),exact:!0}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(8193);const c=[n(1911),n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function m(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var h=n(5260),g=n(4586),b=n(6025),v=n(6342),y=n(9024),x=n(2131),w=n(4090),k=n(2967),S=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,x.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.applyTrailingSlash)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function T(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,v.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(y.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.A,{tag:k.Cy,locale:e}),(0,f.jsx)(h.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const A=new Map;var j=n(6125),R=n(6988),L=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(P,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${z}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${z}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function $(){const{siteConfig:{baseUrl:e}}=(0,g.A)();return(0,f.jsx)(f.Fragment,{children:!l.A.canUseDOM&&(0,f.jsx)(h.A,{children:(0,f.jsx)("script",{children:B(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,f.jsx)($,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,g.A)(),a=(0,b.Ay)(e),{htmlLang:i,direction:s}=o[r];return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("html",{lang:i,dir:s}),(0,f.jsx)("title",{children:t}),(0,f.jsx)("meta",{property:"og:title",content:t}),(0,f.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,f.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,f.jsx)("link",{rel:"icon",href:a})]})}var H=n(7489),G=n(2303);function V(){const e=(0,G.A)();return(0,f.jsx)(h.A,{children:(0,f.jsx)("html",{"data-has-hydrated":e})})}const W=(0,p.v)(u.A);function K(){const e=function(e){if(A.has(e.pathname))return{...e,pathname:A.get(e.pathname)};if((0,p.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(I,{location:e,children:W})}function Q(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(R.l,{children:(0,f.jsxs)(j.x,{children:[(0,f.jsxs)(m,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(T,{}),(0,f.jsx)(U,{}),(0,f.jsx)(K,{})]}),(0,f.jsx)(V,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),O(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(Q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};O(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"2.11.5","isLast":true,"path":"/docs/2.11.5","mainDocId":"overview/introduction","docs":[{"id":"changelog","path":"/docs/2.11.5/changelog","sidebar":"tutorialSidebar"},{"id":"community","path":"/docs/2.11.5/community","sidebar":"tutorialSidebar"},{"id":"connect/command-line/ctl","path":"/docs/2.11.5/connect/command-line/ctl","sidebar":"tutorialSidebar"},{"id":"connect/command-line/overview","path":"/docs/2.11.5/connect/command-line/overview","sidebar":"tutorialSidebar"},{"id":"connect/concepts","path":"/docs/2.11.5/connect/concepts","sidebar":"tutorialSidebar"},{"id":"connect/home-or-office-setup","path":"/docs/2.11.5/connect/home-or-office-setup","sidebar":"tutorialSidebar"},{"id":"connect/introduction","path":"/docs/2.11.5/connect/introduction","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/overview","path":"/docs/2.11.5/connect/nodesdk/overview","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/sdk","path":"/docs/2.11.5/connect/nodesdk/sdk","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/docker","path":"/docs/2.11.5/connect/quick-start/docker","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/kubernetes","path":"/docs/2.11.5/connect/quick-start/kubernetes","sidebar":"tutorialSidebar"},{"id":"connect/securing-the-server","path":"/docs/2.11.5/connect/securing-the-server","sidebar":"tutorialSidebar"},{"id":"connect/sending-call-events-to-nats","path":"/docs/2.11.5/connect/sending-call-events-to-nats","sidebar":"tutorialSidebar"},{"id":"connect/webrtc-support","path":"/docs/2.11.5/connect/webrtc-support","sidebar":"tutorialSidebar"},{"id":"contributing","path":"/docs/2.11.5/contributing","sidebar":"tutorialSidebar"},{"id":"development/alterations/methods","path":"/docs/2.11.5/development/alterations/methods","sidebar":"tutorialSidebar"},{"id":"development/alterations/overview","path":"/docs/2.11.5/development/alterations/overview","sidebar":"tutorialSidebar"},{"id":"development/building-a-chat-application","path":"/docs/2.11.5/development/building-a-chat-application"},{"id":"development/building-a-middleware","path":"/docs/2.11.5/development/building-a-middleware","sidebar":"tutorialSidebar"},{"id":"development/building-a-processor","path":"/docs/2.11.5/development/building-a-processor","sidebar":"tutorialSidebar"},{"id":"development/building-a-scaip-processor","path":"/docs/2.11.5/development/building-a-scaip-processor"},{"id":"development/components/apiserver","path":"/docs/2.11.5/development/components/apiserver","sidebar":"tutorialSidebar"},{"id":"development/components/dispatcher","path":"/docs/2.11.5/development/components/dispatcher","sidebar":"tutorialSidebar"},{"id":"development/components/edgeport","path":"/docs/2.11.5/development/components/edgeport","sidebar":"tutorialSidebar"},{"id":"development/components/location","path":"/docs/2.11.5/development/components/location","sidebar":"tutorialSidebar"},{"id":"development/components/overview","path":"/docs/2.11.5/development/components/overview","sidebar":"tutorialSidebar"},{"id":"development/components/registry","path":"/docs/2.11.5/development/components/registry","sidebar":"tutorialSidebar"},{"id":"development/components/requester","path":"/docs/2.11.5/development/components/requester","sidebar":"tutorialSidebar"},{"id":"development/components/rtprelay","path":"/docs/2.11.5/development/components/rtprelay","sidebar":"tutorialSidebar"},{"id":"development/components/simpleauth","path":"/docs/2.11.5/development/components/simpleauth","sidebar":"tutorialSidebar"},{"id":"development/custom-data-with-the-apiserver","path":"/docs/2.11.5/development/custom-data-with-the-apiserver","sidebar":"tutorialSidebar"},{"id":"development/development-mode-with-gitpod","path":"/docs/2.11.5/development/development-mode-with-gitpod","sidebar":"tutorialSidebar"},{"id":"development/extending-the-ctl","path":"/docs/2.11.5/development/extending-the-ctl","sidebar":"tutorialSidebar"},{"id":"development/introduction","path":"/docs/2.11.5/development/introduction","sidebar":"tutorialSidebar"},{"id":"development/metrics-events-logs-and-traces","path":"/docs/2.11.5/development/metrics-events-logs-and-traces"},{"id":"development/orchestration-with-docker","path":"/docs/2.11.5/development/orchestration-with-docker"},{"id":"development/orchestration-with-kubernetes","path":"/docs/2.11.5/development/orchestration-with-kubernetes"},{"id":"development/quick-start","path":"/docs/2.11.5/development/quick-start","sidebar":"tutorialSidebar"},{"id":"development/testing-with-seet","path":"/docs/2.11.5/development/testing-with-seet"},{"id":"faqs","path":"/docs/2.11.5/faqs","sidebar":"tutorialSidebar"},{"id":"overview/architecture","path":"/docs/2.11.5/overview/architecture","sidebar":"tutorialSidebar"},{"id":"overview/concepts","path":"/docs/2.11.5/overview/concepts","sidebar":"tutorialSidebar"},{"id":"overview/deploy-with-docker","path":"/docs/2.11.5/overview/deploy-with-docker","sidebar":"tutorialSidebar"},{"id":"overview/introduction","path":"/docs/2.11.5/overview/introduction","sidebar":"tutorialSidebar"},{"id":"tutorials/deploying-to-civo-with-helm","path":"/docs/2.11.5/tutorials/deploying-to-civo-with-helm"},{"id":"tutorials/ephemeral-agents-in-the-browser","path":"/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser"},{"id":"tutorials/intercom-system-with-routr-and-kubernetes","path":"/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes"},{"id":"tutorials/load-balancing-asterisk-with-routr","path":"/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/2.11.5/overview/introduction","label":"overview/introduction"}}}},{"name":"2.0.0","label":"2.0.0","isLast":false,"path":"/docs/2.0.0","mainDocId":"overview/introduction","docs":[{"id":"changelog","path":"/docs/2.0.0/changelog","sidebar":"tutorialSidebar"},{"id":"community","path":"/docs/2.0.0/community","sidebar":"tutorialSidebar"},{"id":"connect/command-line/ctl","path":"/docs/2.0.0/connect/command-line/ctl","sidebar":"tutorialSidebar"},{"id":"connect/command-line/overview","path":"/docs/2.0.0/connect/command-line/overview","sidebar":"tutorialSidebar"},{"id":"connect/concepts","path":"/docs/2.0.0/connect/concepts","sidebar":"tutorialSidebar"},{"id":"connect/home-or-office-setup","path":"/docs/2.0.0/connect/home-or-office-setup","sidebar":"tutorialSidebar"},{"id":"connect/introduction","path":"/docs/2.0.0/connect/introduction","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/overview","path":"/docs/2.0.0/connect/nodesdk/overview","sidebar":"tutorialSidebar"},{"id":"connect/nodesdk/sdk","path":"/docs/2.0.0/connect/nodesdk/sdk","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/docker","path":"/docs/2.0.0/connect/quick-start/docker","sidebar":"tutorialSidebar"},{"id":"connect/quick-start/kubernetes","path":"/docs/2.0.0/connect/quick-start/kubernetes","sidebar":"tutorialSidebar"},{"id":"connect/securing-the-server","path":"/docs/2.0.0/connect/securing-the-server","sidebar":"tutorialSidebar"},{"id":"connect/sending-call-events-to-nats","path":"/docs/2.0.0/connect/sending-call-events-to-nats","sidebar":"tutorialSidebar"},{"id":"connect/webrtc-support","path":"/docs/2.0.0/connect/webrtc-support","sidebar":"tutorialSidebar"},{"id":"contributing","path":"/docs/2.0.0/contributing","sidebar":"tutorialSidebar"},{"id":"development/alterations/methods","path":"/docs/2.0.0/development/alterations/methods","sidebar":"tutorialSidebar"},{"id":"development/alterations/overview","path":"/docs/2.0.0/development/alterations/overview","sidebar":"tutorialSidebar"},{"id":"development/building-a-chat-application","path":"/docs/2.0.0/development/building-a-chat-application"},{"id":"development/building-a-middleware","path":"/docs/2.0.0/development/building-a-middleware","sidebar":"tutorialSidebar"},{"id":"development/building-a-processor","path":"/docs/2.0.0/development/building-a-processor","sidebar":"tutorialSidebar"},{"id":"development/building-a-scaip-processor","path":"/docs/2.0.0/development/building-a-scaip-processor"},{"id":"development/components/apiserver","path":"/docs/2.0.0/development/components/apiserver","sidebar":"tutorialSidebar"},{"id":"development/components/dispatcher","path":"/docs/2.0.0/development/components/dispatcher","sidebar":"tutorialSidebar"},{"id":"development/components/edgeport","path":"/docs/2.0.0/development/components/edgeport","sidebar":"tutorialSidebar"},{"id":"development/components/location","path":"/docs/2.0.0/development/components/location","sidebar":"tutorialSidebar"},{"id":"development/components/overview","path":"/docs/2.0.0/development/components/overview","sidebar":"tutorialSidebar"},{"id":"development/components/registry","path":"/docs/2.0.0/development/components/registry","sidebar":"tutorialSidebar"},{"id":"development/components/requester","path":"/docs/2.0.0/development/components/requester","sidebar":"tutorialSidebar"},{"id":"development/components/rtprelay","path":"/docs/2.0.0/development/components/rtprelay","sidebar":"tutorialSidebar"},{"id":"development/components/simpleauth","path":"/docs/2.0.0/development/components/simpleauth","sidebar":"tutorialSidebar"},{"id":"development/custom-data-with-the-apiserver","path":"/docs/2.0.0/development/custom-data-with-the-apiserver","sidebar":"tutorialSidebar"},{"id":"development/development-mode-with-gitpod","path":"/docs/2.0.0/development/development-mode-with-gitpod","sidebar":"tutorialSidebar"},{"id":"development/extending-the-ctl","path":"/docs/2.0.0/development/extending-the-ctl","sidebar":"tutorialSidebar"},{"id":"development/introduction","path":"/docs/2.0.0/development/introduction","sidebar":"tutorialSidebar"},{"id":"development/metrics-events-logs-and-traces","path":"/docs/2.0.0/development/metrics-events-logs-and-traces"},{"id":"development/orchestration-with-docker","path":"/docs/2.0.0/development/orchestration-with-docker"},{"id":"development/orchestration-with-kubernetes","path":"/docs/2.0.0/development/orchestration-with-kubernetes"},{"id":"development/quick-start","path":"/docs/2.0.0/development/quick-start","sidebar":"tutorialSidebar"},{"id":"development/testing-with-seet","path":"/docs/2.0.0/development/testing-with-seet"},{"id":"faqs","path":"/docs/2.0.0/faqs","sidebar":"tutorialSidebar"},{"id":"overview/architecture","path":"/docs/2.0.0/overview/architecture","sidebar":"tutorialSidebar"},{"id":"overview/concepts","path":"/docs/2.0.0/overview/concepts","sidebar":"tutorialSidebar"},{"id":"overview/deploy-with-docker","path":"/docs/2.0.0/overview/deploy-with-docker","sidebar":"tutorialSidebar"},{"id":"overview/introduction","path":"/docs/2.0.0/overview/introduction","sidebar":"tutorialSidebar"},{"id":"tutorials/deploying-to-civo-with-helm","path":"/docs/2.0.0/tutorials/deploying-to-civo-with-helm"},{"id":"tutorials/ephemeral-agents-in-the-browser","path":"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser"},{"id":"tutorials/intercom-system-with-routr-and-kubernetes","path":"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes"},{"id":"tutorials/load-balancing-asterisk-with-routr","path":"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/2.0.0/overview/introduction","label":"overview/introduction"}}}},{"name":"1.x.x","label":"1.x.x","isLast":false,"path":"/docs/1.x.x","mainDocId":"welcome","docs":[{"id":"administration/cli/cheatsheet","path":"/docs/1.x.x/administration/cli/cheatsheet","sidebar":"tutorialSidebar"},{"id":"administration/cli/installation","path":"/docs/1.x.x/administration/cli/installation","sidebar":"tutorialSidebar"},{"id":"administration/cli/remote-access","path":"/docs/1.x.x/administration/cli/remote-access","sidebar":"tutorialSidebar"},{"id":"administration/webconsole","path":"/docs/1.x.x/administration/webconsole","sidebar":"tutorialSidebar"},{"id":"api/agents/create","path":"/docs/1.x.x/api/agents/create","sidebar":"tutorialSidebar"},{"id":"api/agents/delete","path":"/docs/1.x.x/api/agents/delete","sidebar":"tutorialSidebar"},{"id":"api/agents/get","path":"/docs/1.x.x/api/agents/get","sidebar":"tutorialSidebar"},{"id":"api/agents/list","path":"/docs/1.x.x/api/agents/list","sidebar":"tutorialSidebar"},{"id":"api/agents/update","path":"/docs/1.x.x/api/agents/update","sidebar":"tutorialSidebar"},{"id":"api/config/get","path":"/docs/1.x.x/api/config/get","sidebar":"tutorialSidebar"},{"id":"api/config/update","path":"/docs/1.x.x/api/config/update","sidebar":"tutorialSidebar"},{"id":"api/domains/create","path":"/docs/1.x.x/api/domains/create","sidebar":"tutorialSidebar"},{"id":"api/domains/delete","path":"/docs/1.x.x/api/domains/delete","sidebar":"tutorialSidebar"},{"id":"api/domains/get","path":"/docs/1.x.x/api/domains/get","sidebar":"tutorialSidebar"},{"id":"api/domains/list","path":"/docs/1.x.x/api/domains/list","sidebar":"tutorialSidebar"},{"id":"api/domains/update","path":"/docs/1.x.x/api/domains/update","sidebar":"tutorialSidebar"},{"id":"api/gateways/create","path":"/docs/1.x.x/api/gateways/create","sidebar":"tutorialSidebar"},{"id":"api/gateways/delete","path":"/docs/1.x.x/api/gateways/delete","sidebar":"tutorialSidebar"},{"id":"api/gateways/get","path":"/docs/1.x.x/api/gateways/get","sidebar":"tutorialSidebar"},{"id":"api/gateways/list","path":"/docs/1.x.x/api/gateways/list","sidebar":"tutorialSidebar"},{"id":"api/gateways/update","path":"/docs/1.x.x/api/gateways/update","sidebar":"tutorialSidebar"},{"id":"api/location/create","path":"/docs/1.x.x/api/location/create","sidebar":"tutorialSidebar"},{"id":"api/location/delete","path":"/docs/1.x.x/api/location/delete","sidebar":"tutorialSidebar"},{"id":"api/location/list","path":"/docs/1.x.x/api/location/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/create","path":"/docs/1.x.x/api/numbers/create","sidebar":"tutorialSidebar"},{"id":"api/numbers/delete","path":"/docs/1.x.x/api/numbers/delete","sidebar":"tutorialSidebar"},{"id":"api/numbers/get","path":"/docs/1.x.x/api/numbers/get","sidebar":"tutorialSidebar"},{"id":"api/numbers/list","path":"/docs/1.x.x/api/numbers/list","sidebar":"tutorialSidebar"},{"id":"api/numbers/update","path":"/docs/1.x.x/api/numbers/update","sidebar":"tutorialSidebar"},{"id":"api/overview","path":"/docs/1.x.x/api/overview","sidebar":"tutorialSidebar"},{"id":"api/peers/create","path":"/docs/1.x.x/api/peers/create","sidebar":"tutorialSidebar"},{"id":"api/peers/delete","path":"/docs/1.x.x/api/peers/delete","sidebar":"tutorialSidebar"},{"id":"api/peers/get","path":"/docs/1.x.x/api/peers/get","sidebar":"tutorialSidebar"},{"id":"api/peers/list","path":"/docs/1.x.x/api/peers/list","sidebar":"tutorialSidebar"},{"id":"api/peers/update","path":"/docs/1.x.x/api/peers/update","sidebar":"tutorialSidebar"},{"id":"api/registry","path":"/docs/1.x.x/api/registry","sidebar":"tutorialSidebar"},{"id":"api/status/get","path":"/docs/1.x.x/api/status/get","sidebar":"tutorialSidebar"},{"id":"api/status/update","path":"/docs/1.x.x/api/status/update","sidebar":"tutorialSidebar"},{"id":"api/sys/info","path":"/docs/1.x.x/api/sys/info","sidebar":"tutorialSidebar"},{"id":"api/sys/logs","path":"/docs/1.x.x/api/sys/logs","sidebar":"tutorialSidebar"},{"id":"api/token","path":"/docs/1.x.x/api/token","sidebar":"tutorialSidebar"},{"id":"concepts","path":"/docs/1.x.x/concepts","sidebar":"tutorialSidebar"},{"id":"configuration/agents","path":"/docs/1.x.x/configuration/agents","sidebar":"tutorialSidebar"},{"id":"configuration/domains","path":"/docs/1.x.x/configuration/domains","sidebar":"tutorialSidebar"},{"id":"configuration/gateways","path":"/docs/1.x.x/configuration/gateways","sidebar":"tutorialSidebar"},{"id":"configuration/general","path":"/docs/1.x.x/configuration/general","sidebar":"tutorialSidebar"},{"id":"configuration/numbers","path":"/docs/1.x.x/configuration/numbers","sidebar":"tutorialSidebar"},{"id":"configuration/peers","path":"/docs/1.x.x/configuration/peers","sidebar":"tutorialSidebar"},{"id":"configuration/users","path":"/docs/1.x.x/configuration/users","sidebar":"tutorialSidebar"},{"id":"guides/basic-setup","path":"/docs/1.x.x/guides/basic-setup","sidebar":"tutorialSidebar"},{"id":"guides/routr-as-asterisk-frontend","path":"/docs/1.x.x/guides/routr-as-asterisk-frontend","sidebar":"tutorialSidebar"},{"id":"guides/running-on-kubernetes","path":"/docs/1.x.x/guides/running-on-kubernetes","sidebar":"tutorialSidebar"},{"id":"guides/running-with-docker-or-compose","path":"/docs/1.x.x/guides/running-with-docker-or-compose","sidebar":"tutorialSidebar"},{"id":"guides/securing-the-signaling-path","path":"/docs/1.x.x/guides/securing-the-signaling-path","sidebar":"tutorialSidebar"},{"id":"introduction/community","path":"/docs/1.x.x/introduction/community","sidebar":"tutorialSidebar"},{"id":"introduction/comparison","path":"/docs/1.x.x/introduction/comparison","sidebar":"tutorialSidebar"},{"id":"introduction/faq","path":"/docs/1.x.x/introduction/faq","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/docs/1.x.x/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/installation","path":"/docs/1.x.x/introduction/installation","sidebar":"tutorialSidebar"},{"id":"introduction/media","path":"/docs/1.x.x/introduction/media","sidebar":"tutorialSidebar"},{"id":"introduction/overview","path":"/docs/1.x.x/introduction/overview","sidebar":"tutorialSidebar"},{"id":"introduction/performance-tests/user-location","path":"/docs/1.x.x/introduction/performance-tests/user-location","sidebar":"tutorialSidebar"},{"id":"introduction/roadmap","path":"/docs/1.x.x/introduction/roadmap","sidebar":"tutorialSidebar"},{"id":"introduction/test-plan","path":"/docs/1.x.x/introduction/test-plan","sidebar":"tutorialSidebar"},{"id":"welcome","path":"/docs/1.x.x/welcome","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/1.x.x/welcome","label":"welcome"}}}}],"breadcrumbs":true}},"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-JX93S6PKN4"],"anonymizeIP":true,"id":"default"}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.4.0"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.4.0"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(9201),l=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(f,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:y}=(0,i.A)(),{trailingSlash:x,baseUrl:w}=y,k=y.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),_=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const T=(0,s.A)(C),A=C?.replace("pathname://","");let j=void 0!==A?(R=A,b&&(e=>e.startsWith("/"))(R)?S(R):R):void 0;var R;"hash"===k&&j?.startsWith("./")&&(j=j?.slice(1)),j&&T&&(j=(0,a.applyTrailingSlash)(j,{trailingSlash:x,baseUrl:w}));const L=(0,r.useRef)(!1),N=n?o.k2:o.N_,P=l.A.canUseIntersectionObserver,O=(0,r.useRef)(),D=()=>{L.current||null==j||(window.docusaurus.preload(j),L.current=!0)};(0,r.useEffect)((()=>(!P&&T&&null!=j&&window.docusaurus.prefetch(j),()=>{P&&O.current&&O.current.disconnect()})),[O,j,P,T]);const I=j?.startsWith("#")??!1,M=!v.target||"_self"===v.target,F=!j||!T||!M;return g||!I&&F||_.collectLink(j),v.id&&_.collectAnchor(v.id),F?(0,d.jsx)("a",{ref:E,href:j,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...v}):(0,d.jsx)(N,{...v,onMouseEnter:D,onTouchStart:D,innerRef:e=>{E.current=e,P&&e&&T&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),O.current.observe(e))},to:j,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>f,gk:()=>m,Gy:()=>d,HW:()=>v,ht:()=>p,r7:()=>g,jh:()=>h});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},1911:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(8181),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8215),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},9201:(e,t,n)=>{"use strict";n.d(t,{A:()=>Pt});var r=n(6540),o=n(8215),a=n(7489),i=n(9024),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const v={skipToContent:"skipToContent_fXgn"};function y(){return(0,u.jsx)(h,{className:v.skipToContent})}var x=n(6342),w=n(5041);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var j=n(2069),R=n(3104);var L=n(9532),N=n(5600);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,N.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,L.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(P);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(3465);function K(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654),ee=n(1252),te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ge,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ge,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(961);function ve(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(9188),xe=["translations"];function we(){return we=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},we.apply(this,arguments)}function ke(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(l){s=!0,o=l}finally{try{i||null==n.return||n.return()}finally{if(s)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Se(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Se(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _e(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ee="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=_e(e,xe),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=ke((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Ee))}),[]),r.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ye.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement(Te,{reactsToKey:d===Ee?Ee:"Meta"},d===Ee?r.createElement(ve,null):d),r.createElement(Te,{reactsToKey:"k"},"K"))))}));function Te(e){var t=e.reactsToKey,n=e.children,o=ke((0,r.useState)(!1),2),a=o[0],i=o[1];return(0,r.useEffect)((function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&i(!0)}function n(e){e.key!==t&&"Meta"!==e.key||i(!1)}}),[t]),r.createElement("kbd",{className:a?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}var Ae=n(5260),je=n(4255),Re=n(1062),Le=n(2967);const Ne={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Oe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function De(e){let{state:t,onClose:n}=e;const r=(0,je.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Ie(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.A)(),l=(0,Re.C)(),c=function(){const{locale:e,tags:t}=(0,Le.af)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,x]=(0,r.useState)(void 0),w=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(9462).then(n.bind(n,9462)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,8913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,416))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),k=(0,r.useCallback)((()=>{if(!h.current){const e=document.createElement("div");h.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),S=(0,r.useCallback)((()=>{k(),w().then((()=>v(!0)))}),[w,k]),_=(0,r.useCallback)((()=>{v(!1),g.current?.focus()}),[]),E=(0,r.useCallback)((e=>{e.preventDefault(),x(e.key),S()}),[S]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(o,t)?window.location.href=t:m.push(t)}}).current,T=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,A=(0,r.useMemo)((()=>e=>(0,u.jsx)(De,{...e,onClose:_})),[_]),j=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:b,onOpen:S,onClose:_,onInput:E,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ae.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:w,onFocus:w,onMouseOver:w,onClick:S,ref:g,translations:Ne.button}),b&&Pe&&h.current&&(0,be.createPortal)((0,u.jsx)(Pe,{onClose:_,initialScrollY:window.scrollY,initialQuery:y,navigator:C,transformItems:T,hitComponent:Oe,transformSearchClient:j,...a.searchPagePath&&{resultsFooterComponent:A},...a,searchParameters:f,placeholder:Ne.placeholder,translations:Ne.modal}),h.current)]})}function Me(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(Ie,{...e.themeConfig.algolia})}const Fe={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ze(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Fe.navbarSearchContainer),children:t})}var Be=n(4070),$e=n(1754);var Ue=n(5597);const qe=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ze,{className:n,children:(0,u.jsx)(Me,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Be.zK)(r),i=(0,$e.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Be.zK)(r),i=(0,$e.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,$e.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,Be.zK)(n),f=(0,Be.jh)(n),{savePreferredVersionName:m}=(0,Ue.g1)(n),h=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??qe(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,$e.Vd)(n)[0],b=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,v=t&&h.length>1?void 0:qe(g).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:v,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:v,items:h,isActive:r?()=>!1:void 0})}};function Ge(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ve(){const e=(0,j.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ge,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function We(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ke(){const e=0===(0,x.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(We,{onClick:()=>t.hide()}),t.content]})}function Qe(){const e=(0,j.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ve,{}),secondaryMenu:(0,u.jsx)(Ke,{})}):null}const Ye={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ze(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,j.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,R.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Ye.navbarHideable,!d&&Ye.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ze,{onClick:i.toggle}),(0,u.jsx)(Qe,{})]})}var Je=n(440);const et={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function tt(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:et.errorBoundaryError,children:n})}class rt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ot="right";function at(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function it(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(at,{})})}const st={colorModeToggle:"colorModeToggle_DEke"};function lt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(rt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ge,{...e})},t)))})}function ct(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ut(){const e=(0,j.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ot)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(ct,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(it,{}),(0,u.jsx)(K,{}),(0,u.jsx)(lt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(lt,{items:r}),(0,u.jsx)(V,{className:st.colorModeToggle}),!o&&(0,u.jsx)(ze,{children:(0,u.jsx)(Me,{})})]})})}function dt(){return(0,u.jsx)(Xe,{children:(0,u.jsx)(ut,{})})}function pt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function ft(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(pt,{item:t})},t.href??t.to)}function mt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(ft,{item:e},t)))})]})}function ht(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(mt,{column:e},t)))})}function gt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function bt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(pt,{item:t})}function vt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(bt,{item:e}),t.length!==n+1&&(0,u.jsx)(gt,{})]},n)))})})}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(ht,{columns:t}):(0,u.jsx)(vt,{links:t})}var xt=n(1122);const wt={footerLogoLink:"footerLogoLink_BH7S"};function kt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(xt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function St(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:wt.footerLogoLink,target:t.target,children:(0,u.jsx)(kt,{logo:t})}):(0,u.jsx)(kt,{logo:t})}function _t(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Et(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Ct(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Et,{style:o,links:n&&n.length>0&&(0,u.jsx)(yt,{links:n}),logo:r&&(0,u.jsx)(St,{logo:r}),copyright:t&&(0,u.jsx)(_t,{copyright:t})})}const Tt=r.memo(Ct),At=(0,L.fM)([F.a,w.o,R.Tv,Ue.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(O,{children:t})})})}]);function jt(e){let{children:t}=e;return(0,u.jsx)(At,{children:t})}var Rt=n(1107);function Lt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Rt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(tt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(nt,{error:t})})]})})})}const Nt={mainWrapper:"mainWrapper_z2l0"};function Pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(jt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(y,{}),(0,u.jsx)(A,{}),(0,u.jsx)(dt,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,Nt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Lt,{...e}),children:t})}),!n&&(0,u.jsx)(Tt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(5066),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(6540),o=n(2303),a=n(679),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(679),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,XK:()=>x,g1:()=>y});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),s=n(1754),l=n(9532),c=n(679),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function v(){const e=(0,r.useContext)(m);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=v(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function x(){const e=(0,o.Gy)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4255:(e,t,n)=>{"use strict";n.d(t,{b:()=>s,w:()=>l});var r=n(6540),o=n(4586),a=n(7485);const i="q";function s(){return(0,a.l)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>_,Vd:()=>w,QB:()=>S,fW:()=>k,OF:()=>x,Y:()=>v});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),s=n(5597),l=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,s.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,l.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.v)(i),sidebarName:c,sidebarItems:u}}},481:(e,t,n)=>{"use strict";n.d(t,{s:()=>o});var r=n(4586);function o(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,l:()=>l});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){const t=function(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}(e)??"",n=function(e){const t=(0,o.W6)();return(0,r.useCallback)(((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})}),[e,t])}(e);return[t,n]}},9024:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>m});var r=n(6540),o=n(5066),a=n(5260),i=n(3102);function s(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(6025),c=n(481),u=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.s)(t),{withBaseUrl:d}=(0,l.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.A,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,o.A)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},1252:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(6540),o=n(8193),a=n(2303),i=(n(205),n(9532)),s=n(4848);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>i,af:()=>l,tU:()=>s});var r=n(4070),o=n(4586),a=n(5597);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,o.A)(),t=(0,r.Gy)(),n=(0,r.gk)(),l=(0,a.XK)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?l:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},8126:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(4586);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},1062:(e,t,n)=>{"use strict";n.d(t,{C:()=>s});var r=n(6540),o=n(1252),a=n(6025),i=n(8126);function s(){const{withBaseUrl:e}=(0,a.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,n?o(l):a(l));var l;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return o.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return o.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return o.removeTrailingSlash}});var a=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return a.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return a.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return a.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return a.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>A,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function x(e){void 0===e&&(e={}),h||(0,s.A)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,x=void 0!==c&&c,w=i.getUserConfirmation,k=void 0===w?g:w,S=i.keyLength,_=void 0===S?6:S,E=e.basename?d(l(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return E&&(a=u(a,E)),f(a,r,n)}function T(){return Math.random().toString(36).substr(2,_)}var A=m();function j(e){(0,r.A)($,e),$.length=n.length,A.notifyListeners($.location,$.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(C(e.state))}function L(){P(C(y()))}var N=!1;function P(e){if(N)N=!1,j();else{A.confirmTransitionTo(e,"POP",k,(function(t){t?j({action:"POP",location:e}):function(e){var t=$.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(N=!0,M(o))}(e)}))}}var O=C(y()),D=[O.key];function I(e){return E+p(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,R),a&&window.addEventListener(v,L)):0===F&&(window.removeEventListener(b,R),a&&window.removeEventListener(v,L))}var B=!1;var $={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",a=f(e,t,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),x)window.location.href=t;else{var l=D.indexOf($.location.key),c=D.slice(0,l+1);c.push(a.key),D=c,j({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,T(),$.location);A.confirmTransitionTo(a,r,k,(function(e){if(e){var t=I(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),x)window.location.replace(t);else{var l=D.indexOf($.location.key);-1!==l&&(D[l]=a.key),j({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=A.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var w="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:l},slash:{encodePath:l,decodePath:l}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function E(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,s.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?g:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(l(e.basename)):"",v=k[c],y=v.encodePath,x=v.decodePath;function C(){var e=x(_());return b&&(e=u(e,b)),f(e)}var T=m();function A(e){(0,r.A)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var j=!1,R=null;function L(){var e,t,n=_(),r=y(n);if(n!==r)E(r);else{var o=C(),i=B.location;if(!j&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===p(o))return;R=null,function(e){if(j)j=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?A({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var r=D.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(j=!0,I(o))}(e)}))}}(o)}}var N=_(),P=y(N);N!==P&&E(P);var O=C(),D=[p(O)];function I(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(w,L):0===M&&window.removeEventListener(w,L)}var z=!1;var B={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);if(_()!==o){R=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(p(B.location)),i=D.slice(0,a+1);i.push(t),D=i,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=y(b+t);_()!==o&&(R=t,E(o));var a=D.indexOf(p(B.location));-1!==a&&(D[a]=t),A({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=m();function d(e){(0,r.A)(x,e),x.length=x.entries.length,u.notifyListeners(x.location,x.action)}function h(){return Math.random().toString(36).substr(2,c)}var g=T(s,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?h():e.key||h())})),v=p;function y(e){var t=T(x.index+e,0,x.entries.length-1),r=x.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var x={length:b.length,action:"POP",location:b[g],index:g,entries:b,createHref:v,push:function(e,t){var r="PUSH",o=f(e,t,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=x.index+1,n=x.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,h(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=x.index+e;return t>=0&&t<x.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return x}},4146:(e,t,n)=>{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g<i.length;++g){var b=i[g];if(!(a[b]||r&&r[b]||h&&h[b]||s&&s[b])){var v=p(n,b);try{c(t,b,v)}catch(y){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],x=n[7];s&&(r.push(s),s="");var w=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,_=n[2]||u,E=b||v;r.push({name:g||a++,prefix:h||"",delimiter:_,optional:S,repeat:k,partial:w,asterisk:!!x,pattern:E?c(E):x?".*":"[^"+l(_)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=s[u.name];if(null==p){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(p)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=l(p[f]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(p),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var p=l(c.prefix),f="(?:"+c.pattern+")";t.push(c),c.repeat&&(f+="(?:"+p+f+")*"),i+=f=c.optional?c.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var m=l(n.delimiter||"/"),h=i.slice(-m.length)===m;return o||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=a?"$":o&&h?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function f(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(f(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;o(m);){for(var h in p={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var x={getIds:function(){var e=[];return x.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return x}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f={},m={};function h(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function v(e){return e[1].toUpperCase()}function y(e,t,n,r){var o=g.hasOwnProperty(t)?g[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(m,e)||!d.call(f,e)&&(p.test(e)?m[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,v);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var x=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),k=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),T=Symbol.for("react.context"),A=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),R=Symbol.for("react.suspense_list"),L=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var P=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var I,M=Object.assign;function F(e){if(void 0===I)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);I=t&&t[1]||""}return"\n"+I+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function $(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function U(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case k:return"Portal";case E:return"Profiler";case _:return"StrictMode";case j:return"Suspense";case R:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case A:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case L:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case N:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===_?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function V(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function K(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&y(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&K(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function se(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ve(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ye(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var xe=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,Se=null,_e=null;function Ee(e){if(e=xo(e)){if("function"!=typeof ke)throw Error(a(280));var t=e.stateNode;t&&(t=ko(t),ke(e.stateNode,e.type,t))}}function Ce(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Te(){if(Se){var e=Se,t=_e;if(_e=Se=null,Ee(e),t)for(e=0;e<t.length;e++)Ee(t[e])}}function Ae(e,t){return e(t)}function je(){}var Re=!1;function Le(e,t,n){if(Re)return e(t,n);Re=!0;try{return Ae(e,t,n)}finally{Re=!1,(null!==Se||null!==_e)&&(je(),Te())}}function Ne(e,t){var n=e.stateNode;if(null===n)return null;var r=ko(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Pe=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Pe=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Pe=!1}function De(e,t,n,r,o,a,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Ie=!0,Me=e}};function $e(e,t,n,r,o,a,i,s,l){Ie=!1,Me=null,De.apply(Be,arguments)}function Ue(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(Ue(e)!==e)throw Error(a(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ve(e):null}function Ve(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ve(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Ke=o.unstable_cancelCallback,Qe=o.unstable_shouldYield,Ye=o.unstable_requestPaint,Ze=o.unstable_now,Xe=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&4194240&a))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function ft(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return!(4194240&(ct<<=1))&&(ct=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function vt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var yt=0;function xt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var wt,kt,St,_t,Et,Ct=!1,Tt=[],At=null,jt=null,Rt=null,Lt=new Map,Nt=new Map,Pt=[],Ot="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":At=null;break;case"dragenter":case"dragleave":jt=null;break;case"mouseover":case"mouseout":Rt=null;break;case"pointerover":case"pointerout":Lt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Nt.delete(t.pointerId)}}function It(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=xo(t))&&kt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=yo(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void Et(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=xo(n))&&kt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);xe=r,n.target.dispatchEvent(r),xe=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==At&&Ft(At)&&(At=null),null!==jt&&Ft(jt)&&(jt=null),null!==Rt&&Ft(Rt)&&(Rt=null),Lt.forEach(zt),Nt.forEach(zt)}function $t(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function Ut(e){function t(t){return $t(t,e)}if(0<Tt.length){$t(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==At&&$t(At,e),null!==jt&&$t(jt,e),null!==Rt&&$t(Rt,e),Lt.forEach(t),Nt.forEach(t),n=0;n<Pt.length;n++)(r=Pt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Pt.length&&null===(n=Pt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Pt.shift()}var qt=x.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=1,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Vt(e,t,n,r){var o=yt,a=qt.transition;qt.transition=null;try{yt=4,Wt(e,t,n,r)}finally{yt=o,qt.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Qt(e,t,n,r);if(null===o)Hr(e,t,r,Kt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return At=It(At,e,t,n,r,o),!0;case"dragenter":return jt=It(jt,e,t,n,r,o),!0;case"mouseover":return Rt=It(Rt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Lt.set(a,It(Lt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Nt.set(a,It(Nt.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==o;){var a=xo(o);if(null!==a&&wt(a),null===(a=Qt(e,t,n,r))&&Hr(e,t,r,Kt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Kt=null;function Qt(e,t,n,r){if(Kt=null,null!==(e=yo(e=we(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Kt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,o="value"in Zt?Zt.value:Zt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,sn,ln,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),pn=on(dn),fn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:En,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),mn=on(fn),hn=on(M({},fn,{dataTransfer:0})),gn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),vn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),yn=on(vn),xn=on(M({},cn,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},kn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _n(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function En(){return _n}var Cn=M({},dn,{key:function(e){if(e.key){var t=wn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?kn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:En,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Tn=on(Cn),An=on(M({},fn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),jn=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:En})),Rn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=M({},fn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Nn=on(Ln),Pn=[9,13,27,32],On=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var In=u&&"TextEvent"in window&&!Dn,Mn=u&&(!On||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Pn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Gn(e,t,n,r){Ce(r),0<(t=Vr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Vn=null,Wn=null;function Kn(e){Fr(e,0)}function Qn(e){if(W(wo(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Vn&&(Vn.detachEvent("onpropertychange",nr),Wn=Vn=null)}function nr(e){if("value"===e.propertyName&&Qn(Wn)){var t=[];Gn(t,Wn,e,we(e)),Le(Kn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Vn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Wn)}function ar(e,t){if("click"===e)return Qn(t)}function ir(e,t){if("input"===e||"change"===e)return Qn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!sr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=K();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=K((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,br=null,vr=null,yr=!1;function xr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;yr||null==gr||gr!==K(r)||("selectionStart"in(r=gr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},vr&&lr(vr,r)||(vr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},Sr={},_r={};function Er(e){if(Sr[e])return Sr[e];if(!kr[e])return e;var t,n=kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in _r)return Sr[e]=n[t];return e}u&&(_r=document.createElement("div").style,"AnimationEvent"in window||(delete kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var Cr=Er("animationend"),Tr=Er("animationiteration"),Ar=Er("animationstart"),jr=Er("transitionend"),Rr=new Map,Lr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Nr(e,t){Rr.set(e,t),l(t,[e])}for(var Pr=0;Pr<Lr.length;Pr++){var Or=Lr[Pr];Nr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Nr(Cr,"onAnimationEnd"),Nr(Tr,"onAnimationIteration"),Nr(Ar,"onAnimationStart"),Nr("dblclick","onDoubleClick"),Nr("focusin","onFocus"),Nr("focusout","onBlur"),Nr(jr,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ir=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,s,l,c){if($e.apply(this,arguments),Ie){if(!Ie)throw Error(a(198));var u=Me;Ie=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[go];void 0===n&&(n=t[go]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var $r="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[$r]){e[$r]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[$r]||(t[$r]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Yt(t)){case 1:var o=Gt;break;case 4:o=Vt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Pe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=yo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Le((function(){var r=a,o=we(n),i=[];e:{var s=Rr.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":c="focus",l=gn;break;case"focusout":c="blur",l=gn;break;case"beforeblur":case"afterblur":l=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=jn;break;case Cr:case Tr:case Ar:l=bn;break;case jr:l=Rn;break;case"scroll":l=pn;break;case"wheel":l=Nn;break;case"copy":case"cut":case"paste":l=yn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=An}var u=!!(4&t),d=!u&&"scroll"===e,p=u?null!==s?s+"Capture":null:s;u=[];for(var f,m=r;null!==m;){var h=(f=m).stateNode;if(5===f.tag&&null!==h&&(f=h,null!==p&&(null!=(h=Ne(m,p))&&u.push(Gr(m,h,f)))),d)break;m=m.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(!(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===xe||!(c=n.relatedTarget||n.fromElement)||!yo(c)&&!c[ho])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?yo(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=mn,h="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=An,h="onPointerLeave",p="onPointerEnter",m="pointer"),d=null==l?s:wo(l),f=null==c?s:wo(c),(s=new u(h,m+"leave",l,n,o)).target=d,s.relatedTarget=f,h=null,yo(o)===r&&((u=new u(p,m+"enter",c,n,o)).target=f,u.relatedTarget=d,h=u),d=h,l&&c)e:{for(p=c,m=0,f=u=l;f;f=Wr(f))m++;for(f=0,h=p;h;h=Wr(h))f++;for(;0<m-f;)u=Wr(u),m--;for(;0<f-m;)p=Wr(p),f--;for(;m--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==l&&Kr(i,s,l,u,!1),null!==c&&null!==d&&Kr(i,d,c,u,!0)}if("select"===(l=(s=r?wo(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var g=Yn;else if(Hn(s))if(Zn)g=ir;else{g=or;var b=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(g=ar);switch(g&&(g=g(e,r))?Gn(i,g,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&ee(s,"number",s.value)),b=r?wo(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(gr=b,br=r,vr=null);break;case"focusout":vr=br=gr=null;break;case"mousedown":yr=!0;break;case"contextmenu":case"mouseup":case"dragend":yr=!1,xr(i,n,o);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":xr(i,n,o)}var v;if(On)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Un?Bn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Mn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==y?"onCompositionEnd"===y&&Un&&(v=en()):(Xt="value"in(Zt=o)?Zt.value:Zt.textContent,Un=!0)),0<(b=Vr(r,y)).length&&(y=new xn(y,e,null,n,o),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=$n(n))&&(y.data=v))),(v=In?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!On&&Bn(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Vr(r,"onBeforeInput")).length&&(o=new xn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=v))}Fr(i,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Vr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Ne(e,n))&&r.unshift(Gr(e,a,o)),null!=(a=Ne(e,t))&&r.push(Gr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Kr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Ne(n,a))&&i.unshift(Gr(n,l,s)):o||null!=(l=Ne(n,a))&&i.push(Gr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Qr,"\n").replace(Yr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(a(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);Ut(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var po=Math.random().toString(36).slice(2),fo="__reactFiber$"+po,mo="__reactProps$"+po,ho="__reactContainer$"+po,go="__reactEvents$"+po,bo="__reactListeners$"+po,vo="__reactHandles$"+po;function yo(e){var t=e[fo];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ho]||n[fo]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[fo])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function xo(e){return!(e=e[fo]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function ko(e){return e[mo]||null}var So=[],_o=-1;function Eo(e){return{current:e}}function Co(e){0>_o||(e.current=So[_o],So[_o]=null,_o--)}function To(e,t){_o++,So[_o]=e.current,e.current=t}var Ao={},jo=Eo(Ao),Ro=Eo(!1),Lo=Ao;function No(e,t){var n=e.type.contextTypes;if(!n)return Ao;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Po(e){return null!=(e=e.childContextTypes)}function Oo(){Co(Ro),Co(jo)}function Do(e,t,n){if(jo.current!==Ao)throw Error(a(168));To(jo,t),To(Ro,n)}function Io(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,q(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ao,Lo=jo.current,To(jo,e),To(Ro,Ro.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Io(e,t,Lo),r.__reactInternalMemoizedMergedChildContext=e,Co(Ro),Co(jo),To(jo,e)):Co(Ro),To(Ro,n)}var zo=null,Bo=!1,$o=!1;function Uo(e){null===zo?zo=[e]:zo.push(e)}function qo(){if(!$o&&null!==zo){$o=!0;var e=0,t=yt;try{var n=zo;for(yt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Je,qo),o}finally{yt=t,$o=!1}}return null}var Ho=[],Go=0,Vo=null,Wo=0,Ko=[],Qo=0,Yo=null,Zo=1,Xo="";function Jo(e,t){Ho[Go++]=Wo,Ho[Go++]=Vo,Vo=e,Wo=t}function ea(e,t,n){Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=Yo,Yo=e;var r=Zo;e=Xo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Zo=1<<32-it(t)+o|n<<o|r,Xo=a+e}else Zo=1<<a|n<<o|r,Xo=e}function ta(e){null!==e.return&&(Jo(e,1),ea(e,1,0))}function na(e){for(;e===Vo;)Vo=Ho[--Go],Ho[Go]=null,Wo=Ho[--Go],Ho[Go]=null;for(;e===Yo;)Yo=Ko[--Qo],Ko[Qo]=null,Xo=Ko[--Qo],Ko[Qo]=null,Zo=Ko[--Qo],Ko[Qo]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(e,t){var n=Lc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function la(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Yo?{id:Zo,overflow:Xo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Lc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return!(!(1&e.mode)||128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function pa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw fa(),Error(a(418));for(;t;)sa(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function fa(){for(var e=oa;e;)e=co(e.nextSibling)}function ma(){oa=ra=null,aa=!1}function ha(e){null===ia?ia=[e]:ia.push(e)}var ga=x.ReactCurrentBatchConfig;function ba(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function va(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function ya(e){return(0,e._init)(e._payload)}function xa(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Pc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Mc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===N&&ya(a)===t.type)?((r=o(t,n.props)).ref=ba(e,t,n),r.return=e,r):((r=Oc(n.type,n.key,n.props,null,e.mode,r)).ref=ba(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Mc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Oc(t.type,t.key,t.props,null,e.mode,n)).ref=ba(e,null,t),n.return=e,n;case k:return(t=Fc(t,e.mode,n)).return=e,t;case N:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Dc(t,e.mode,n,null)).return=e,t;va(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===o?c(e,t,n,r):null;case k:return n.key===o?u(e,t,n,r):null;case N:return f(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);va(e,n)}return null}function m(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case w:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case k:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case N:return m(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);va(t,r)}return null}function h(o,a,s,l){for(var c=null,u=null,d=a,h=a=0,g=null;null!==d&&h<s.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=f(o,d,s[h],l);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,h),null===u?c=b:u.sibling=b,u=b,d=g}if(h===s.length)return n(o,d),aa&&Jo(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=p(o,s[h],l))&&(a=i(d,a,h),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,h),c}for(d=r(o,d);h<s.length;h++)null!==(g=m(d,o,h,s[h],l))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),a=i(g,a,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),c}function g(o,s,l,c){var u=D(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,h=s,g=s=0,b=null,v=l.next();null!==h&&!v.done;g++,v=l.next()){h.index>g?(b=h,h=null):b=h.sibling;var y=f(o,h,v.value,c);if(null===y){null===h&&(h=b);break}e&&h&&null===y.alternate&&t(o,h),s=i(y,s,g),null===d?u=y:d.sibling=y,d=y,h=b}if(v.done)return n(o,h),aa&&Jo(o,g),u;if(null===h){for(;!v.done;g++,v=l.next())null!==(v=p(o,v.value,c))&&(s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return aa&&Jo(o,g),u}for(h=r(o,h);!v.done;g++,v=l.next())null!==(v=m(h,o,g,v.value,c))&&(e&&null!==v.alternate&&h.delete(null===v.key?g:v.key),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v);return e&&h.forEach((function(e){return t(o,e)})),aa&&Jo(o,g),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case w:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===N&&ya(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=ba(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Dc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Oc(i.type,i.key,i.props,null,r.mode,l)).ref=ba(r,a,i),l.return=r,r=l)}return s(r);case k:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Fc(i,r.mode,l)).return=r,r=a}return s(r);case N:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return h(r,a,i,l);if(D(i))return g(r,a,i,l);va(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Mc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var wa=xa(!0),ka=xa(!1),Sa=Eo(null),_a=null,Ea=null,Ca=null;function Ta(){Ca=Ea=_a=null}function Aa(e){var t=Sa.current;Co(Sa),e._currentValue=t}function ja(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ra(e,t){_a=e,Ca=Ea=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(ys=!0),e.firstContext=null)}function La(e){var t=e._currentValue;if(Ca!==e)if(e={context:e,memoizedValue:t,next:null},null===Ea){if(null===_a)throw Error(a(308));Ea=e,_a.dependencies={lanes:0,firstContext:e}}else Ea=Ea.next=e;return t}var Na=null;function Pa(e){null===Na?Na=[e]:Na.push(e)}function Oa(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Pa(t)):(n.next=o.next,o.next=n),t.interleaved=n,Da(e,r)}function Da(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Ia=!1;function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function za(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ba(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Al){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Da(e,n)}return null===(o=r.interleaved)?(t.next=t,Pa(r)):(t.next=o.next,o.next=t),r.interleaved=t,Da(e,n)}function $a(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}function Ua(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function qa(e,t,n,r){var o=e.updateQueue;Ia=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var p=s.lane,f=s.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var m=e,h=s;switch(p=t,f=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(f,d,p);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(p="function"==typeof(m=h.payload)?m.call(f,d,p):m))break e;d=M({},d,p);break e;case 2:Ia=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[s]:p.push(s))}else f={eventTime:f,lane:p,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=f,l=d):u=u.next=f,i|=p;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(p=s).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Il|=i,e.lanes=i,e.memoizedState=d}}function Ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Ga={},Va=Eo(Ga),Wa=Eo(Ga),Ka=Eo(Ga);function Qa(e){if(e===Ga)throw Error(a(174));return e}function Ya(e,t){switch(To(Ka,t),To(Wa,e),To(Va,Ga),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Co(Va),To(Va,t)}function Za(){Co(Va),Co(Wa),Co(Ka)}function Xa(e){Qa(Ka.current);var t=Qa(Va.current),n=le(t,e.type);t!==n&&(To(Wa,e),To(Va,n))}function Ja(e){Wa.current===e&&(Co(Va),Co(Wa))}var ei=Eo(0);function ti(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var oi=x.ReactCurrentDispatcher,ai=x.ReactCurrentBatchConfig,ii=0,si=null,li=null,ci=null,ui=!1,di=!1,pi=0,fi=0;function mi(){throw Error(a(321))}function hi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function gi(e,t,n,r,o,i){if(ii=i,si=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,oi.current=null===e||null===e.memoizedState?Ji:es,e=n(r,o),di){i=0;do{if(di=!1,pi=0,25<=i)throw Error(a(301));i+=1,ci=li=null,t.updateQueue=null,oi.current=ts,e=n(r,o)}while(di)}if(oi.current=Xi,t=null!==li&&null!==li.next,ii=0,ci=li=si=null,ui=!1,t)throw Error(a(300));return e}function bi(){var e=0!==pi;return pi=0,e}function vi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?si.memoizedState=ci=e:ci=ci.next=e,ci}function yi(){if(null===li){var e=si.alternate;e=null!==e?e.memoizedState:null}else e=li.next;var t=null===ci?si.memoizedState:ci.next;if(null!==t)ci=t,li=e;else{if(null===e)throw Error(a(310));e={memoizedState:(li=e).memoizedState,baseState:li.baseState,baseQueue:li.baseQueue,queue:li.queue,next:null},null===ci?si.memoizedState=ci=e:ci=ci.next=e}return ci}function xi(e,t){return"function"==typeof t?t(e):t}function wi(e){var t=yi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=li,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((ii&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var p={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(l=c=p,s=r):c=c.next=p,si.lanes|=d,Il|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(ys=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,si.lanes|=i,Il|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function ki(e){var t=yi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(ys=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Si(){}function _i(e,t){var n=si,r=yi(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,ys=!0),r=r.queue,Ii(Ti.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Li(9,Ci.bind(null,n,r,o,t),void 0,null),null===jl)throw Error(a(349));30&ii||Ei(n,t,o)}return o}function Ei(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ci(e,t,n,r){t.value=n,t.getSnapshot=r,Ai(t)&&ji(e)}function Ti(e,t,n){return n((function(){Ai(t)&&ji(e)}))}function Ai(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function ji(e){var t=Da(e,1);null!==t&&nc(t,e,1,-1)}function Ri(e){var t=vi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:xi,lastRenderedState:e},t.queue=e,e=e.dispatch=Ki.bind(null,si,e),[t.memoizedState,e]}function Li(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=si.updateQueue)?(t={lastEffect:null,stores:null},si.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Ni(){return yi().memoizedState}function Pi(e,t,n,r){var o=vi();si.flags|=e,o.memoizedState=Li(1|t,n,void 0,void 0===r?null:r)}function Oi(e,t,n,r){var o=yi();r=void 0===r?null:r;var a=void 0;if(null!==li){var i=li.memoizedState;if(a=i.destroy,null!==r&&hi(r,i.deps))return void(o.memoizedState=Li(t,n,a,r))}si.flags|=e,o.memoizedState=Li(1|t,n,a,r)}function Di(e,t){return Pi(8390656,8,e,t)}function Ii(e,t){return Oi(2048,8,e,t)}function Mi(e,t){return Oi(4,2,e,t)}function Fi(e,t){return Oi(4,4,e,t)}function zi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Bi(e,t,n){return n=null!=n?n.concat([e]):null,Oi(4,4,zi.bind(null,t,e),n)}function $i(){}function Ui(e,t){var n=yi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function qi(e,t){var n=yi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Hi(e,t,n){return 21&ii?(sr(n,t)||(n=ht(),si.lanes|=n,Il|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,ys=!0),e.memoizedState=n)}function Gi(e,t){var n=yt;yt=0!==n&&4>n?n:4,e(!0);var r=ai.transition;ai.transition={};try{e(!1),t()}finally{yt=n,ai.transition=r}}function Vi(){return yi().memoizedState}function Wi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Qi(e))Yi(t,n);else if(null!==(n=Oa(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Ki(e,t,n){var r=tc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Qi(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Pa(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Oa(e,t,o,r))&&(nc(n,e,r,o=ec()),Zi(n,t,r))}}function Qi(e){var t=e.alternate;return e===si||null!==t&&t===si}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,vt(e,n)}}var Xi={readContext:La,useCallback:mi,useContext:mi,useEffect:mi,useImperativeHandle:mi,useInsertionEffect:mi,useLayoutEffect:mi,useMemo:mi,useReducer:mi,useRef:mi,useState:mi,useDebugValue:mi,useDeferredValue:mi,useTransition:mi,useMutableSource:mi,useSyncExternalStore:mi,useId:mi,unstable_isNewReconciler:!1},Ji={readContext:La,useCallback:function(e,t){return vi().memoizedState=[e,void 0===t?null:t],e},useContext:La,useEffect:Di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Pi(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Pi(4194308,4,e,t)},useInsertionEffect:function(e,t){return Pi(4,2,e,t)},useMemo:function(e,t){var n=vi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=vi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Wi.bind(null,si,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},vi().memoizedState=e},useState:Ri,useDebugValue:$i,useDeferredValue:function(e){return vi().memoizedState=e},useTransition:function(){var e=Ri(!1),t=e[0];return e=Gi.bind(null,e[1]),vi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=si,o=vi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===jl)throw Error(a(349));30&ii||Ei(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Di(Ti.bind(null,r,i,e),[e]),r.flags|=2048,Li(9,Ci.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=vi(),t=jl.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=pi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=fi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},es={readContext:La,useCallback:Ui,useContext:La,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:wi,useRef:Ni,useState:function(){return wi(xi)},useDebugValue:$i,useDeferredValue:function(e){return Hi(yi(),li.memoizedState,e)},useTransition:function(){return[wi(xi)[0],yi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Vi,unstable_isNewReconciler:!1},ts={readContext:La,useCallback:Ui,useContext:La,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:ki,useRef:Ni,useState:function(){return ki(xi)},useDebugValue:$i,useDeferredValue:function(e){var t=yi();return null===li?t.memoizedState=e:Hi(t,li.memoizedState,e)},useTransition:function(){return[ki(xi)[0],yi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Vi,unstable_isNewReconciler:!1};function ns(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rs(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var os={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),o=za(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ba(e,o,r))&&(nc(t,e,r,n),$a(t,e,r))}};function as(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function is(e,t,n){var r=!1,o=Ao,a=t.contextType;return"object"==typeof a&&null!==a?a=La(a):(o=Po(t)?Lo:jo.current,a=(r=null!=(r=t.contextTypes))?No(e,o):Ao),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=os,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function ss(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&os.enqueueReplaceState(t,t.state,null)}function ls(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs={},Ma(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=La(a):(a=Po(t)?Lo:jo.current,o.context=No(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(rs(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&os.enqueueReplaceState(o,o.state,null),qa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function cs(e,t){try{var n="",r=t;do{n+=$(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function us(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ds(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var ps="function"==typeof WeakMap?WeakMap:Map;function fs(e,t,n){(n=za(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hl||(Hl=!0,Gl=r),ds(0,t)},n}function ms(e,t,n){(n=za(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ds(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ds(0,t),"function"!=typeof r&&(null===Vl?Vl=new Set([this]):Vl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new ps;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Ec.bind(null,e,t,n),t.then(e,e))}function gs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function bs(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=za(-1,1)).tag=2,Ba(n,t,1))),n.lanes|=1),e)}var vs=x.ReactCurrentOwner,ys=!1;function xs(e,t,n,r){t.child=null===e?ka(t,null,n,r):wa(t,e.child,n,r)}function ws(e,t,n,r,o){n=n.render;var a=t.ref;return Ra(t,o),r=gi(e,t,n,r,a,o),n=bi(),null===e||ys?(aa&&n&&ta(t),t.flags|=1,xs(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function ks(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Nc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Oc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Ss(e,t,a,r,o))}if(a=e.child,!(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Hs(e,t,o)}return t.flags|=1,(e=Pc(a,r)).ref=t.ref,e.return=t,t.child=e}function Ss(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(ys=!1,t.pendingProps=r=a,!(e.lanes&o))return t.lanes=e.lanes,Hs(e,t,o);131072&e.flags&&(ys=!0)}}return Cs(e,t,n,r,o)}function _s(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,To(Pl,Nl),Nl|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,To(Pl,Nl),Nl|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Pl,Nl),Nl|=n;else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,To(Pl,Nl),Nl|=r;return xs(e,t,o,n),t.child}function Es(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Cs(e,t,n,r,o){var a=Po(n)?Lo:jo.current;return a=No(t,a),Ra(t,o),n=gi(e,t,n,r,a,o),r=bi(),null===e||ys?(aa&&r&&ta(t),t.flags|=1,xs(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hs(e,t,o))}function Ts(e,t,n,r,o){if(Po(n)){var a=!0;Mo(t)}else a=!1;if(Ra(t,o),null===t.stateNode)qs(e,t),is(t,n,r),ls(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=La(c):c=No(t,c=Po(n)?Lo:jo.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&ss(t,i,r,c),Ia=!1;var p=t.memoizedState;i.state=p,qa(t,r,i,o),l=t.memoizedState,s!==r||p!==l||Ro.current||Ia?("function"==typeof u&&(rs(t,n,u,r),l=t.memoizedState),(s=Ia||as(t,n,s,r,p,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Fa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ns(t.type,s),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=La(l):l=No(t,l=Po(n)?Lo:jo.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||p!==l)&&ss(t,i,r,l),Ia=!1,p=t.memoizedState,i.state=p,qa(t,r,i,o);var m=t.memoizedState;s!==d||p!==m||Ro.current||Ia?("function"==typeof f&&(rs(t,n,f,r),m=t.memoizedState),(c=Ia||as(t,n,c,r,p,m,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return As(e,t,n,r,a,o)}function As(e,t,n,r,o,a){Es(e,t);var i=!!(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Hs(e,t,a);r=t.stateNode,vs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=wa(t,e.child,null,a),t.child=wa(t,null,s,a)):xs(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function js(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),Ya(e,t.containerInfo)}function Rs(e,t,n,r,o){return ma(),ha(o),t.flags|=256,xs(e,t,n,r),t.child}var Ls,Ns,Ps,Os,Ds={dehydrated:null,treeContext:null,retryLane:0};function Is(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ms(e,t,n){var r,o=t.pendingProps,i=ei.current,s=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),To(ei,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},1&o||null===s?s=Ic(l,o,0,null):(s.childLanes=0,s.pendingProps=l),e=Dc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Is(n),t.memoizedState=Ds,e):Fs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,zs(e,t,s,r=us(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Ic({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&wa(t,e.child,null,s),t.child.memoizedState=Is(s),t.memoizedState=Ds,i);if(!(1&t.mode))return zs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,zs(e,t,s,r=us(i=Error(a(419)),r,void 0))}if(l=!!(s&e.childLanes),ys||l){if(null!==(r=jl)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|s)?0:o)&&o!==i.retryLane&&(i.retryLane=o,Da(e,o),nc(r,e,o,-1))}return hc(),zs(e,t,s,r=us(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Tc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Ko[Qo++]=Zo,Ko[Qo++]=Xo,Ko[Qo++]=Yo,Zo=e.id,Xo=e.overflow,Yo=t),t=Fs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 1&l||t.child===i?(o=Pc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null),null!==r?s=Pc(r,s):(s=Dc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Is(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Ds,o}return e=(s=e.child).sibling,o=Pc(s,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Fs(e,t){return(t=Ic({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zs(e,t,n,r){return null!==r&&ha(r),wa(t,e.child,null,n),(e=Fs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Bs(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),ja(e.return,t,n)}function $s(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Us(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(xs(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Bs(e,n,t);else if(19===e.tag)Bs(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(To(ei,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$s(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ti(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$s(t,!0,n,null,a);break;case"together":$s(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function qs(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Il|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Pc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Pc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Gs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Vs(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ws(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Vs(t),null;case 1:case 17:return Po(t.type)&&Oo(),Vs(t),null;case 3:return r=t.stateNode,Za(),Co(Ro),Co(jo),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ia&&(ic(ia),ia=null))),Ns(e,t),Vs(t),null;case 5:Ja(t);var o=Qa(Ka.current);if(n=t.type,null!==e&&null!=t.stateNode)Ps(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Vs(t),null}if(e=Qa(Va.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[mo]=i,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var l in ve(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",""+c]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&zr("scroll",r)}switch(n){case"input":V(r),J(r,i,!0);break;case"textarea":V(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[fo]=t,e[mo]=r,Ls(e,t,!1,!1),t.stateNode=e;e:{switch(l=ye(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Y(e,r),o=Q(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in ve(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&pe(e,u):"number"==typeof u&&pe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&y(e,i,u,l))}switch(n){case"input":V(e),J(e,r,!1);break;case"textarea":V(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Vs(t),null;case 6:if(e&&null!=t.stateNode)Os(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=Qa(Ka.current),Qa(Va.current),pa(t)){if(r=t.stateNode,n=t.memoizedProps,r[fo]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Xr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,!!(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fo]=t,t.stateNode=r}return Vs(t),null;case 13:if(Co(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&1&t.mode&&!(128&t.flags))fa(),ma(),t.flags|=98560,i=!1;else if(i=pa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[fo]=t}else ma(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Vs(t),i=!1}else null!==ia&&(ic(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ei.current?0===Ol&&(Ol=3):hc())),null!==t.updateQueue&&(t.flags|=4),Vs(t),null);case 4:return Za(),Ns(e,t),null===e&&Ur(t.stateNode.containerInfo),Vs(t),null;case 10:return Aa(t.type._context),Vs(t),null;case 19:if(Co(ei),null===(i=t.memoizedState))return Vs(t),null;if(r=!!(128&t.flags),null===(l=i.rendering))if(r)Gs(i,!1);else{if(0!==Ol||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(l=ti(e))){for(t.flags|=128,Gs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>Ul&&(t.flags|=128,r=!0,Gs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Gs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Vs(t),null}else 2*Ze()-i.renderingStartTime>Ul&&1073741824!==n&&(t.flags|=128,r=!0,Gs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,To(ei,r?1&n|2:1&n),t):(Vs(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Nl)&&(Vs(t),6&t.subtreeFlags&&(t.flags|=8192)):Vs(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Ks(e,t){switch(na(t),t.tag){case 1:return Po(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Za(),Co(Ro),Co(jo),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Ja(t),null;case 13:if(Co(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ma()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Co(ei),null;case 4:return Za(),null;case 10:return Aa(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Ls=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Ns=function(){},Ps=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Qa(Va.current);var a,i=null;switch(n){case"input":o=Q(e,o),r=Q(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ve(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Os=function(e,t,n,r){n!==r&&(t.flags|=4)};var Qs=!1,Ys=!1,Zs="function"==typeof WeakSet?WeakSet:Set,Xs=null;function Js(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){_c(e,t,r)}else n.current=null}function el(e,t,n){try{n()}catch(r){_c(e,t,r)}}var tl=!1;function nl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&el(t,n,a)}o=o.next}while(o!==r)}}function rl(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ol(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function al(e){var t=e.alternate;null!==t&&(e.alternate=null,al(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[mo],delete t[go],delete t[bo],delete t[vo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function il(e){return 5===e.tag||3===e.tag||4===e.tag}function sl(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||il(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ll(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(ll(e,t,n),e=e.sibling;null!==e;)ll(e,t,n),e=e.sibling}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}var ul=null,dl=!1;function pl(e,t,n){for(n=n.child;null!==n;)fl(e,t,n),n=n.sibling}function fl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ys||Js(n,t);case 6:var r=ul,o=dl;ul=null,pl(e,t,n),dl=o,null!==(ul=r)&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ul.removeChild(n.stateNode));break;case 18:null!==ul&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),Ut(e)):lo(ul,n.stateNode));break;case 4:r=ul,o=dl,ul=n.stateNode.containerInfo,dl=!0,pl(e,t,n),ul=r,dl=o;break;case 0:case 11:case 14:case 15:if(!Ys&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(2&a||4&a)&&el(n,t,i),o=o.next}while(o!==r)}pl(e,t,n);break;case 1:if(!Ys&&(Js(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){_c(n,t,s)}pl(e,t,n);break;case 21:pl(e,t,n);break;case 22:1&n.mode?(Ys=(r=Ys)||null!==n.memoizedState,pl(e,t,n),Ys=r):pl(e,t,n);break;default:pl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zs),t.forEach((function(t){var r=Ac.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:ul=l.stateNode,dl=!1;break e;case 3:case 4:ul=l.stateNode.containerInfo,dl=!0;break e}l=l.return}if(null===ul)throw Error(a(160));fl(i,s,o),ul=null,dl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){_c(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)gl(t,e),t=t.sibling}function gl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hl(t,e),bl(e),4&r){try{nl(3,e,e.return),rl(3,e)}catch(g){_c(e,e.return,g)}try{nl(5,e,e.return)}catch(g){_c(e,e.return,g)}}break;case 1:hl(t,e),bl(e),512&r&&null!==n&&Js(n,n.return);break;case 5:if(hl(t,e),bl(e),512&r&&null!==n&&Js(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,"")}catch(g){_c(e,e.return,g)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Z(o,i),ye(l,s);var u=ye(l,i);for(s=0;s<c.length;s+=2){var d=c[s],p=c[s+1];"style"===d?ge(o,p):"dangerouslySetInnerHTML"===d?de(o,p):"children"===d?pe(o,p):y(o,d,p,u)}switch(l){case"input":X(o,i);break;case"textarea":ae(o,i);break;case"select":var f=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(o,!!i.multiple,m,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[mo]=i}catch(g){_c(e,e.return,g)}}break;case 6:if(hl(t,e),bl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(g){_c(e,e.return,g)}}break;case 3:if(hl(t,e),bl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(g){_c(e,e.return,g)}break;case 4:default:hl(t,e),bl(e);break;case 13:hl(t,e),bl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||($l=Ze())),4&r&&ml(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ys=(u=Ys)||d,hl(t,e),Ys=u):hl(t,e),bl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&1&e.mode)for(Xs=e,d=e.child;null!==d;){for(p=Xs=d;null!==Xs;){switch(m=(f=Xs).child,f.tag){case 0:case 11:case 14:case 15:nl(4,f,f.return);break;case 1:Js(f,f.return);var h=f.stateNode;if("function"==typeof h.componentWillUnmount){r=f,n=f.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){_c(r,n,g)}}break;case 5:Js(f,f.return);break;case 22:if(null!==f.memoizedState){wl(p);continue}}null!==m?(m.return=f,Xs=m):wl(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{o=p.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(l=p.stateNode,s=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=he("display",s))}catch(g){_c(e,e.return,g)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(g){_c(e,e.return,g)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:hl(t,e),bl(e),4&r&&ml(e);case 21:}}function bl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(il(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(pe(o,""),r.flags&=-33),cl(e,sl(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;ll(e,sl(e),i);break;default:throw Error(a(161))}}catch(s){_c(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function vl(e,t,n){Xs=e,yl(e,t,n)}function yl(e,t,n){for(var r=!!(1&e.mode);null!==Xs;){var o=Xs,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Qs;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Ys;s=Qs;var c=Ys;if(Qs=i,(Ys=l)&&!c)for(Xs=o;null!==Xs;)l=(i=Xs).child,22===i.tag&&null!==i.memoizedState?kl(o):null!==l?(l.return=i,Xs=l):kl(o);for(;null!==a;)Xs=a,yl(a,t,n),a=a.sibling;Xs=o,Qs=s,Ys=c}xl(e)}else 8772&o.subtreeFlags&&null!==a?(a.return=o,Xs=a):xl(e)}}function xl(e){for(;null!==Xs;){var t=Xs;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Ys||rl(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ys)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ns(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Ha(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ha(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&Ut(p)}}}break;default:throw Error(a(163))}Ys||512&t.flags&&ol(t)}catch(f){_c(t,t.return,f)}}if(t===e){Xs=null;break}if(null!==(n=t.sibling)){n.return=t.return,Xs=n;break}Xs=t.return}}function wl(e){for(;null!==Xs;){var t=Xs;if(t===e){Xs=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Xs=n;break}Xs=t.return}}function kl(e){for(;null!==Xs;){var t=Xs;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rl(4,t)}catch(l){_c(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){_c(t,o,l)}}var a=t.return;try{ol(t)}catch(l){_c(t,a,l)}break;case 5:var i=t.return;try{ol(t)}catch(l){_c(t,i,l)}}}catch(l){_c(t,t.return,l)}if(t===e){Xs=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Xs=s;break}Xs=t.return}}var Sl,_l=Math.ceil,El=x.ReactCurrentDispatcher,Cl=x.ReactCurrentOwner,Tl=x.ReactCurrentBatchConfig,Al=0,jl=null,Rl=null,Ll=0,Nl=0,Pl=Eo(0),Ol=0,Dl=null,Il=0,Ml=0,Fl=0,zl=null,Bl=null,$l=0,Ul=1/0,ql=null,Hl=!1,Gl=null,Vl=null,Wl=!1,Kl=null,Ql=0,Yl=0,Zl=null,Xl=-1,Jl=0;function ec(){return 6&Al?Ze():-1!==Xl?Xl:Xl=Ze()}function tc(e){return 1&e.mode?2&Al&&0!==Ll?Ll&-Ll:null!==ga.transition?(0===Jl&&(Jl=ht()),Jl):0!==(e=yt)?e:e=void 0===(e=window.event)?16:Yt(e.type):1}function nc(e,t,n,r){if(50<Yl)throw Yl=0,Zl=null,Error(a(185));bt(e,n,r),2&Al&&e===jl||(e===jl&&(!(2&Al)&&(Ml|=n),4===Ol&&sc(e,Ll)),rc(e,r),1===n&&0===Al&&!(1&t.mode)&&(Ul=Ze()+500,Bo&&qo()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),s=1<<i,l=o[i];-1===l?s&n&&!(s&r)||(o[i]=ft(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=pt(e,e===jl?Ll:0);if(0===r)null!==n&&Ke(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Ke(n),1===t)0===e.tag?function(e){Bo=!0,Uo(e)}(lc.bind(null,e)):Uo(lc.bind(null,e)),io((function(){!(6&Al)&&qo()})),n=null;else{switch(xt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=jc(n,oc.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function oc(e,t){if(Xl=-1,Jl=0,6&Al)throw Error(a(327));var n=e.callbackNode;if(kc()&&e.callbackNode!==n)return null;var r=pt(e,e===jl?Ll:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=gc(e,r);else{t=r;var o=Al;Al|=2;var i=mc();for(jl===e&&Ll===t||(ql=null,Ul=Ze()+500,pc(e,t));;)try{vc();break}catch(l){fc(e,l)}Ta(),El.current=i,Al=o,null!==Rl?t=0:(jl=null,Ll=0,t=Ol)}if(0!==t){if(2===t&&(0!==(o=mt(e))&&(r=o,t=ac(e,o))),1===t)throw n=Dl,pc(e,0),sc(e,r),rc(e,Ze()),n;if(6===t)sc(e,r);else{if(o=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!sr(a(),o))return!1}catch(s){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)||(t=gc(e,r),2===t&&(i=mt(e),0!==i&&(r=i,t=ac(e,i))),1!==t)))throw n=Dl,pc(e,0),sc(e,r),rc(e,Ze()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:wc(e,Bl,ql);break;case 3:if(sc(e,r),(130023424&r)===r&&10<(t=$l+500-Ze())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(wc.bind(null,e,Bl,ql),t);break}wc(e,Bl,ql);break;case 4:if(sc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*_l(r/1960))-r)){e.timeoutHandle=ro(wc.bind(null,e,Bl,ql),r);break}wc(e,Bl,ql);break;default:throw Error(a(329))}}}return rc(e,Ze()),e.callbackNode===n?oc.bind(null,e):null}function ac(e,t){var n=zl;return e.current.memoizedState.isDehydrated&&(pc(e,t).flags|=256),2!==(e=gc(e,t))&&(t=Bl,Bl=n,null!==t&&ic(t)),e}function ic(e){null===Bl?Bl=e:Bl.push.apply(Bl,e)}function sc(e,t){for(t&=~Fl,t&=~Ml,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function lc(e){if(6&Al)throw Error(a(327));kc();var t=pt(e,0);if(!(1&t))return rc(e,Ze()),null;var n=gc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=ac(e,r))}if(1===n)throw n=Dl,pc(e,0),sc(e,t),rc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,wc(e,Bl,ql),rc(e,Ze()),null}function cc(e,t){var n=Al;Al|=1;try{return e(t)}finally{0===(Al=n)&&(Ul=Ze()+500,Bo&&qo())}}function uc(e){null!==Kl&&0===Kl.tag&&!(6&Al)&&kc();var t=Al;Al|=1;var n=Tl.transition,r=yt;try{if(Tl.transition=null,yt=1,e)return e()}finally{yt=r,Tl.transition=n,!(6&(Al=t))&&qo()}}function dc(){Nl=Pl.current,Co(Pl)}function pc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Rl)for(n=Rl.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:Za(),Co(Ro),Co(jo),ri();break;case 5:Ja(r);break;case 4:Za();break;case 13:case 19:Co(ei);break;case 10:Aa(r.type._context);break;case 22:case 23:dc()}n=n.return}if(jl=e,Rl=e=Pc(e.current,null),Ll=Nl=t,Ol=0,Dl=null,Fl=Ml=Il=0,Bl=zl=null,null!==Na){for(t=0;t<Na.length;t++)if(null!==(r=(n=Na[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Na=null}return e}function fc(e,t){for(;;){var n=Rl;try{if(Ta(),oi.current=Xi,ui){for(var r=si.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ui=!1}if(ii=0,ci=li=si=null,di=!1,pi=0,Cl.current=null,null===n||null===n.return){Ol=1,Dl=t,Rl=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Ll,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,p=d.tag;if(!(1&d.mode||0!==p&&11!==p&&15!==p)){var f=d.alternate;f?(d.updateQueue=f.updateQueue,d.memoizedState=f.memoizedState,d.lanes=f.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=gs(s);if(null!==m){m.flags&=-257,bs(m,s,l,0,t),1&m.mode&&hs(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(!(1&t)){hs(i,u,t),hc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var b=gs(s);if(null!==b){!(65536&b.flags)&&(b.flags|=256),bs(b,s,l,0,t),ha(cs(c,l));break e}}i=c=cs(c,l),4!==Ol&&(Ol=2),null===zl?zl=[i]:zl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ua(i,fs(0,c,t));break e;case 1:l=c;var v=i.type,y=i.stateNode;if(!(128&i.flags||"function"!=typeof v.getDerivedStateFromError&&(null===y||"function"!=typeof y.componentDidCatch||null!==Vl&&Vl.has(y)))){i.flags|=65536,t&=-t,i.lanes|=t,Ua(i,ms(i,l,t));break e}}i=i.return}while(null!==i)}xc(n)}catch(x){t=x,Rl===n&&null!==n&&(Rl=n=n.return);continue}break}}function mc(){var e=El.current;return El.current=Xi,null===e?Xi:e}function hc(){0!==Ol&&3!==Ol&&2!==Ol||(Ol=4),null===jl||!(268435455&Il)&&!(268435455&Ml)||sc(jl,Ll)}function gc(e,t){var n=Al;Al|=2;var r=mc();for(jl===e&&Ll===t||(ql=null,pc(e,t));;)try{bc();break}catch(o){fc(e,o)}if(Ta(),Al=n,El.current=r,null!==Rl)throw Error(a(261));return jl=null,Ll=0,Ol}function bc(){for(;null!==Rl;)yc(Rl)}function vc(){for(;null!==Rl&&!Qe();)yc(Rl)}function yc(e){var t=Sl(e.alternate,e,Nl);e.memoizedProps=e.pendingProps,null===t?xc(e):Rl=t,Cl.current=null}function xc(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ks(n,t)))return n.flags&=32767,void(Rl=n);if(null===e)return Ol=6,void(Rl=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Ws(n,t,Nl)))return void(Rl=n);if(null!==(t=t.sibling))return void(Rl=t);Rl=t=e}while(null!==t);0===Ol&&(Ol=5)}function wc(e,t,n){var r=yt,o=Tl.transition;try{Tl.transition=null,yt=1,function(e,t,n,r){do{kc()}while(null!==Kl);if(6&Al)throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===jl&&(Rl=jl=null,Ll=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Wl||(Wl=!0,jc(tt,(function(){return kc(),null}))),i=!!(15990&n.flags),!!(15990&n.subtreeFlags)||i){i=Tl.transition,Tl.transition=null;var s=yt;yt=1;var l=Al;Al|=4,Cl.current=null,function(e,t){if(eo=Ht,fr(e=pr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(w){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var m;p!==n||0!==o&&3!==p.nodeType||(l=s+o),p!==i||0!==r&&3!==p.nodeType||(c=s+r),3===p.nodeType&&(s+=p.nodeValue.length),null!==(m=p.firstChild);)f=p,p=m;for(;;){if(p===e)break t;if(f===n&&++u===o&&(l=s),f===i&&++d===r&&(c=s),null!==(m=p.nextSibling))break;f=(p=f).parentNode}p=m}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Xs=t;null!==Xs;)if(e=(t=Xs).child,1028&t.subtreeFlags&&null!==e)e.return=t,Xs=e;else for(;null!==Xs;){t=Xs;try{var h=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,b=h.memoizedState,v=t.stateNode,y=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:ns(t.type,g),b);v.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var x=t.stateNode.containerInfo;1===x.nodeType?x.textContent="":9===x.nodeType&&x.documentElement&&x.removeChild(x.documentElement);break;default:throw Error(a(163))}}catch(w){_c(t,t.return,w)}if(null!==(e=t.sibling)){e.return=t.return,Xs=e;break}Xs=t.return}h=tl,tl=!1}(e,n),gl(n,e),mr(to),Ht=!!eo,to=eo=null,e.current=n,vl(n,e,o),Ye(),Al=l,yt=s,Tl.transition=i}else e.current=n;if(Wl&&(Wl=!1,Kl=e,Ql=o),i=e.pendingLanes,0===i&&(Vl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,!(128&~e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Hl)throw Hl=!1,e=Gl,Gl=null,e;!!(1&Ql)&&0!==e.tag&&kc(),i=e.pendingLanes,1&i?e===Zl?Yl++:(Yl=0,Zl=e):Yl=0,qo()}(e,t,n,r)}finally{Tl.transition=o,yt=r}return null}function kc(){if(null!==Kl){var e=xt(Ql),t=Tl.transition,n=yt;try{if(Tl.transition=null,yt=16>e?16:e,null===Kl)var r=!1;else{if(e=Kl,Kl=null,Ql=0,6&Al)throw Error(a(331));var o=Al;for(Al|=4,Xs=e.current;null!==Xs;){var i=Xs,s=i.child;if(16&Xs.flags){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Xs=u;null!==Xs;){var d=Xs;switch(d.tag){case 0:case 11:case 15:nl(8,d,i)}var p=d.child;if(null!==p)p.return=d,Xs=p;else for(;null!==Xs;){var f=(d=Xs).sibling,m=d.return;if(al(d),d===u){Xs=null;break}if(null!==f){f.return=m,Xs=f;break}Xs=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var b=g.sibling;g.sibling=null,g=b}while(null!==g)}}Xs=i}}if(2064&i.subtreeFlags&&null!==s)s.return=i,Xs=s;else e:for(;null!==Xs;){if(2048&(i=Xs).flags)switch(i.tag){case 0:case 11:case 15:nl(9,i,i.return)}var v=i.sibling;if(null!==v){v.return=i.return,Xs=v;break e}Xs=i.return}}var y=e.current;for(Xs=y;null!==Xs;){var x=(s=Xs).child;if(2064&s.subtreeFlags&&null!==x)x.return=s,Xs=x;else e:for(s=y;null!==Xs;){if(2048&(l=Xs).flags)try{switch(l.tag){case 0:case 11:case 15:rl(9,l)}}catch(k){_c(l,l.return,k)}if(l===s){Xs=null;break e}var w=l.sibling;if(null!==w){w.return=l.return,Xs=w;break e}Xs=l.return}}if(Al=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(k){}r=!0}return r}finally{yt=n,Tl.transition=t}}return!1}function Sc(e,t,n){e=Ba(e,t=fs(0,t=cs(n,t),1),1),t=ec(),null!==e&&(bt(e,1,t),rc(e,t))}function _c(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Vl||!Vl.has(r))){t=Ba(t,e=ms(t,e=cs(n,e),1),1),e=ec(),null!==t&&(bt(t,1,e),rc(t,e));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,jl===e&&(Ll&n)===n&&(4===Ol||3===Ol&&(130023424&Ll)===Ll&&500>Ze()-$l?pc(e,0):Fl|=n),rc(e,t)}function Cc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Da(e,t))&&(bt(e,t,n),rc(e,n))}function Tc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function Ac(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Cc(e,n)}function jc(e,t){return We(e,t)}function Rc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lc(e,t,n,r){return new Rc(e,t,n,r)}function Nc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Pc(e,t){var n=e.alternate;return null===n?((n=Lc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Oc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Nc(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case S:return Dc(n.children,o,i,t);case _:s=8,o|=8;break;case E:return(e=Lc(12,n,t,2|o)).elementType=E,e.lanes=i,e;case j:return(e=Lc(13,n,t,o)).elementType=j,e.lanes=i,e;case R:return(e=Lc(19,n,t,o)).elementType=R,e.lanes=i,e;case P:return Ic(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:s=10;break e;case T:s=9;break e;case A:s=11;break e;case L:s=14;break e;case N:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Lc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Lc(7,e,r,t)).lanes=n,e}function Ic(e,t,n,r){return(e=Lc(22,e,r,t)).elementType=P,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Lc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Lc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Bc(e,t,n,r,o,a,i,s,l){return e=new zc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Lc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ma(a),e}function $c(e){if(!e)return Ao;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Po(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Po(n))return Io(e,n,t)}return t}function Uc(e,t,n,r,o,a,i,s,l){return(e=Bc(n,r,!0,e,0,a,0,s,l)).context=$c(null),n=e.current,(a=za(r=ec(),o=tc(n))).callback=null!=t?t:null,Ba(n,a,o),e.current.lanes=o,bt(e,o,r),rc(e,r),e}function qc(e,t,n,r){var o=t.current,a=ec(),i=tc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=za(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ba(o,t,i))&&(nc(e,o,i,a),$a(e,o,i)),i}function Hc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Gc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Vc(e,t){Gc(e,t),(e=e.alternate)&&Gc(e,t)}Sl=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Ro.current)ys=!0;else{if(!(e.lanes&n||128&t.flags))return ys=!1,function(e,t,n){switch(t.tag){case 3:js(t),ma();break;case 5:Xa(t);break;case 1:Po(t.type)&&Mo(t);break;case 4:Ya(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(Sa,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(ei,1&ei.current),t.flags|=128,null):n&t.child.childLanes?Ms(e,t,n):(To(ei,1&ei.current),null!==(e=Hs(e,t,n))?e.sibling:null);To(ei,1&ei.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return Us(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,_s(e,t,n)}return Hs(e,t,n)}(e,t,n);ys=!!(131072&e.flags)}else ys=!1,aa&&1048576&t.flags&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;qs(e,t),e=t.pendingProps;var o=No(t,jo.current);Ra(t,n),o=gi(null,t,r,e,o,n);var i=bi();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Po(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ma(t),o.updater=os,t.stateNode=o,o._reactInternals=t,ls(t,r,e,n),t=As(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),xs(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(qs(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Nc(e)?1:0;if(null!=e){if((e=e.$$typeof)===A)return 11;if(e===L)return 14}return 2}(r),e=ns(r,e),o){case 0:t=Cs(null,t,r,e,n);break e;case 1:t=Ts(null,t,r,e,n);break e;case 11:t=ws(null,t,r,e,n);break e;case 14:t=ks(null,t,r,ns(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Cs(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 1:return r=t.type,o=t.pendingProps,Ts(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 3:e:{if(js(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Fa(e,t),qa(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Rs(e,t,r,n,o=cs(Error(a(423)),t));break e}if(r!==o){t=Rs(e,t,r,n,o=cs(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=ka(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ma(),r===o){t=Hs(e,t,n);break e}xs(e,t,r,n)}t=t.child}return t;case 5:return Xa(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),Es(e,t),xs(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Ms(e,t,n);case 4:return Ya(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=wa(t,null,r,n):xs(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,ws(e,t,r,o=t.elementType===r?o:ns(r,o),n);case 7:return xs(e,t,t.pendingProps,n),t.child;case 8:case 12:return xs(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,To(Sa,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!Ro.current){t=Hs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=za(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),ja(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),ja(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}xs(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ra(t,n),r=r(o=La(o)),t.flags|=1,xs(e,t,r,n),t.child;case 14:return o=ns(r=t.type,t.pendingProps),ks(e,t,r,o=ns(r.type,o),n);case 15:return Ss(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ns(r,o),qs(e,t),t.tag=1,Po(r)?(e=!0,Mo(t)):e=!1,Ra(t,n),is(t,r,o),ls(t,r,o,n),As(null,t,r,!0,e,n);case 19:return Us(e,t,n);case 22:return _s(e,t,n)}throw Error(a(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Kc(e){this._internalRoot=e}function Qc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Xc(){}function Jc(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Hc(i);s.call(e)}}qc(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Hc(i);a.call(e)}}var i=Uc(t,r,e,0,null,!1,0,"",Xc);return e._reactRootContainer=i,e[ho]=i.current,Ur(8===e.nodeType?e.parentNode:e),uc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Hc(l);s.call(e)}}var l=Bc(e,0,!1,null,0,!1,0,"",Xc);return e._reactRootContainer=l,e[ho]=l.current,Ur(8===e.nodeType?e.parentNode:e),uc((function(){qc(t,l,n,r)})),l}(n,t,e,o,r);return Hc(i)}Qc.prototype.render=Kc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));qc(e,t,null,null)},Qc.prototype.unmount=Kc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uc((function(){qc(null,e,null,null)})),t[ho]=null}},Qc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Pt.length&&0!==t&&t<Pt[n].priority;n++);Pt.splice(n,0,e),0===n&&Mt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(vt(t,1|n),rc(t,Ze()),!(6&Al)&&(Ul=Ze()+500,qo()))}break;case 13:uc((function(){var t=Da(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Vc(e,1)}},kt=function(e){if(13===e.tag){var t=Da(e,134217728);if(null!==t)nc(t,e,134217728,ec());Vc(e,134217728)}},St=function(e){if(13===e.tag){var t=tc(e),n=Da(e,t);if(null!==n)nc(n,e,t,ec());Vc(e,t)}},_t=function(){return yt},Et=function(e,t){var n=yt;try{return yt=e,t()}finally{yt=n}},ke=function(e,t,n){switch(t){case"input":if(X(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=ko(r);if(!o)throw Error(a(90));W(r),X(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Ae=cc,je=uc;var eu={usingClientEntryPoint:!1,Events:[xo,wo,ko,Ce,Te,cc]},tu={findFiberByHostInstance:yo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:x.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{ot=ru.inject(nu),at=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:k,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(a(299));var n=!1,r="",o=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Bc(e,1,!1,null,0,n,0,r,o),e[ho]=t.current,Ur(8===e.nodeType?e.parentNode:e),new Kc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(a(200));return Jc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=Uc(t,null,e,1,null!=n?n:null,o,0,i,s),e[ho]=t.current,Ur(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Qc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(a(200));return Jc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(a(40));return!!e._reactRootContainer&&(uc((function(){Jc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ho]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return Jc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),s=n.n(i),l=n(311),c=n.n(l),u=n(2833),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},x=Object.keys(g).map((function(e){return g[e]})),w={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(w).reduce((function(e,t){return e[w[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},_=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},E=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},A=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var s=a[i],l=p({},r[s],o[s]);r[s]=l}return e}),[]).reverse()},j=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},R=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},P=[g.NOSCRIPT,g.SCRIPT,g.STYLE],O=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[w[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=w[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=R(t);return o?"<"+e+' data-rh="true" '+o+">"+O(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+O(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+O(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=L(e.metaTags,y),a=L(t,b),i=L(n,v);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,o.priority),M(g.LINK,a.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,p,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:l,titleAttributes:c},r)}},B=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),W(g.TITLE,t)}(u,d);var p={baseTag:V(g.BASE,n),linkTags:V(g.LINK,o),metaTags:V(g.META,a),noscriptTags:V(g.NOSCRIPT,i),scriptTags:V(g.SCRIPT,l),styleTags:V(g.STYLE,c)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)})),t&&t(),s(e,f,m)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:A(g.LINK,["rel","href"],e),metaTags:A(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:E(e),scriptTags:A(g.SCRIPT,["src","innerHTML"],e),styleTags:A(g.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:j(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame((function(){K(t,(function(){Q=null}))})):(K(t),Q=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case g.BODY:return p({},o,{bodyAttributes:p({},a)});case g.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(x.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+x.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=h(r,Z),s=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Y,p({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,x=n?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case g:case h:case l:return e;default:return t}}case o:return t}}}function k(e){return w(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=g,t.Memo=h,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===c},t.isContextProvider=function(e){return w(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===p},t.isFragment=function(e){return w(e)===a},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===h},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===s},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b)},t.typeOf=w},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(6540),l=[],c=[];var u=s.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return l.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),p=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextType",u),p}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return s.createElement(u.Provider,{value:{report:this.props.report}},s.Children.only(this.props.children))},t}(s.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(l).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>s});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>x});var r=n(6347),o=n(2892),a=n(6540),i=n(1513),s=n(8168),l=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var p=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},m=function(e){return e},h=a.forwardRef;void 0===h&&(h=m);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.A)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=m!==h&&t||n,a.createElement("a",u)}));var b=h((function(e,t){var n=e.component,o=void 0===n?g:n,u=e.replace,d=e.to,b=e.innerRef,v=(0,l.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=f(p(d,e.location),e.location),l=r?n.createHref(r):"",g=(0,s.A)({},v,{href:l,navigate:function(){var t=p(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(f(t));(u||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||b:g.innerRef=b,a.createElement(o,g)}))})),v=function(e){return e},y=a.forwardRef;void 0===y&&(y=v);var x=y((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,x=e.location,w=e.sensitive,k=e.strict,S=e.style,_=e.to,E=e.innerRef,C=(0,l.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=x||e.location,i=f(p(_,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.B6)(n.pathname,{path:T,exact:h,sensitive:w,strict:k}):null,j=!!(g?g(A,n):A),R="function"==typeof m?m(j):m,L="function"==typeof S?S(j):S;j&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,u),L=(0,s.A)({},L,d));var N=(0,s.A)({"aria-current":j&&o||null,className:R,style:L,to:i},C);return v!==y?N.ref=t||E:N.innerRef=E,a.createElement(b,N)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>y,W6:()=>N,XZ:()=>v,dO:()=>R,qh:()=>_,zy:()=>P});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(1513),l=n(1561),c=n(8168),u=n(5302),d=n.n(u),p=(n(4363),n(8587)),f=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},o.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),v=g("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var x={},w=1e4,k=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=x[n]||(x[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return k<w&&(r[e]=a,k++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],p=l.slice(1),f=e===u;return a&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,a=(0,c.A)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(v.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.AO)(e)}function A(e){return function(){(0,l.A)(!1)}}function j(){}o.Component;var R=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(v.Consumer,null,(function(t){t||(0,l.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(a.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var L=o.useContext;function N(){return L(b)}function P(){return L(v).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function v(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=b.prototype;var x=y.prototype=new v;x.constructor=y,h(x,b.prototype),x.isPureReactComponent=!0;var w=Array.isArray,k=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function A(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function j(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+A(l,0):a,w(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),j(i,t,o,"",(function(e){return e}))):null!=i&&(C(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",w(e))for(var c=0;c<e.length;c++){var u=a+A(s=e[c],c);l+=j(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=j(s=s.value,t,o,u=a+A(s,c++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function R(e,t,n){if(null==e)return e;var r=[],o=0;return j(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function L(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var N={current:null},P={transition:null},O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:P,ReactCurrentOwner:S};function D(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:R,forEach:function(e,t,n){R(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return R(e,(function(){t++})),t},toArray:function(e){return R(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=i,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.act=D,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=h({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)k.call(t,c)&&!_.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=D,t.useCallback=function(e,t){return N.current.useCallback(e,t)},t.useContext=function(e){return N.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return N.current.useDeferredValue(e)},t.useEffect=function(e,t){return N.current.useEffect(e,t)},t.useId=function(){return N.current.useId()},t.useImperativeHandle=function(e,t,n){return N.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return N.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return N.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return N.current.useMemo(e,t)},t.useReducer=function(e,t,n){return N.current.useReducer(e,t,n)},t.useRef=function(e){return N.current.useRef(e)},t.useState=function(e){return N.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return N.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return N.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,p=null,f=3,m=!1,h=!1,g=!1,b="function"==typeof setTimeout?setTimeout:null,v="function"==typeof clearTimeout?clearTimeout:null,y="undefined"!=typeof setImmediate?setImmediate:null;function x(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function w(e){if(g=!1,x(e),!h)if(null!==r(c))h=!0,P(k);else{var t=r(u);null!==t&&O(w,t.startTime-e)}}function k(e,n){h=!1,g&&(g=!1,v(C),C=-1),m=!0;var a=f;try{for(x(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!j());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var s=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?p.callback=s:p===r(c)&&o(c),x(n)}else o(c);p=r(c)}if(null!==p)var l=!0;else{var d=r(u);null!==d&&O(w,d.startTime-n),l=!1}return l}finally{p=null,f=a,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,_=!1,E=null,C=-1,T=5,A=-1;function j(){return!(t.unstable_now()-A<T)}function R(){if(null!==E){var e=t.unstable_now();A=e;var n=!0;try{n=E(!0,e)}finally{n?S():(_=!1,E=null)}}else _=!1}if("function"==typeof y)S=function(){y(R)};else if("undefined"!=typeof MessageChannel){var L=new MessageChannel,N=L.port2;L.port1.onmessage=R,S=function(){N.postMessage(null)}}else S=function(){b(R,0)};function P(e){E=e,_||(_=!0,S())}function O(e,n){C=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,P(k))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):T=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(v(C),C=-1):g=!0,O(w,a-i))):(e.sortIndex=s,n(c,e),h||m||(h=!0,P(k))),e},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Routr Docs",tagline:"The future of programmable SIP servers",favicon:"img/favicon.ico",url:"https://routr.io",baseUrl:"/",organizationName:"fonoster",projectName:"routr",onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",onBrokenAnchors:"ignore",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{lastVersion:"current",versions:{current:{label:"2.11.5",path:"2.11.5"}},sidebarPath:"/home/runner/work/routr/routr/docs/sidebars.js",editUrl:"https://github.com/fonoster/routr-website/edit/main"},theme:{customCss:"/home/runner/work/routr/routr/docs/src/css/custom.css"},gtag:{trackingID:"G-JX93S6PKN4",anonymizeIP:!0}}]],plugins:[["@docusaurus/plugin-client-redirects",{redirects:[{to:"/docs/2.0.0/overview/introduction",from:["/docs/overview/introduction","/docs"]},{to:"/docs/2.0.0/contributing",from:["/docs/contributing"]},{to:"/docs/2.0.0/community",from:["/docs/community"]},{to:"/docs/2.0.0/development/introduction",from:["/docs/development/introduction"]}]}]],themeConfig:{algolia:{appId:"VLT67PBOP0",apiKey:"ac3a064eec614a9ade617bafd5de55de",indexName:"routr",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},image:"img/docusaurus-social-card.jpg",navbar:{logo:{alt:"Routr Logo",src:"img/logo.svg"},items:[{type:"docSidebar",sidebarId:"tutorialSidebar",position:"left",label:"Docs"},{href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers",label:"Training",position:"left"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!0,dropdownItemsBefore:[],dropdownItemsAfter:[]},{href:"https://github.com/fonoster/routr",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Quick Links",items:[{label:"Docs",to:"/docs/2.0.0/overview/introduction"},{label:"Training",href:"https://fonoster.gumroad.com/l/the-future-of-programmable-sip-servers"}]},{title:"Community",items:[{label:"GitHub Discussions",href:"https://github.com/fonoster/routr/discussions"},{label:"Discord",href:"https://discord.gg/4QWgSz4hTC"},{label:"Twitter",href:"https://twitter.com/fonoster"}]},{title:"More",items:[{label:"Blog",to:"https://learn.fonoster.com/blog"},{label:"GitHub",href:"https://github.com/fonoster/routr"}]}],copyright:"Copyright \xa9 2024 Fonoster, Inc. Built with Docusaurus."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!0,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},8215:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},5066:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},8181:(e,t,n)=>{"use strict";n.d(t,{f4:()=>J,My:()=>C});var r=n(6540);function o(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=o(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}const a=function(){for(var e,t,n=0,r="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=o(e))&&(r&&(r+=" "),r+=t);return r};var i,s,l,c,u,d=Object.create,p=Object.defineProperty,f=Object.defineProperties,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,g=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable,w=(e,t,n)=>t in e?p(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,k=(e,t)=>{for(var n in t||(t={}))y.call(t,n)&&w(e,n,t[n]);if(b)for(var n of b(t))x.call(t,n)&&w(e,n,t[n]);return e},S=(e,t)=>f(e,h(t)),_=(e,t)=>{var n={};for(var r in e)y.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&x.call(e,r)&&(n[r]=e[r]);return n},E=(i={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new s;return l(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,s,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var m=0;m<f.length;++m){if(d&&d.cause==p+","+m)return;var h=f[m],g=h.inside,b=!!h.lookbehind,v=!!h.greedy,y=h.alias;if(v&&!h.pattern.global){var x=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,x+"g")}for(var w=h.pattern||h,k=s.next,S=u;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,C=1;if(v){if(!(E=a(w,S,e,b))||E.index>=e.length)break;var T=E.index,A=E.index+E[0].length,j=S;for(j+=k.value.length;T>=j;)j+=(k=k.next).value.length;if(S=j-=k.value.length,k.value instanceof o)continue;for(var R=k;R!==t.tail&&(j<A||"string"==typeof R.value);R=R.next)C++,j+=R.value.length;C--,_=e.slice(S,j),E.index-=S}else if(!(E=a(w,0,_,b)))continue;T=E.index;var L=E[0],N=_.slice(0,T),P=_.slice(T+L.length),O=S+_.length;d&&O>d.reach&&(d.reach=O);var D=k.prev;if(N&&(D=l(t,D,N),S+=N.length),c(t,D,C),k=l(t,D,new o(p,g?r.tokenize(L,g):L,y,L)),P&&l(t,k,P),C>1){var I={cause:p+","+m,reach:O};i(e,t,n,k.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return s||(0,i[g(i)[0]])((s={exports:{}}).exports,s),s.exports}),C=((e,t,n)=>(n=null!=e?d(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of g(t))y.call(e,o)||o===n||p(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(E());C.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},C.languages.markup.tag.inside["attr-value"].inside.entity=C.languages.markup.entity,C.languages.markup.doctype.inside["internal-subset"].inside=C.languages.markup,C.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(C.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:C.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:C.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},C.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(C.languages.markup.tag,"addAttribute",{value:function(e,t){C.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:C.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),C.languages.html=C.languages.markup,C.languages.mathml=C.languages.markup,C.languages.svg=C.languages.markup,C.languages.xml=C.languages.extend("markup",{}),C.languages.ssml=C.languages.xml,C.languages.atom=C.languages.xml,C.languages.rss=C.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(C),C.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},C.languages.javascript=C.languages.extend("clike",{"class-name":[C.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),C.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,C.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:C.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:C.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:C.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:C.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:C.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),C.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:C.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),C.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),C.languages.markup&&(C.languages.markup.tag.addInlined("script","javascript"),C.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),C.languages.js=C.languages.javascript,C.languages.actionscript=C.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),C.languages.actionscript["class-name"].alias="function",delete C.languages.actionscript.parameter,delete C.languages.actionscript["literal-property"],C.languages.markup&&C.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:C.languages.markup}}),c=/#(?!\{).+/,u={pattern:/#\{[^}]+\}/,alias:"variable"},(l=C).languages.coffeescript=l.languages.extend("javascript",{comment:c,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:u}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),l.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:c,interpolation:u}}}),l.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:l.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:u}}]}),l.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete l.languages.coffeescript["template-string"],l.languages.coffee=l.languages.coffeescript,function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(C),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(C),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(C),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(C),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n)):s[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(C),C.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:C.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},C.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<o.length)){var s=p(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&0<=o.indexOf(c.content)&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&0==--o)return a}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),C.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,l,p,f,m,h,g,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++c,l=h.substring(0,g),m=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(m,f)).length&&((p=[1,1]).push.apply(p,s(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,m),f=h.substring(g+i.length),m=[],l&&m.push(l),m.push(p),f&&(t(h=[f]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(m)),a+=m.length-1):b.content=m)):(g=b.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,s,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(C),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(C),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(C),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(C),C.languages.n4js=C.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),C.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),C.languages.n4jsd=C.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(C),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(C),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(C),C.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},C.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=C.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(C),C.languages.c=C.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),C.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),C.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},C.languages.c.string],char:C.languages.c.char,comment:C.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:C.languages.c}}}}),C.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete C.languages.c.boolean,C.languages.objectivec=C.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete C.languages.objectivec["class-name"],C.languages.objc=C.languages.objectivec,C.languages.reason=C.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),C.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete C.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(C),C.languages.go=C.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),C.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete C.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(C),C.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},C.languages.python["string-interpolation"].inside.interpolation.inside.rest=C.languages.python,C.languages.py=C.languages.python;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>A,duotoneLight:()=>j,github:()=>R,jettwaveDark:()=>q,jettwaveLight:()=>H,nightOwl:()=>L,nightOwlLight:()=>N,oceanicNext:()=>D,okaidia:()=>I,oneDark:()=>G,oneLight:()=>V,palenight:()=>M,shadesOfPurple:()=>F,synthwave84:()=>z,ultramin:()=>B,vsDark:()=>$,vsLight:()=>U});var T={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},A={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},j={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},R={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},L={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},N={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},P="#c5a5c5",O="#8dc891",D={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:P}},{types:["attr-value"],style:{color:O}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:O}},{types:["punctuation"],style:{color:O}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:P}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},I={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},M={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},F={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},z={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},B={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},$={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},U={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},q={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},H={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},G={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},V={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},W=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=k(k({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=S(k({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Q=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},Y=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},Z=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Y(c,u.type),u.alias&&(c=Y(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(K),p=d.length;s.push({types:c,content:d[0]});for(let t=1;t<p;t++)Q(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return Q(s),l},X=({children:e,language:t,code:n,theme:o,prism:i})=>{const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(W(t,e)),a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)((()=>{t===a.current&&e===i.current||(a.current=t,i.current=e,o(W(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:i}=n,s=_(n,["className","style","line"]);const l=S(k({},s),{className:a("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=k(k({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,r.useCallback)((e=>{var n=e,{token:r,className:o,style:i}=n,s=_(n,["token","className","style"]);const l=S(k({},s),{className:a("token",...r.types,o),children:r.content,style:t(r)});return null!=i&&(l.style=k(k({},l.style||{}),i)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const a=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return Z([t]);const e={code:t,grammar:n,language:o,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),Z(e.tokens)}),[t,n,o])})({prism:i,language:s,code:n,grammar:i.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,S(k({},e),{prism:e.prism||C,theme:e.theme||$,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/search-5de":{"__comp":"1a4e3797","__context":{"plugin":"c141421f"}},"/docs-c22":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs/1.x.x-208":{"__comp":"a7bd4aaa","__props":"6e8a13e2"},"/docs/1.x.x-12a":{"__comp":"a94703ab"},"/docs/1.x.x/administration/cli/cheatsheet-c34":{"__comp":"17896441","content":"b5de05fe"},"/docs/1.x.x/administration/cli/installation-e9c":{"__comp":"17896441","content":"5514a4b8"},"/docs/1.x.x/administration/cli/remote-access-e05":{"__comp":"17896441","content":"bc1a89ad"},"/docs/1.x.x/administration/webconsole-4eb":{"__comp":"17896441","content":"093b4e4f"},"/docs/1.x.x/api/agents/create-e17":{"__comp":"17896441","content":"9840208a"},"/docs/1.x.x/api/agents/delete-a85":{"__comp":"17896441","content":"1cd31f12"},"/docs/1.x.x/api/agents/get-8fe":{"__comp":"17896441","content":"ec64d50d"},"/docs/1.x.x/api/agents/list-36b":{"__comp":"17896441","content":"6c35bbce"},"/docs/1.x.x/api/agents/update-412":{"__comp":"17896441","content":"19dd4331"},"/docs/1.x.x/api/config/get-17e":{"__comp":"17896441","content":"71153375"},"/docs/1.x.x/api/config/update-cd2":{"__comp":"17896441","content":"b4dd6982"},"/docs/1.x.x/api/domains/create-812":{"__comp":"17896441","content":"9d10a623"},"/docs/1.x.x/api/domains/delete-590":{"__comp":"17896441","content":"40f2f3c6"},"/docs/1.x.x/api/domains/get-5d4":{"__comp":"17896441","content":"d3c35fce"},"/docs/1.x.x/api/domains/list-728":{"__comp":"17896441","content":"8a9effda"},"/docs/1.x.x/api/domains/update-92e":{"__comp":"17896441","content":"b1e2c3e5"},"/docs/1.x.x/api/gateways/create-8b7":{"__comp":"17896441","content":"943e77c3"},"/docs/1.x.x/api/gateways/delete-801":{"__comp":"17896441","content":"40f2a0b4"},"/docs/1.x.x/api/gateways/get-869":{"__comp":"17896441","content":"b8ab588d"},"/docs/1.x.x/api/gateways/list-fda":{"__comp":"17896441","content":"5e82a060"},"/docs/1.x.x/api/gateways/update-c13":{"__comp":"17896441","content":"9a5a69d5"},"/docs/1.x.x/api/location/create-095":{"__comp":"17896441","content":"4e27cd47"},"/docs/1.x.x/api/location/delete-f70":{"__comp":"17896441","content":"646468fb"},"/docs/1.x.x/api/location/list-c04":{"__comp":"17896441","content":"0f2bd920"},"/docs/1.x.x/api/numbers/create-41c":{"__comp":"17896441","content":"99f83bea"},"/docs/1.x.x/api/numbers/delete-630":{"__comp":"17896441","content":"4d0c799d"},"/docs/1.x.x/api/numbers/get-eb2":{"__comp":"17896441","content":"ed519cbf"},"/docs/1.x.x/api/numbers/list-156":{"__comp":"17896441","content":"6c14cd7d"},"/docs/1.x.x/api/numbers/update-363":{"__comp":"17896441","content":"4dcd5895"},"/docs/1.x.x/api/overview-b1f":{"__comp":"17896441","content":"321dfeeb"},"/docs/1.x.x/api/peers/create-2a5":{"__comp":"17896441","content":"411db075"},"/docs/1.x.x/api/peers/delete-c5e":{"__comp":"17896441","content":"a552b93b"},"/docs/1.x.x/api/peers/get-c96":{"__comp":"17896441","content":"9a4dfeaa"},"/docs/1.x.x/api/peers/list-5a6":{"__comp":"17896441","content":"bc2f9ced"},"/docs/1.x.x/api/peers/update-630":{"__comp":"17896441","content":"95069fb2"},"/docs/1.x.x/api/registry-cac":{"__comp":"17896441","content":"72607e62"},"/docs/1.x.x/api/status/get-7cd":{"__comp":"17896441","content":"9799683e"},"/docs/1.x.x/api/status/update-b46":{"__comp":"17896441","content":"7df8ae3f"},"/docs/1.x.x/api/sys/info-885":{"__comp":"17896441","content":"1b166456"},"/docs/1.x.x/api/sys/logs-630":{"__comp":"17896441","content":"6e2907e5"},"/docs/1.x.x/api/token-c10":{"__comp":"17896441","content":"656951a7"},"/docs/1.x.x/concepts-a03":{"__comp":"17896441","content":"35bee977"},"/docs/1.x.x/configuration/agents-6dc":{"__comp":"17896441","content":"a30498ab"},"/docs/1.x.x/configuration/domains-c64":{"__comp":"17896441","content":"81e5f1d0"},"/docs/1.x.x/configuration/gateways-86e":{"__comp":"17896441","content":"876e022a"},"/docs/1.x.x/configuration/general-c35":{"__comp":"17896441","content":"3e7ceef0"},"/docs/1.x.x/configuration/numbers-439":{"__comp":"17896441","content":"7efb1a82"},"/docs/1.x.x/configuration/peers-4b1":{"__comp":"17896441","content":"ee7973d9"},"/docs/1.x.x/configuration/users-afb":{"__comp":"17896441","content":"017ddd06"},"/docs/1.x.x/guides/basic-setup-3d5":{"__comp":"17896441","content":"da51cc8f"},"/docs/1.x.x/guides/routr-as-asterisk-frontend-7d5":{"__comp":"17896441","content":"09b719bb"},"/docs/1.x.x/guides/running-on-kubernetes-eee":{"__comp":"17896441","content":"1ea220c7"},"/docs/1.x.x/guides/running-with-docker-or-compose-770":{"__comp":"17896441","content":"23efd64d"},"/docs/1.x.x/guides/securing-the-signaling-path-734":{"__comp":"17896441","content":"a9d63626"},"/docs/1.x.x/introduction/community-ed0":{"__comp":"17896441","content":"e10372bb"},"/docs/1.x.x/introduction/comparison-b2f":{"__comp":"17896441","content":"bb373259"},"/docs/1.x.x/introduction/faq-ecc":{"__comp":"17896441","content":"a40a3312"},"/docs/1.x.x/introduction/glossary-831":{"__comp":"17896441","content":"918bfdcb"},"/docs/1.x.x/introduction/installation-425":{"__comp":"17896441","content":"3325c53c"},"/docs/1.x.x/introduction/media-f80":{"__comp":"17896441","content":"f3f39cc5"},"/docs/1.x.x/introduction/overview-f6c":{"__comp":"17896441","content":"a4cb0559"},"/docs/1.x.x/introduction/performance-tests/user-location-09d":{"__comp":"17896441","content":"7c32d245"},"/docs/1.x.x/introduction/roadmap-0a2":{"__comp":"17896441","content":"3a673d53"},"/docs/1.x.x/introduction/test-plan-9f3":{"__comp":"17896441","content":"759bfbe1"},"/docs/1.x.x/welcome-3fa":{"__comp":"17896441","content":"64332b0f"},"/docs/2.0.0-5a6":{"__comp":"a7bd4aaa","__props":"5f06ffd7"},"/docs/2.0.0-cd5":{"__comp":"a94703ab"},"/docs/2.0.0/changelog-159":{"__comp":"17896441","content":"7b98d5f9"},"/docs/2.0.0/community-94e":{"__comp":"17896441","content":"c3b57956"},"/docs/2.0.0/connect/command-line/ctl-fd9":{"__comp":"17896441","content":"157aa7fa"},"/docs/2.0.0/connect/command-line/overview-d4b":{"__comp":"17896441","content":"738c2db3"},"/docs/2.0.0/connect/concepts-2db":{"__comp":"17896441","content":"9bac311e"},"/docs/2.0.0/connect/home-or-office-setup-be1":{"__comp":"17896441","content":"a1c2ddfb"},"/docs/2.0.0/connect/introduction-ffc":{"__comp":"17896441","content":"0d48220f"},"/docs/2.0.0/connect/nodesdk/overview-593":{"__comp":"17896441","content":"ac1de8bb"},"/docs/2.0.0/connect/nodesdk/sdk-46a":{"__comp":"17896441","content":"b7547532"},"/docs/2.0.0/connect/quick-start/docker-abd":{"__comp":"17896441","content":"4f841ba9"},"/docs/2.0.0/connect/quick-start/kubernetes-716":{"__comp":"17896441","content":"4591c4c7"},"/docs/2.0.0/connect/securing-the-server-421":{"__comp":"17896441","content":"db24a52a"},"/docs/2.0.0/connect/sending-call-events-to-nats-984":{"__comp":"17896441","content":"f0fdb5a0"},"/docs/2.0.0/connect/webrtc-support-c64":{"__comp":"17896441","content":"99054fd6"},"/docs/2.0.0/contributing-f1d":{"__comp":"17896441","content":"6e84f360"},"/docs/2.0.0/development/alterations/methods-ac2":{"__comp":"17896441","content":"80948d28"},"/docs/2.0.0/development/alterations/overview-3be":{"__comp":"17896441","content":"1da39e10"},"/docs/2.0.0/development/building-a-chat-application-c00":{"__comp":"17896441","content":"a90f077e"},"/docs/2.0.0/development/building-a-middleware-e86":{"__comp":"17896441","content":"3d1fe28c"},"/docs/2.0.0/development/building-a-processor-884":{"__comp":"17896441","content":"ce58c4f8"},"/docs/2.0.0/development/building-a-scaip-processor-073":{"__comp":"17896441","content":"921a01ce"},"/docs/2.0.0/development/components/apiserver-d0b":{"__comp":"17896441","content":"1a5391ac"},"/docs/2.0.0/development/components/dispatcher-9e9":{"__comp":"17896441","content":"c9a0b018"},"/docs/2.0.0/development/components/edgeport-176":{"__comp":"17896441","content":"7a552015"},"/docs/2.0.0/development/components/location-830":{"__comp":"17896441","content":"80d7fb78"},"/docs/2.0.0/development/components/overview-a9d":{"__comp":"17896441","content":"4e8389ca"},"/docs/2.0.0/development/components/registry-5b0":{"__comp":"17896441","content":"09d90b28"},"/docs/2.0.0/development/components/requester-659":{"__comp":"17896441","content":"63bd238e"},"/docs/2.0.0/development/components/rtprelay-85f":{"__comp":"17896441","content":"92394f36"},"/docs/2.0.0/development/components/simpleauth-e74":{"__comp":"17896441","content":"335fd65a"},"/docs/2.0.0/development/custom-data-with-the-apiserver-352":{"__comp":"17896441","content":"97b3c809"},"/docs/2.0.0/development/development-mode-with-gitpod-733":{"__comp":"17896441","content":"638e7455"},"/docs/2.0.0/development/extending-the-ctl-a5d":{"__comp":"17896441","content":"8a5aafb8"},"/docs/2.0.0/development/introduction-eb8":{"__comp":"17896441","content":"c2140537"},"/docs/2.0.0/development/metrics-events-logs-and-traces-849":{"__comp":"17896441","content":"67679d6c"},"/docs/2.0.0/development/orchestration-with-docker-3cd":{"__comp":"17896441","content":"1b36d84b"},"/docs/2.0.0/development/orchestration-with-kubernetes-707":{"__comp":"17896441","content":"a3b8e457"},"/docs/2.0.0/development/quick-start-e66":{"__comp":"17896441","content":"99333fd2"},"/docs/2.0.0/development/testing-with-seet-3d3":{"__comp":"17896441","content":"fb8f7c97"},"/docs/2.0.0/faqs-848":{"__comp":"17896441","content":"c76972da"},"/docs/2.0.0/overview/architecture-842":{"__comp":"17896441","content":"9a5b155b"},"/docs/2.0.0/overview/concepts-6ba":{"__comp":"17896441","content":"ae057106"},"/docs/2.0.0/overview/deploy-with-docker-940":{"__comp":"17896441","content":"0457fa99"},"/docs/2.0.0/overview/introduction-63f":{"__comp":"17896441","content":"a0c4fcbf"},"/docs/2.0.0/tutorials/deploying-to-civo-with-helm-20c":{"__comp":"17896441","content":"fd5b422d"},"/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser-5c4":{"__comp":"17896441","content":"c0ec735e"},"/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes-741":{"__comp":"17896441","content":"295fe310"},"/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr-28d":{"__comp":"17896441","content":"1caae7f3"},"/docs/2.11.5-eea":{"__comp":"a7bd4aaa","__props":"5816b036"},"/docs/2.11.5-43c":{"__comp":"a94703ab"},"/docs/2.11.5/changelog-cd7":{"__comp":"17896441","content":"9beb87c2"},"/docs/2.11.5/community-2eb":{"__comp":"17896441","content":"5ef0e9d6"},"/docs/2.11.5/connect/command-line/ctl-c09":{"__comp":"17896441","content":"ed175a37"},"/docs/2.11.5/connect/command-line/overview-fb8":{"__comp":"17896441","content":"ea5491a0"},"/docs/2.11.5/connect/concepts-55e":{"__comp":"17896441","content":"5a1924d4"},"/docs/2.11.5/connect/home-or-office-setup-e01":{"__comp":"17896441","content":"2a36568f"},"/docs/2.11.5/connect/introduction-550":{"__comp":"17896441","content":"d7a9d534"},"/docs/2.11.5/connect/nodesdk/overview-7f4":{"__comp":"17896441","content":"8ac6f1f4"},"/docs/2.11.5/connect/nodesdk/sdk-52d":{"__comp":"17896441","content":"43d3d555"},"/docs/2.11.5/connect/quick-start/docker-6fb":{"__comp":"17896441","content":"f4357d2a"},"/docs/2.11.5/connect/quick-start/kubernetes-fe1":{"__comp":"17896441","content":"3c0cfdd0"},"/docs/2.11.5/connect/securing-the-server-789":{"__comp":"17896441","content":"f1b4aa58"},"/docs/2.11.5/connect/sending-call-events-to-nats-535":{"__comp":"17896441","content":"8613bfde"},"/docs/2.11.5/connect/webrtc-support-bb2":{"__comp":"17896441","content":"129db88c"},"/docs/2.11.5/contributing-926":{"__comp":"17896441","content":"4d54d076"},"/docs/2.11.5/development/alterations/methods-be6":{"__comp":"17896441","content":"39d73575"},"/docs/2.11.5/development/alterations/overview-e9e":{"__comp":"17896441","content":"b396445b"},"/docs/2.11.5/development/building-a-chat-application-b05":{"__comp":"17896441","content":"b3bbf2ca"},"/docs/2.11.5/development/building-a-middleware-576":{"__comp":"17896441","content":"956a4ea6"},"/docs/2.11.5/development/building-a-processor-6b7":{"__comp":"17896441","content":"92a92b88"},"/docs/2.11.5/development/building-a-scaip-processor-42b":{"__comp":"17896441","content":"26da1a01"},"/docs/2.11.5/development/components/apiserver-653":{"__comp":"17896441","content":"7cf72cd4"},"/docs/2.11.5/development/components/dispatcher-b3a":{"__comp":"17896441","content":"02617853"},"/docs/2.11.5/development/components/edgeport-fee":{"__comp":"17896441","content":"33664cb1"},"/docs/2.11.5/development/components/location-908":{"__comp":"17896441","content":"f5184ac4"},"/docs/2.11.5/development/components/overview-bc8":{"__comp":"17896441","content":"76273f75"},"/docs/2.11.5/development/components/registry-e95":{"__comp":"17896441","content":"bc843d59"},"/docs/2.11.5/development/components/requester-cee":{"__comp":"17896441","content":"c60c73ac"},"/docs/2.11.5/development/components/rtprelay-993":{"__comp":"17896441","content":"144994e6"},"/docs/2.11.5/development/components/simpleauth-6f9":{"__comp":"17896441","content":"210b7c69"},"/docs/2.11.5/development/custom-data-with-the-apiserver-c05":{"__comp":"17896441","content":"3f9d54d1"},"/docs/2.11.5/development/development-mode-with-gitpod-a94":{"__comp":"17896441","content":"ff3f7f2b"},"/docs/2.11.5/development/extending-the-ctl-afa":{"__comp":"17896441","content":"a7c6e145"},"/docs/2.11.5/development/introduction-b5a":{"__comp":"17896441","content":"6a8a88b7"},"/docs/2.11.5/development/metrics-events-logs-and-traces-ef0":{"__comp":"17896441","content":"54969ead"},"/docs/2.11.5/development/orchestration-with-docker-550":{"__comp":"17896441","content":"1ad9bfe0"},"/docs/2.11.5/development/orchestration-with-kubernetes-b10":{"__comp":"17896441","content":"21169ea0"},"/docs/2.11.5/development/quick-start-a7f":{"__comp":"17896441","content":"9fcefd11"},"/docs/2.11.5/development/testing-with-seet-a57":{"__comp":"17896441","content":"4e3cbe94"},"/docs/2.11.5/faqs-505":{"__comp":"17896441","content":"1ffdd7de"},"/docs/2.11.5/overview/architecture-a98":{"__comp":"17896441","content":"d72ac48e"},"/docs/2.11.5/overview/concepts-ba9":{"__comp":"17896441","content":"118e913f"},"/docs/2.11.5/overview/deploy-with-docker-c61":{"__comp":"17896441","content":"06896101"},"/docs/2.11.5/overview/introduction-754":{"__comp":"17896441","content":"8d7e75fb"},"/docs/2.11.5/tutorials/deploying-to-civo-with-helm-891":{"__comp":"17896441","content":"5a510007"},"/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser-4ce":{"__comp":"17896441","content":"c2ef5137"},"/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes-488":{"__comp":"17896441","content":"1a1a9e3d"},"/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr-a86":{"__comp":"17896441","content":"db70960d"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.6bdfffad.js.LICENSE.txt b/assets/js/main.ae0b9811.js.LICENSE.txt similarity index 100% rename from assets/js/main.6bdfffad.js.LICENSE.txt rename to assets/js/main.ae0b9811.js.LICENSE.txt diff --git a/assets/js/runtime~main.1e183b4a.js b/assets/js/runtime~main.1e183b4a.js new file mode 100644 index 000000000..400a73fa1 --- /dev/null +++ b/assets/js/runtime~main.1e183b4a.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){d=e[i][0],f=e[i][1],c=e[i][2];for(var t=!0,o=0;o<d.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,f,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"118e913f",49:"e10372bb",208:"1b166456",242:"295fe310",286:"d7a9d534",364:"54969ead",391:"5f06ffd7",468:"a0c4fcbf",529:"7c32d245",537:"321dfeeb",583:"5514a4b8",620:"8ac6f1f4",751:"1b36d84b",767:"7efb1a82",803:"b5de05fe",821:"646468fb",823:"4d0c799d",831:"3a673d53",898:"99333fd2",911:"5ef0e9d6",957:"c141421f",1071:"638e7455",1079:"a7c6e145",1080:"759bfbe1",1171:"144994e6",1214:"876e022a",1224:"943e77c3",1235:"a7456010",1238:"0457fa99",1304:"35bee977",1459:"4d54d076",1579:"c3b57956",1616:"fd5b422d",1703:"210b7c69",1780:"39d73575",1870:"918bfdcb",1922:"157aa7fa",1953:"b1e2c3e5",2080:"c2140537",2138:"1a4e3797",2172:"9bac311e",2333:"3f9d54d1",2358:"95069fb2",2401:"26da1a01",2405:"7df8ae3f",2433:"5a1924d4",2489:"c9a0b018",2506:"0f2bd920",2512:"63bd238e",2514:"ee7973d9",2607:"d3c35fce",2634:"c4f5d8e4",2692:"129db88c",2913:"7a552015",2918:"3d1fe28c",2964:"2a36568f",3094:"a1c2ddfb",3102:"9fcefd11",3191:"02617853",3244:"6a8a88b7",3296:"8613bfde",3383:"1ad9bfe0",3452:"335fd65a",3539:"9beb87c2",3578:"76273f75",3624:"43d3d555",3738:"06896101",3741:"8a9effda",3791:"fb8f7c97",3797:"bc843d59",3857:"a30498ab",4011:"ea5491a0",4013:"7b98d5f9",4050:"956a4ea6",4082:"b396445b",4101:"921a01ce",4126:"19dd4331",4133:"67679d6c",4161:"738c2db3",4236:"ed175a37",4306:"c0ec735e",4319:"f0fdb5a0",4366:"6e2907e5",4480:"3c0cfdd0",4682:"99f83bea",4714:"093b4e4f",4719:"8d7e75fb",4860:"5816b036",4862:"6c35bbce",5009:"656951a7",5056:"1cd31f12",5066:"80948d28",5188:"1caae7f3",5315:"4591c4c7",5365:"bc2f9ced",5366:"97b3c809",5387:"ce58c4f8",5558:"ae057106",5613:"3e7ceef0",5659:"b8ab588d",5719:"6e84f360",5742:"aba21aa0",5804:"bb373259",5872:"a552b93b",5912:"99054fd6",6038:"5e82a060",6099:"f5184ac4",6341:"6c14cd7d",6346:"bc1a89ad",6531:"8a5aafb8",6541:"09b719bb",6549:"db70960d",6575:"f4357d2a",6593:"1da39e10",6615:"4dcd5895",6692:"4e3cbe94",6695:"9799683e",6792:"1ea220c7",6842:"db24a52a",6903:"ff3f7f2b",6926:"40f2a0b4",6944:"3325c53c",7063:"d72ac48e",7098:"a7bd4aaa",7176:"6e8a13e2",7225:"23efd64d",7305:"80d7fb78",7326:"4f841ba9",7337:"9a5a69d5",7372:"a9d63626",7387:"f3f39cc5",7408:"9a4dfeaa",7638:"ed519cbf",7782:"1ffdd7de",7940:"92a92b88",8167:"9840208a",8190:"b3bbf2ca",8253:"4e27cd47",8329:"64332b0f",8353:"40f2f3c6",8401:"17896441",8512:"1a1a9e3d",8535:"411db075",8563:"09d90b28",8644:"c76972da",8732:"b4dd6982",8755:"f1b4aa58",8847:"92394f36",8911:"71153375",8937:"7cf72cd4",8998:"a3b8e457",9012:"5a510007",9042:"72607e62",9048:"a94703ab",9188:"a4cb0559",9423:"ac1de8bb",9465:"c2ef5137",9504:"21169ea0",9515:"9a5b155b",9537:"c60c73ac",9572:"a90f077e",9583:"81e5f1d0",9647:"5e95c892",9692:"da51cc8f",9795:"1a5391ac",9825:"0d48220f",9830:"b7547532",9845:"017ddd06",9884:"4e8389ca",9900:"ec64d50d",9922:"a40a3312",9953:"33664cb1",9955:"9d10a623"}[e]||e)+"."+{1:"0fdec136",49:"a6b796c3",208:"4275854e",242:"b9248d1a",286:"6fa4cd2d",364:"e52b273f",391:"ceb3fc26",416:"2c3d437b",468:"d6c25c30",529:"12851d66",537:"2c12f614",583:"1ab17e54",620:"f2cbc7ba",751:"233d8a82",767:"c0fa263d",803:"d4c307b7",821:"92911e0d",823:"c141ba59",831:"a733cb64",898:"36f21441",911:"b2d2def4",957:"54c8e77c",1071:"dd8562a6",1079:"7ca9bc38",1080:"dc3e88df",1171:"18647e79",1214:"c66df33c",1224:"8361664d",1235:"45ffb14c",1238:"50b2d5d1",1304:"e2deba05",1459:"46542fb6",1579:"0340e127",1616:"07617914",1703:"543dacd7",1780:"1b5c629a",1870:"2efdd5be",1922:"83a6a8a5",1953:"11bee284",2080:"0324984d",2138:"eb7bfe21",2172:"547b4574",2237:"09ea1ac9",2333:"8784b614",2358:"d553b08e",2401:"46b9023b",2405:"fd43e544",2433:"f8ba78ec",2489:"6b8fe8d9",2506:"ca3c1434",2512:"dad0fc8c",2514:"59e9fe3d",2607:"a2356879",2634:"4659817a",2692:"be993d56",2913:"da354daa",2918:"ba1f32b6",2964:"df40b923",3094:"f648cfee",3102:"cda8e294",3191:"735c7221",3244:"3e5506cb",3296:"27bc27a2",3383:"169bd2e0",3452:"fc634c6a",3539:"56f54a8f",3578:"4d9b4425",3624:"cbd810c1",3738:"ffea88de",3741:"b93ab4e7",3791:"d7fcc07c",3797:"8b91de39",3857:"d15d93a1",4011:"76df41ff",4013:"bb163265",4050:"60c96be8",4082:"1ec32965",4101:"7f413b4c",4126:"27596e02",4133:"a616f1b5",4161:"c75e85b0",4236:"da63f296",4306:"a3c35620",4319:"6d1a037a",4366:"dd856be2",4480:"cb1b021a",4682:"e654339e",4714:"6900c6ef",4719:"cc8ad6d8",4860:"283415f4",4862:"07883798",5009:"ced038dc",5056:"c59917a2",5066:"0ae85d03",5188:"a5685f41",5315:"11cc3307",5365:"156e3d44",5366:"65679d89",5387:"8ba014e3",5558:"1e7798d3",5613:"81e4d69c",5659:"185a788f",5719:"7cf065d9",5742:"5d866bda",5804:"5b93075d",5872:"8cf8b24c",5912:"861ba8fb",6038:"4bdd3262",6099:"fe1d3beb",6341:"143b0b15",6346:"55111a99",6531:"0d0a405f",6541:"95079ca8",6549:"11bf4ef4",6575:"dddf617a",6593:"c8be82ed",6615:"ca12b02c",6692:"5e11f413",6695:"0db4c008",6792:"65bd37b3",6842:"ddf6b280",6903:"8416d230",6926:"7e3f3239",6944:"e7144622",7063:"85dcda01",7098:"eccafe3d",7176:"cd6b5ab3",7225:"8db9d4fc",7305:"dc10b0bc",7326:"a40db22a",7337:"3bd3131b",7372:"8acbc963",7387:"b7b9c5f3",7408:"5fee3fa1",7638:"566c1879",7782:"a6f4c3c4",7940:"d146bab7",8167:"b0dab497",8190:"d827be3b",8253:"5f839e63",8329:"9f16706f",8353:"94b90663",8401:"40137c41",8512:"1234f680",8535:"36e4e24e",8563:"e87afdfe",8644:"edb03d27",8732:"08ecaec8",8755:"96f800a4",8847:"07670fd3",8911:"fc453076",8913:"0805a9ae",8937:"20e5aef9",8998:"bd46d496",9012:"03777827",9042:"dfc2054c",9048:"98a9923c",9188:"3496d38b",9423:"5a652d4f",9462:"4d9f6c47",9465:"5d772e09",9504:"00bc1f21",9515:"ff5eacf3",9537:"55950166",9572:"5c189ee4",9583:"42495023",9647:"0fe135c9",9692:"c628b2bf",9795:"f630e9df",9825:"b9cb6ce9",9830:"f336eade",9845:"6edcb824",9884:"e0a1b70c",9900:"62c18f11",9922:"1907314f",9953:"cc1e07c5",9955:"6537733f"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="routr-docs:",r.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==c+d){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+d),t.src=e),f[e]=[a];var l=(a,d)=>{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",71153375:"8911","118e913f":"1",e10372bb:"49","1b166456":"208","295fe310":"242",d7a9d534:"286","54969ead":"364","5f06ffd7":"391",a0c4fcbf:"468","7c32d245":"529","321dfeeb":"537","5514a4b8":"583","8ac6f1f4":"620","1b36d84b":"751","7efb1a82":"767",b5de05fe:"803","646468fb":"821","4d0c799d":"823","3a673d53":"831","99333fd2":"898","5ef0e9d6":"911",c141421f:"957","638e7455":"1071",a7c6e145:"1079","759bfbe1":"1080","144994e6":"1171","876e022a":"1214","943e77c3":"1224",a7456010:"1235","0457fa99":"1238","35bee977":"1304","4d54d076":"1459",c3b57956:"1579",fd5b422d:"1616","210b7c69":"1703","39d73575":"1780","918bfdcb":"1870","157aa7fa":"1922",b1e2c3e5:"1953",c2140537:"2080","1a4e3797":"2138","9bac311e":"2172","3f9d54d1":"2333","95069fb2":"2358","26da1a01":"2401","7df8ae3f":"2405","5a1924d4":"2433",c9a0b018:"2489","0f2bd920":"2506","63bd238e":"2512",ee7973d9:"2514",d3c35fce:"2607",c4f5d8e4:"2634","129db88c":"2692","7a552015":"2913","3d1fe28c":"2918","2a36568f":"2964",a1c2ddfb:"3094","9fcefd11":"3102","02617853":"3191","6a8a88b7":"3244","8613bfde":"3296","1ad9bfe0":"3383","335fd65a":"3452","9beb87c2":"3539","76273f75":"3578","43d3d555":"3624","06896101":"3738","8a9effda":"3741",fb8f7c97:"3791",bc843d59:"3797",a30498ab:"3857",ea5491a0:"4011","7b98d5f9":"4013","956a4ea6":"4050",b396445b:"4082","921a01ce":"4101","19dd4331":"4126","67679d6c":"4133","738c2db3":"4161",ed175a37:"4236",c0ec735e:"4306",f0fdb5a0:"4319","6e2907e5":"4366","3c0cfdd0":"4480","99f83bea":"4682","093b4e4f":"4714","8d7e75fb":"4719","5816b036":"4860","6c35bbce":"4862","656951a7":"5009","1cd31f12":"5056","80948d28":"5066","1caae7f3":"5188","4591c4c7":"5315",bc2f9ced:"5365","97b3c809":"5366",ce58c4f8:"5387",ae057106:"5558","3e7ceef0":"5613",b8ab588d:"5659","6e84f360":"5719",aba21aa0:"5742",bb373259:"5804",a552b93b:"5872","99054fd6":"5912","5e82a060":"6038",f5184ac4:"6099","6c14cd7d":"6341",bc1a89ad:"6346","8a5aafb8":"6531","09b719bb":"6541",db70960d:"6549",f4357d2a:"6575","1da39e10":"6593","4dcd5895":"6615","4e3cbe94":"6692","9799683e":"6695","1ea220c7":"6792",db24a52a:"6842",ff3f7f2b:"6903","40f2a0b4":"6926","3325c53c":"6944",d72ac48e:"7063",a7bd4aaa:"7098","6e8a13e2":"7176","23efd64d":"7225","80d7fb78":"7305","4f841ba9":"7326","9a5a69d5":"7337",a9d63626:"7372",f3f39cc5:"7387","9a4dfeaa":"7408",ed519cbf:"7638","1ffdd7de":"7782","92a92b88":"7940","9840208a":"8167",b3bbf2ca:"8190","4e27cd47":"8253","64332b0f":"8329","40f2f3c6":"8353","1a1a9e3d":"8512","411db075":"8535","09d90b28":"8563",c76972da:"8644",b4dd6982:"8732",f1b4aa58:"8755","92394f36":"8847","7cf72cd4":"8937",a3b8e457:"8998","5a510007":"9012","72607e62":"9042",a94703ab:"9048",a4cb0559:"9188",ac1de8bb:"9423",c2ef5137:"9465","21169ea0":"9504","9a5b155b":"9515",c60c73ac:"9537",a90f077e:"9572","81e5f1d0":"9583","5e95c892":"9647",da51cc8f:"9692","1a5391ac":"9795","0d48220f":"9825",b7547532:"9830","017ddd06":"9845","4e8389ca":"9884",ec64d50d:"9900",a40a3312:"9922","33664cb1":"9953","9d10a623":"9955"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(d);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},d=self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[];d.forEach(a.bind(null,0)),d.push=a.bind(null,d.push.bind(d))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.72dbc684.js b/assets/js/runtime~main.72dbc684.js deleted file mode 100644 index 139e91ae7..000000000 --- a/assets/js/runtime~main.72dbc684.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){d=e[i][0],f=e[i][1],c=e[i][2];for(var t=!0,o=0;o<d.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,f,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"118e913f",49:"e10372bb",208:"1b166456",286:"d7a9d534",364:"54969ead",529:"7c32d245",537:"321dfeeb",583:"5514a4b8",620:"8ac6f1f4",767:"7efb1a82",803:"b5de05fe",821:"646468fb",823:"4d0c799d",831:"3a673d53",911:"5ef0e9d6",1079:"a7c6e145",1080:"759bfbe1",1171:"144994e6",1214:"876e022a",1224:"943e77c3",1304:"35bee977",1459:"4d54d076",1703:"210b7c69",1780:"39d73575",1870:"918bfdcb",1953:"b1e2c3e5",2138:"1a4e3797",2333:"3f9d54d1",2358:"95069fb2",2401:"26da1a01",2405:"7df8ae3f",2433:"5a1924d4",2506:"0f2bd920",2514:"ee7973d9",2607:"d3c35fce",2634:"c4f5d8e4",2692:"129db88c",2964:"2a36568f",3102:"9fcefd11",3191:"02617853",3244:"6a8a88b7",3296:"8613bfde",3383:"1ad9bfe0",3539:"9beb87c2",3578:"76273f75",3624:"43d3d555",3688:"a0c5838c",3690:"0abf3980",3738:"06896101",3741:"8a9effda",3797:"bc843d59",3857:"a30498ab",4011:"ea5491a0",4050:"956a4ea6",4082:"b396445b",4126:"19dd4331",4236:"ed175a37",4366:"6e2907e5",4480:"3c0cfdd0",4682:"99f83bea",4714:"093b4e4f",4719:"8d7e75fb",4862:"6c35bbce",5009:"656951a7",5056:"1cd31f12",5362:"8f5f22a9",5365:"bc2f9ced",5613:"3e7ceef0",5659:"b8ab588d",5804:"bb373259",5872:"a552b93b",6038:"5e82a060",6099:"f5184ac4",6341:"6c14cd7d",6346:"bc1a89ad",6541:"09b719bb",6549:"db70960d",6575:"f4357d2a",6615:"4dcd5895",6692:"4e3cbe94",6695:"9799683e",6782:"deaab6a5",6792:"1ea220c7",6903:"ff3f7f2b",6926:"40f2a0b4",6944:"3325c53c",7063:"d72ac48e",7098:"a7bd4aaa",7225:"23efd64d",7337:"9a5a69d5",7372:"a9d63626",7387:"f3f39cc5",7408:"9a4dfeaa",7638:"ed519cbf",7782:"1ffdd7de",7940:"92a92b88",8167:"9840208a",8190:"b3bbf2ca",8253:"4e27cd47",8329:"64332b0f",8353:"40f2f3c6",8401:"17896441",8512:"1a1a9e3d",8535:"411db075",8581:"935f2afb",8732:"b4dd6982",8755:"f1b4aa58",8911:"71153375",8937:"7cf72cd4",9012:"5a510007",9042:"72607e62",9048:"a94703ab",9188:"a4cb0559",9465:"c2ef5137",9504:"21169ea0",9537:"c60c73ac",9583:"81e5f1d0",9647:"5e95c892",9692:"da51cc8f",9845:"017ddd06",9900:"ec64d50d",9922:"a40a3312",9953:"33664cb1",9955:"9d10a623"}[e]||e)+"."+{1:"22aac4d7",49:"f875b5b9",208:"afa392b3",286:"acc28f6a",364:"01cf159a",416:"2c3d437b",529:"80c5bf10",537:"607289a8",583:"b85640cf",620:"56eaa81a",767:"15e4652c",803:"2a9dab58",821:"28bd5243",823:"82777be3",831:"2766e28e",911:"72a3fe22",1079:"b8df2a42",1080:"035fb5f8",1171:"fd76df99",1214:"fec538fd",1224:"c18b42bc",1304:"4e13b84b",1459:"07298993",1703:"f12cb937",1780:"2275c69d",1870:"982771c7",1953:"f009a04f",2138:"9432810d",2237:"09ea1ac9",2333:"c4d5fa12",2358:"b3b4552d",2401:"3be03227",2405:"46854fda",2433:"161693fb",2506:"1ab834b7",2514:"d3592e4d",2607:"81e9ce52",2634:"4659817a",2692:"13220621",2964:"d948f060",3102:"f0fb126c",3191:"a06ae3cb",3244:"4d11689b",3296:"82349e8a",3383:"ba73e09d",3539:"5ebf1e1f",3578:"60924f2a",3624:"fc23fdad",3688:"5b15e2b4",3690:"d6c002e8",3738:"5deb77fe",3741:"5b2b876e",3797:"b0cc575a",3857:"812d55ec",4011:"a12d1751",4050:"65e6eb8e",4082:"4d16d64d",4126:"92fe643f",4236:"09425780",4366:"766a8f96",4480:"c1beae7e",4682:"e53f7fb4",4714:"b05d61ed",4719:"639e4c36",4862:"00ee5040",5009:"c9f52622",5056:"a5a94d63",5362:"b0c4d9ca",5365:"dba43639",5613:"c6e6babd",5659:"06e68070",5804:"65ebe2ba",5872:"6326ae55",6038:"c1d9a442",6099:"15ae4dba",6341:"f1e17186",6346:"81431dea",6541:"105201e4",6549:"892a5e80",6575:"a6c56766",6615:"fb90af12",6692:"0efb67be",6695:"8030dda4",6782:"e271f229",6792:"919e9360",6903:"b883c263",6926:"bcebf01b",6944:"2eb5404e",7063:"b02011c0",7098:"eccafe3d",7225:"69bca8aa",7337:"1e1e317b",7372:"ef9d935a",7387:"ca80ae11",7408:"a4107647",7638:"c20eaab7",7782:"43072233",7940:"2c0f2381",8167:"22624fd6",8190:"60bb6537",8253:"40cb91a8",8329:"849013cf",8353:"6108f911",8401:"04422b2e",8512:"25a9d97e",8535:"9b5d818d",8581:"9b7d34d8",8732:"a5471632",8755:"d829509f",8911:"1ac7f02d",8913:"0805a9ae",8937:"cce3242e",9012:"f35cb9c6",9042:"8c39e033",9048:"75b37e51",9188:"b622069b",9462:"7d4144d6",9465:"98ec0fa4",9504:"41ddd5b2",9537:"f7a57bd6",9583:"d7a2877e",9647:"0fe135c9",9692:"b5045421",9845:"bd7758e0",9900:"390e4709",9922:"2b4c3cf4",9953:"e1df95ca",9955:"4e6d4ada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="routr-docs:",r.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==c+d){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+d),t.src=e),f[e]=[a];var l=(a,d)=>{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",71153375:"8911","118e913f":"1",e10372bb:"49","1b166456":"208",d7a9d534:"286","54969ead":"364","7c32d245":"529","321dfeeb":"537","5514a4b8":"583","8ac6f1f4":"620","7efb1a82":"767",b5de05fe:"803","646468fb":"821","4d0c799d":"823","3a673d53":"831","5ef0e9d6":"911",a7c6e145:"1079","759bfbe1":"1080","144994e6":"1171","876e022a":"1214","943e77c3":"1224","35bee977":"1304","4d54d076":"1459","210b7c69":"1703","39d73575":"1780","918bfdcb":"1870",b1e2c3e5:"1953","1a4e3797":"2138","3f9d54d1":"2333","95069fb2":"2358","26da1a01":"2401","7df8ae3f":"2405","5a1924d4":"2433","0f2bd920":"2506",ee7973d9:"2514",d3c35fce:"2607",c4f5d8e4:"2634","129db88c":"2692","2a36568f":"2964","9fcefd11":"3102","02617853":"3191","6a8a88b7":"3244","8613bfde":"3296","1ad9bfe0":"3383","9beb87c2":"3539","76273f75":"3578","43d3d555":"3624",a0c5838c:"3688","0abf3980":"3690","06896101":"3738","8a9effda":"3741",bc843d59:"3797",a30498ab:"3857",ea5491a0:"4011","956a4ea6":"4050",b396445b:"4082","19dd4331":"4126",ed175a37:"4236","6e2907e5":"4366","3c0cfdd0":"4480","99f83bea":"4682","093b4e4f":"4714","8d7e75fb":"4719","6c35bbce":"4862","656951a7":"5009","1cd31f12":"5056","8f5f22a9":"5362",bc2f9ced:"5365","3e7ceef0":"5613",b8ab588d:"5659",bb373259:"5804",a552b93b:"5872","5e82a060":"6038",f5184ac4:"6099","6c14cd7d":"6341",bc1a89ad:"6346","09b719bb":"6541",db70960d:"6549",f4357d2a:"6575","4dcd5895":"6615","4e3cbe94":"6692","9799683e":"6695",deaab6a5:"6782","1ea220c7":"6792",ff3f7f2b:"6903","40f2a0b4":"6926","3325c53c":"6944",d72ac48e:"7063",a7bd4aaa:"7098","23efd64d":"7225","9a5a69d5":"7337",a9d63626:"7372",f3f39cc5:"7387","9a4dfeaa":"7408",ed519cbf:"7638","1ffdd7de":"7782","92a92b88":"7940","9840208a":"8167",b3bbf2ca:"8190","4e27cd47":"8253","64332b0f":"8329","40f2f3c6":"8353","1a1a9e3d":"8512","411db075":"8535","935f2afb":"8581",b4dd6982:"8732",f1b4aa58:"8755","7cf72cd4":"8937","5a510007":"9012","72607e62":"9042",a94703ab:"9048",a4cb0559:"9188",c2ef5137:"9465","21169ea0":"9504",c60c73ac:"9537","81e5f1d0":"9583","5e95c892":"9647",da51cc8f:"9692","017ddd06":"9845",ec64d50d:"9900",a40a3312:"9922","33664cb1":"9953","9d10a623":"9955"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(d);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},d=self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[];d.forEach(a.bind(null,0)),d.push=a.bind(null,d.push.bind(d))})()})(); \ No newline at end of file diff --git a/docs/1.x.x/administration/cli/cheatsheet/index.html b/docs/1.x.x/administration/cli/cheatsheet/index.html index a4be1bca9..bb4b91836 100644 --- a/docs/1.x.x/administration/cli/cheatsheet/index.html +++ b/docs/1.x.x/administration/cli/cheatsheet/index.html @@ -2,31 +2,31 @@ <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-1.x.x docs-doc-page docs-doc-id-administration/cli/cheatsheet" data-has-hydrated="false"> <head> <meta charset="UTF-8"> -<meta name="generator" content="Docusaurus v3.1.1"> +<meta name="generator" content="Docusaurus v3.4.0"> <title data-rh="true">Cheatsheet | Routr Docs - - - + + + -
Version: 1.x.x

Cheatsheet

+
Version: 1.x.x

Cheatsheet

The rctl is a command-line interface for running commands against a Routr server. This overview covers rctl syntax, describes the command operations and provides common examples. For details about each command, including all the supported flags and subcommands, see the reference documentation below. This tool ships separately from the Routr server.

-

Installation

+

Installation

To get the Routr Command-Line Tool run the following command:

npm install -g routr-ctl

The command-line tool is now globally accessible.

-

Login to a Routr server

+

Login to a Routr server

To login to a Routr server, use the login command.

rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit

The current API version is v1beta1

-

Syntax

+

Syntax

Use the following syntax to run rctl commands from your terminal window:

rctl COMMAND [REF] [flags]

where COMMAND, subcommand REF, and flags are:

@@ -55,7 +55,7 @@

SyntaxExamples: Common operations

+

Examples: Common operations

Use the following set of examples to help you familiarize yourself with running the commonly used rctl operations:

rctl locate or rctl loc - Locate a sip device registered on the Routr server

// Locate all Sip Devices registered against a Routr server
$ rctl loc
@@ -69,39 +69,39 @@

E
// Update an existing resource(s) .yaml or .yml.
$ rctl apply -f new-gateway.yaml

rctl delete - delete a resource.

// Delete all numbers for gateway reference gweef506
$ rctl delete numbers --filter "@.metadata.gwRef=='gweef506'"

// Delete a single agent (using delete alias)
$ rctl del agent ag3f77f6
-

Cheat Sheet

+

Cheat Sheet

Create, delete, and update are only available in some implementations of the resources module.

-

Request and store token

+

Request and store token

# Request authentication for subsequent commands
$ rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit
-

Clear out the session credentials

+

Clear out the session credentials

# Clear session credentials
$ rctl logout
-

Launch the Web Console

+

Launch the Web Console

# The Web Console re-uses the credentials of your Command-Line Tool
rctl proxy
-

Showing the Registry

+

Showing the Registry

# Shows all the Gateways that are currently available
$ rctl registry # Shows only current registrations. You may use `reg` for short
-

Locating SIP Devices

+

Locating SIP Devices

# Find all sip devices available at the location service
$ rctl locate # This list does not include number-ingress-routes or domain-egress-routes
-

Creating Resources

+

Creating Resources

# Create new peers and agents
$ rctl create -f asterisk.yaml # Create Peer in file asterisk.yaml
$ rctl create -f agents-list.yaml # Create Agents in file agents-list.yaml
-

Finding Resources

+

Finding Resources

# Get Numbers
$ rctl get numbers # List all available Numbers
$ rctl get number # List all available Numbers
$ rctl get number --filter "@.metadata.ref=='dd50baa4'" # Shows Number with reference 'Number0001'
$ rctl get number --filter "@.metadata.gwRef=='gweef506'" # Shows Numbers with Gateway reference 'GW1232'

# Get agents
$ rctl get agents # List all Agents
-

Deleting Resources

+

Deleting Resources

# Delete command by refernce or filter
$ rctl delete agent ag3f77f6 # Delete Agent by reference
$ rctl del numbers --filter '@.metadata.gwRef=gweef506' # Delete Numbers using a filter
-

Updating Resources

+

Updating Resources

$ rctl apply -f asterisk.yaml                         # Create Peer in file asterisk.yaml
$ rctl apply -f agents-list.yaml # Create Agents in file agents-list.yaml
-

Dump all available logs

+

Dump all available logs

$ rctl logs
-

Restart the engine

+

Restart the engine

# To restart the engine immediately use the --now flag
$ rctl restart --now
-

Stop the engine

+

Stop the engine

# To stop the engine immediately use the --now flag
$ rctl restart --now
-

Check the engine status

+

Check the engine status

$ rctl ping
-

Display version information

+

Display version information

$ rctl ver
-

Manage general configuration

-
# To update configuration use the apply subommand
$ rctl config apply -f /path/to/config.yml

# To see the configuration use the describe subcommand
$ rctl config describe --full
+

Manage general configuration

+
# To update configuration use the apply subommand
$ rctl config apply -f /path/to/config.yml

# To see the configuration use the describe subcommand
$ rctl config describe --full
\ No newline at end of file diff --git a/docs/1.x.x/administration/cli/installation/index.html b/docs/1.x.x/administration/cli/installation/index.html index 34b626302..885314f38 100644 --- a/docs/1.x.x/administration/cli/installation/index.html +++ b/docs/1.x.x/administration/cli/installation/index.html @@ -2,28 +2,28 @@ - + Installation | Routr Docs - - - + + + -
Version: 1.x.x

Installation

To get the Routr Command-Line Tool run the following command:

+
Version: 1.x.x

Installation

To get the Routr Command-Line Tool run the following command:

npm install -g routr-ctl

The command-line tool is now globally accessible.

Alternatively, you can install the tool in seconds on Linux (Ubuntu and others) with:

sudo snap install rctl
-

Login to a Routr server

+

Login to a Routr server

To log in to a Routr server and being issuing commands run the following commands.

rctl login https://127.0.0.1:4567/api/{apiVersion} -u admin -p changeit

The current API version is v1beta1

-
+
\ No newline at end of file diff --git a/docs/1.x.x/administration/cli/remote-access/index.html b/docs/1.x.x/administration/cli/remote-access/index.html index ff5d90ced..f1ffad69b 100644 --- a/docs/1.x.x/administration/cli/remote-access/index.html +++ b/docs/1.x.x/administration/cli/remote-access/index.html @@ -2,24 +2,24 @@ - + Remote Access | Routr Docs - - - + + + -
Version: 1.x.x

Remote Access

+
Version: 1.x.x

Remote Access

By default, Routr installs a certificate that only allows for connections using the localhost or 127.0.0.1. To use rctl tool from a remote host, you must generate a certificate that accepts connections to the desired domain name or IP and then update the spec.restService section of the config.yml.

Here is an example using a self-signed certificate(usually enough).

keytool -genkey -keyalg RSA \
-noprompt \
-alias routr \
-keystore api-cert.jks \
-storepass changeit \
-keypass changeit \
-validity 365 \
-keysize 2048 \
-dname "CN=domain.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
-ext SAN=dns:your.domain.com,dns:localhost,ip:127.0.0.1

Remember to place the certificate in the etc/certs folder

-
+
\ No newline at end of file diff --git a/docs/1.x.x/administration/webconsole/index.html b/docs/1.x.x/administration/webconsole/index.html index 910f72621..ecd01aeff 100644 --- a/docs/1.x.x/administration/webconsole/index.html +++ b/docs/1.x.x/administration/webconsole/index.html @@ -2,30 +2,30 @@ - + WebUI | Routr Docs - - - + + + -
Version: 1.x.x

WebUI

+
Version: 1.x.x

WebUI

The Web Console — WC for short — is an additional tool for remote control of Routr server that ships with the Command-Line tool. The Web Console accesses your Routr server remotely using a Restful API.

WebUI Animation

-

How to install the Web Console?

+

How to install the Web Console?

The WC ships with the Command-Line tool. You do not need to install it separately.

-

Launching the Web Console

+

Launching the Web Console

To launch the WC, first, make sure you have a Routr server running. You are also going to have to install the Command-Line tool. To launch the server run the following command:

rctl proxy

The WC re-uses the credentials of your Command-Line Tool

-

Does the WC affect the server's performance?

-

No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance.

+

Does the WC affect the server's performance?

+

No. The WC is launched on the client side. It is not part of the Routr server and does not affect its performance.

\ No newline at end of file diff --git a/docs/1.x.x/api/agents/create/index.html b/docs/1.x.x/api/agents/create/index.html index 3a5312155..0954824bc 100644 --- a/docs/1.x.x/api/agents/create/index.html +++ b/docs/1.x.x/api/agents/create/index.html @@ -2,19 +2,19 @@ - + createAgent | Routr Docs - - - + + + -
Version: 1.x.x

createAgent

+
Version: 1.x.x

createAgent

Creates a new Agent resource. The Domain must exist before creating the Agent. Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

URL

@@ -28,6 +28,6 @@

Response

If successful this method creates an Agent resource.

Sample Call

-
POST /api/{apiversion}/agents
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "ag3f77f6"
}
+
POST /api/{apiversion}/agents
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "ag3f77f6"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/delete/index.html b/docs/1.x.x/api/agents/delete/index.html index f88e6c563..c9f95be16 100644 --- a/docs/1.x.x/api/agents/delete/index.html +++ b/docs/1.x.x/api/agents/delete/index.html @@ -2,19 +2,19 @@ - + deleteAgent | Routr Docs - - - + + + -
Version: 1.x.x

deleteAgent

+
Version: 1.x.x

deleteAgent

Removes an Agent resource from a persistent database.

URL

/agents/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method removes an Agent resource.

Sample Call

-
DELETE /api/v1beta1/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
DELETE /api/v1beta1/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/get/index.html b/docs/1.x.x/api/agents/get/index.html index 3c5f07e4f..42d7d8fa5 100644 --- a/docs/1.x.x/api/agents/get/index.html +++ b/docs/1.x.x/api/agents/get/index.html @@ -2,19 +2,19 @@ - + getAgent | Routr Docs - - - + + + -
Version: 1.x.x

getAgent

+
Version: 1.x.x

getAgent

This method returns an Agent resource.

URL

/agents/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method returns an Agent resource.

Sample Call

-
GET /api/{apiversion}/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}
}
+
GET /api/{apiversion}/agents/ag3f77f6
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/list/index.html b/docs/1.x.x/api/agents/list/index.html index d1d522296..3fbe58f62 100644 --- a/docs/1.x.x/api/agents/list/index.html +++ b/docs/1.x.x/api/agents/list/index.html @@ -2,19 +2,19 @@ - + listAgents | Routr Docs - - - + + + -
Version: 1.x.x

listAgents

+
Version: 1.x.x

listAgents

This method returns a list of Agent resources.

URL

/agents

@@ -28,6 +28,6 @@

Response

If successful this method returns a list of Agent resources.

Sample Call

-
GET /api/{apiversion}/agents
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}]
}
+
GET /api/{apiversion}/agents
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/agents/update/index.html b/docs/1.x.x/api/agents/update/index.html index 165d384f3..9c56892c9 100644 --- a/docs/1.x.x/api/agents/update/index.html +++ b/docs/1.x.x/api/agents/update/index.html @@ -2,19 +2,19 @@ - + updateAgent | Routr Docs - - - + + + -
Version: 1.x.x

updateAgent

+
Version: 1.x.x

updateAgent

Updates an existing Agent resource.

URL

/agents/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method updates an Agent resource.

Sample Call

-
PUT /api/v1beta1/agents/ag3f77f6
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/v1beta1/agents/ag3f77f6
{
"apiVersion": "v1beta1",
"kind": "Agent",
"metadata": {
"name": "John Doe",
"ref": "ag3f77f6"
},
"spec": {
"credentials": {
"username": "1001",
"secret": "1234"
},
"domains": [
"sip.local"
]
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/config/get/index.html b/docs/1.x.x/api/config/get/index.html index b8b66b43e..7cbcce2bf 100644 --- a/docs/1.x.x/api/config/get/index.html +++ b/docs/1.x.x/api/config/get/index.html @@ -2,19 +2,19 @@ - + getConfiguration | Routr Docs - - - + + + -
Version: 1.x.x

getConfiguration

+
Version: 1.x.x

getConfiguration

This method returns the servers' configuration.

URL

/system/config

@@ -27,6 +27,6 @@

Response

If successful this method returns the current configuration from the server.

Sample Call

-
GET /api/{apiversion}/system/config
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": {
...
}
}
+
GET /api/{apiversion}/system/config
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": {
...
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/config/update/index.html b/docs/1.x.x/api/config/update/index.html index f27da54ac..2c56b9052 100644 --- a/docs/1.x.x/api/config/update/index.html +++ b/docs/1.x.x/api/config/update/index.html @@ -2,19 +2,19 @@ - + updateConfiguration | Routr Docs - - - + + + -
Version: 1.x.x

updateConfiguration

+
Version: 1.x.x

updateConfiguration

This method updates the servers' configuration.

URL

/system/config

@@ -27,6 +27,6 @@

Response

The changes will take effect on the next time the instance restart.

Sample Call

-
PUT /api/{apiversion}/config
{
"apiVersion": "v1beta1",
"spec": {
"dataSource": {
"provider": "redis_data_provider"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/{apiversion}/config
{
"apiVersion": "v1beta1",
"spec": {
"dataSource": {
"provider": "redis_data_provider"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/create/index.html b/docs/1.x.x/api/domains/create/index.html index 63bfb8d32..2374ba877 100644 --- a/docs/1.x.x/api/domains/create/index.html +++ b/docs/1.x.x/api/domains/create/index.html @@ -2,19 +2,19 @@ - + createDomain | Routr Docs - - - + + + -
Version: 1.x.x

createDomain

+
Version: 1.x.x

createDomain

Creates a new Domain resource.

URL

/domains

@@ -27,6 +27,6 @@

Response

If successful this method creates a Domain resource.

Sample Call

-
POST /api/{apiversion}/domains
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dm6c87r2"
}
+
POST /api/{apiversion}/domains
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dm6c87r2"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/delete/index.html b/docs/1.x.x/api/domains/delete/index.html index d9b6ecf19..34ac65c15 100644 --- a/docs/1.x.x/api/domains/delete/index.html +++ b/docs/1.x.x/api/domains/delete/index.html @@ -2,19 +2,19 @@ - + deleteDomain | Routr Docs - - - + + + -
Version: 1.x.x

deleteDomain

+
Version: 1.x.x

deleteDomain

Removes a Domain resource from a persistent database. Before removing a Domain, ensure you have remove all of it child Agents. Otherwise, this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

@@ -29,6 +29,6 @@

Response

If successful this method removes a Domain resource.

Sample Call

-
DELETE /api/v1beta1/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
DELETE /api/v1beta1/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/get/index.html b/docs/1.x.x/api/domains/get/index.html index ab9de9855..8556204a8 100644 --- a/docs/1.x.x/api/domains/get/index.html +++ b/docs/1.x.x/api/domains/get/index.html @@ -2,19 +2,19 @@ - + getDomain | Routr Docs - - - + + + -
Version: 1.x.x

getDomain

+
Version: 1.x.x

getDomain

This method returns a Gateway resource.

URL

/domains/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method returns a Domain resource.

Sample Call

-
GET /api/{apiversion}/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}
}
+
GET /api/{apiversion}/domains/dm6c87r2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/list/index.html b/docs/1.x.x/api/domains/list/index.html index 70fb9d2dc..e158e6ab4 100644 --- a/docs/1.x.x/api/domains/list/index.html +++ b/docs/1.x.x/api/domains/list/index.html @@ -2,19 +2,19 @@ - + listDomains | Routr Docs - - - + + + -
Version: 1.x.x

listDomains

+
Version: 1.x.x

listDomains

This method returns a list of Domain resources.

URL

/domains

@@ -28,6 +28,6 @@

Response

If successful this method returns a list of Domain resources.

Sample Call

-
GET /api/{apiversion}/domains
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}]
}
+
GET /api/{apiversion}/domains
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/domains/update/index.html b/docs/1.x.x/api/domains/update/index.html index 86a3a1ea4..a30e7f7c5 100644 --- a/docs/1.x.x/api/domains/update/index.html +++ b/docs/1.x.x/api/domains/update/index.html @@ -2,19 +2,19 @@ - + updateDomain | Routr Docs - - - + + + -
Version: 1.x.x

updateDomain

+
Version: 1.x.x

updateDomain

Updates an existing Domain resource.

URL

/domains/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method updates a Domain resource.

Sample Call

-
PUT /api/v1beta1/domains/dm6c87r2
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/v1beta1/domains/dm6c87r2
{
"apiVersion": "v1beta1",
"kind": "Domain",
"metadata": {
"name": "Another Office",
"ref": "dm6c87r2"
},
"spec": {
"context": {
"domainUri": "sip2.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/create/index.html b/docs/1.x.x/api/gateways/create/index.html index 71696a2b2..a5a67f281 100644 --- a/docs/1.x.x/api/gateways/create/index.html +++ b/docs/1.x.x/api/gateways/create/index.html @@ -2,19 +2,19 @@ - + createGateway | Routr Docs - - - + + + -
Version: 1.x.x

createGateway

+
Version: 1.x.x

createGateway

Creates a new Gateway resource.

URL

/gateways

@@ -27,6 +27,6 @@

Response

If successful this method creates a Gateway resource.

Sample Call

-
POST /api/{apiversion}/gateways
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc."
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}


HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "gw5c77t2"
}
+
POST /api/{apiversion}/gateways
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc."
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}


HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "gw5c77t2"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/delete/index.html b/docs/1.x.x/api/gateways/delete/index.html index a89317f7c..5602fd20b 100644 --- a/docs/1.x.x/api/gateways/delete/index.html +++ b/docs/1.x.x/api/gateways/delete/index.html @@ -2,19 +2,19 @@ - + deleteGateway | Routr Docs - - - + + + -
Version: 1.x.x

deleteGateway

+
Version: 1.x.x

deleteGateway

Removes a Gateway resource from a persistent database. Before removing a Gateway, ensure you have remove all of it child Numbers. Otherwise, this method returns a FOUND_DEPENDENT_OBJECTS_RESPONSE

@@ -29,6 +29,6 @@

Response

If successful this method removes a Gateway resource.

Sample Call

-
DELETE /api/v1beta1/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
DELETE /api/v1beta1/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/get/index.html b/docs/1.x.x/api/gateways/get/index.html index 583e8e4c8..9a67abb4a 100644 --- a/docs/1.x.x/api/gateways/get/index.html +++ b/docs/1.x.x/api/gateways/get/index.html @@ -2,19 +2,19 @@ - + getGateway | Routr Docs - - - + + + -
Version: 1.x.x

getGateway

+
Version: 1.x.x

getGateway

This method returns a Gateway resource.

URL

/gateways/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method returns a Gateway resource.

Sample Call

-
GET /api/{apiversion}/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}
}
+
GET /api/{apiversion}/gateways/gw5c77t2
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/list/index.html b/docs/1.x.x/api/gateways/list/index.html index 8474f07bd..3830705c8 100644 --- a/docs/1.x.x/api/gateways/list/index.html +++ b/docs/1.x.x/api/gateways/list/index.html @@ -2,19 +2,19 @@ - + listGateways | Routr Docs - - - + + + -
Version: 1.x.x

listGateways

+
Version: 1.x.x

listGateways

This method returns a list of Gateways resources.

URL

/gateways

@@ -28,6 +28,6 @@

Response

If successful this method returns a list of Gateways resources.

Sample Call

-
GET /api/{apiversion}/gateways
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}]
}
+
GET /api/{apiversion}/gateways
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/gateways/update/index.html b/docs/1.x.x/api/gateways/update/index.html index a14bbd9e7..215251746 100644 --- a/docs/1.x.x/api/gateways/update/index.html +++ b/docs/1.x.x/api/gateways/update/index.html @@ -2,19 +2,19 @@ - + updateGateways | Routr Docs - - - + + + -
Version: 1.x.x

updateGateways

+
Version: 1.x.x

updateGateways

Updates an existing Gateway resource.

URL

/gateways/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method updates a Gateway resource.

Sample Call

-
PUT /api/v1beta1/gateways/gw5c77t2
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/v1beta1/gateways/gw5c77t2
{
"apiVersion": "v1beta1",
"kind": "Gateway",
"metadata": {
"name": "Provider Inc.",
"ref": "gw5c77t2"
},
"spec": {
"host": "sip.provider.net",
"credentials": {
"username": "youruser",
"secret": "yoursecret"
},
"transport": "udp"
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/create/index.html b/docs/1.x.x/api/location/create/index.html index 5d9388928..764a3153b 100644 --- a/docs/1.x.x/api/location/create/index.html +++ b/docs/1.x.x/api/location/create/index.html @@ -2,19 +2,19 @@ - + addEndpoint | Routr Docs - - - + + + -
Version: 1.x.x

addEndpoint

+
Version: 1.x.x

addEndpoint

Adds an entry into the location table

URL

/location/{addressOfRecord}

@@ -27,6 +27,6 @@

Response

This method adds an entry to the location table. Useful for end-to-end testing.

Sample Call

-
POST /api/{apiversion}/location/sip:guest@guest
{
"user": "guest",
"address": "192.168.1.149",
"port": 5080,
"expires": 600
}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Added location entry"
}
+
POST /api/{apiversion}/location/sip:guest@guest
{
"user": "guest",
"address": "192.168.1.149",
"port": 5080,
"expires": 600
}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Added location entry"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/delete/index.html b/docs/1.x.x/api/location/delete/index.html index 0a7ee74df..48d579617 100644 --- a/docs/1.x.x/api/location/delete/index.html +++ b/docs/1.x.x/api/location/delete/index.html @@ -2,19 +2,19 @@ - + evictEndpoint | Routr Docs - - - + + + -
Version: 1.x.x

evictEndpoint

+
Version: 1.x.x

evictEndpoint

Evicts an entry from the location table

URL

/location/{addressOfRecord}

@@ -27,6 +27,6 @@

Response

This method removes and entry for the give address of record

Sample Call

-
DELETE /api/{apiversion}/location/sip:guest@guest
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Location entry evicted"
}
+
DELETE /api/{apiversion}/location/sip:guest@guest
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Location entry evicted"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/location/list/index.html b/docs/1.x.x/api/location/list/index.html index 814f57e93..9b700d550 100644 --- a/docs/1.x.x/api/location/list/index.html +++ b/docs/1.x.x/api/location/list/index.html @@ -2,19 +2,19 @@ - + listEndpoints | Routr Docs - - - + + + -
Version: 1.x.x

listEndpoints

+
Version: 1.x.x

listEndpoints

Gets a list of registered devices.

URL

/location

@@ -28,6 +28,6 @@

This method returns a list with registered devices in the response body.

Sample Call

-
GET /api/{apiversion}/location
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data":[{
"addressOfRecord": "sip:1001@sip.local",
"contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"
}]
}
+
GET /api/{apiversion}/location
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data":[{
"addressOfRecord": "sip:1001@sip.local",
"contactInfo": "sip:45962087@192.168.1.127:59985;transport=tcp;nat=false;expires=600"
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/create/index.html b/docs/1.x.x/api/numbers/create/index.html index ee4a65885..bde91f34f 100644 --- a/docs/1.x.x/api/numbers/create/index.html +++ b/docs/1.x.x/api/numbers/create/index.html @@ -2,19 +2,19 @@ - + createNumber | Routr Docs - - - + + + -
Version: 1.x.x

createNumber

+
Version: 1.x.x

createNumber

Creates a new Number. The Gateway must exist before creating the Number. Otherwise, this method responds with a UNFULFILLED_DEPENDENCY_RESPONSE.

URL

@@ -28,6 +28,6 @@

Response

If successful this method creates a Number.

Sample Call

-
POST /api/{apiversion}/numbers
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dd50baa4"
}
+
POST /api/{apiversion}/numbers
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "dd50baa4"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/delete/index.html b/docs/1.x.x/api/numbers/delete/index.html index be0ea5357..c529e00d3 100644 --- a/docs/1.x.x/api/numbers/delete/index.html +++ b/docs/1.x.x/api/numbers/delete/index.html @@ -2,19 +2,19 @@ - + deleteNumber | Routr Docs - - - + + + -
Version: 1.x.x

deleteNumber

+
Version: 1.x.x

deleteNumber

Removes a Number from a persistent database.

URL

/numbers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method removes a Number.

Sample Call

-
DELETE /api/v1beta1/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
DELETE /api/v1beta1/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/get/index.html b/docs/1.x.x/api/numbers/get/index.html index cce5c993d..52bc98610 100644 --- a/docs/1.x.x/api/numbers/get/index.html +++ b/docs/1.x.x/api/numbers/get/index.html @@ -2,19 +2,19 @@ - + getNumber | Routr Docs - - - + + + -
Version: 1.x.x

getNumber

+
Version: 1.x.x

getNumber

This method returns an Agent resource.

URL

/numbers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method returns a Number.

Sample Call

-
GET /api/{apiversion}/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}
}
+
GET /api/{apiversion}/numbers/dd50baa4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/list/index.html b/docs/1.x.x/api/numbers/list/index.html index 70f64571e..a8980d6b8 100644 --- a/docs/1.x.x/api/numbers/list/index.html +++ b/docs/1.x.x/api/numbers/list/index.html @@ -2,19 +2,19 @@ - + listNumbers | Routr Docs - - - + + + -
Version: 1.x.x

listNumbers

+
Version: 1.x.x

listNumbers

This method returns a list of Numbers.

URL

/numbers

@@ -28,6 +28,6 @@

Response

If successful this method returns a list of Numbers.

Sample Call

-
GET /api/{apiversion}/numbers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}]
}
+
GET /api/{apiversion}/numbers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/numbers/update/index.html b/docs/1.x.x/api/numbers/update/index.html index 1249ff2a4..42691507d 100644 --- a/docs/1.x.x/api/numbers/update/index.html +++ b/docs/1.x.x/api/numbers/update/index.html @@ -2,19 +2,19 @@ - + updateNumber | Routr Docs - - - + + + -
Version: 1.x.x

updateNumber

+
Version: 1.x.x

updateNumber

Updates an existing Number.

URL

/numbers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method updates a Number.

Sample Call

-
PUT /api/v1beta1/numbers/dd50baa4
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/v1beta1/numbers/dd50baa4
{
"apiVersion": "v1beta1",
"kind": "Number",
"metadata": {
"ref": "dd50baa4",
"gwRef": "gweef506",
"geoInfo": {
"city": "City, State",
"country": "Country",
"countryISOCode": "US"
}
},
"spec": {
"location": {
"telUrl": "tel:0000000000",
"aorLink": "sip:1001@sip.local"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/overview/index.html b/docs/1.x.x/api/overview/index.html index 2aab42110..710f5496a 100644 --- a/docs/1.x.x/api/overview/index.html +++ b/docs/1.x.x/api/overview/index.html @@ -2,22 +2,22 @@ - + overview | Routr Docs - - - + + + -
Version: 1.x.x

overview

Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.

+
Version: 1.x.x

overview

Routr API version is currently v1beta1. We continue to improve the API, resource definition, and other artifacts until we reach a final version. We can then establish a policy to ensure backward compatibility. Until then keep an eye on this document.

The endpoint for the API is:

/api/{apiversion}

-

Authentication

+

Authentication

A JWT token is used to authenticate the server. To obtain the token, use the /api/{apiversion}/token endpoint with basic authentication. Use the information from the User resource.

You must append the token to all requests as a query parameter.

@@ -27,8 +27,8 @@

Authenticatio
curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/token

# Resulted in
{
"status":200,
"message":"Successful request",
"data":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}

To use the token

curl -k -u "admin:changeit" https://localhost:4567/api/v1beta1/location?token=eyJhbGciOiJIUzUxMiJ9.e...

# Resulted in
{
"status":200,
"message":"Successful request",
"data":[
{
"addressOfRecord":"sip:1001@sip.local",
"contactInfo":"sip:45962087@192.168.1.127:61147;transport=tcp;nat=false;expires=600"
}
]
}
-

Error Responses

+

Error Responses

The following are general errors we might have to account for:

-
CodeContent
400 BAD_REQUEST{ status: "400", message : "Bad Request" }
401 UNAUTHORIZED{ status: "401", message : "You are unauthorized to make this request." }
405 NOT_SUPPORTED{ status: "405", message : "Operation not supported by data source provider" }
409 CONFLICT{ status: "409", message : "An attempt was made to create an object that already exists" }
4091 UNFULFILLED_DEPENDENCY_RESPONSE{ status: "4091", message : "Found one or more unfulfilled dependencies" }
+
CodeContent
400 BAD_REQUEST{ status: "400", message : "Bad Request" }
401 UNAUTHORIZED{ status: "401", message : "You are unauthorized to make this request." }
405 NOT_SUPPORTED{ status: "405", message : "Operation not supported by data source provider" }
409 CONFLICT{ status: "409", message : "An attempt was made to create an object that already exists" }
4091 UNFULFILLED_DEPENDENCY_RESPONSE{ status: "4091", message : "Found one or more unfulfilled dependencies" }
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/create/index.html b/docs/1.x.x/api/peers/create/index.html index d3539769e..29be9de4e 100644 --- a/docs/1.x.x/api/peers/create/index.html +++ b/docs/1.x.x/api/peers/create/index.html @@ -2,19 +2,19 @@ - + createPeer | Routr Docs - - - + + + -
Version: 1.x.x

createPeer

+
Version: 1.x.x

createPeer

Creates a new Peer resource.

URL

/peers

@@ -27,6 +27,6 @@

Response

If successful this method creates a Peer resource.

Sample Call

-
POST /api/{apiversion}/peers
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "pr2c77f4"
}
+
POST /api/{apiversion}/peers
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 201 Created
{
"status": "201",
"message": "Created",
"data": "pr2c77f4"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/delete/index.html b/docs/1.x.x/api/peers/delete/index.html index f5274db59..28be78ace 100644 --- a/docs/1.x.x/api/peers/delete/index.html +++ b/docs/1.x.x/api/peers/delete/index.html @@ -2,19 +2,19 @@ - + deletePeer | Routr Docs - - - + + + -
Version: 1.x.x

deletePeer

+
Version: 1.x.x

deletePeer

Removes a Peer resource from a persistent database.

URL

/peers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method removes a Peer resource.

Sample Call

-
DELETE /api/v1beta1/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
DELETE /api/v1beta1/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/get/index.html b/docs/1.x.x/api/peers/get/index.html index 468dc5b53..245f0916d 100644 --- a/docs/1.x.x/api/peers/get/index.html +++ b/docs/1.x.x/api/peers/get/index.html @@ -2,19 +2,19 @@ - + getPeer | Routr Docs - - - + + + -
Version: 1.x.x

getPeer

+
Version: 1.x.x

getPeer

This method returns a Peer resource.

URL

/peers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method returns a Peer resource.

Sample Call

-
GET /api/{apiversion}/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}
}
+
GET /api/{apiversion}/peers/pr2c77f4
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data" : {
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/list/index.html b/docs/1.x.x/api/peers/list/index.html index 78826531a..b3ebe0b23 100644 --- a/docs/1.x.x/api/peers/list/index.html +++ b/docs/1.x.x/api/peers/list/index.html @@ -2,19 +2,19 @@ - + listPeers | Routr Docs - - - + + + -
Version: 1.x.x

listPeers

+
Version: 1.x.x

listPeers

This method returns a list of Peer resources.

URL

/peers

@@ -28,6 +28,6 @@

Response

If successful this method returns a list of Peer resources.

Sample Call

-
GET /api/{apiversion}/peers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}]
}
+
GET /api/{apiversion}/peers
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data" : [{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/peers/update/index.html b/docs/1.x.x/api/peers/update/index.html index 26053043e..ff7f55d26 100644 --- a/docs/1.x.x/api/peers/update/index.html +++ b/docs/1.x.x/api/peers/update/index.html @@ -2,19 +2,19 @@ - + updatePeer | Routr Docs - - - + + + -
Version: 1.x.x

updatePeer

+
Version: 1.x.x

updatePeer

Updates an existing Peer resource.

URL

/peers/{ref}

@@ -27,6 +27,6 @@

Response

If successful this method updates a Peer resource.

Sample Call

-
PUT /api/v1beta1/peers/pr2c77f4
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
+
PUT /api/v1beta1/peers/pr2c77f4
{
"apiVersion": "v1beta1",
"kind": "Peer",
"metadata": {
"name": "Asterisk PBX",
"ref": "pr2c77f4"
},
"spec": {
"credentials": {
"username": "ast",
"secret": "1234"
}
}
}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/registry/index.html b/docs/1.x.x/api/registry/index.html index cf7242010..65ed66a86 100644 --- a/docs/1.x.x/api/registry/index.html +++ b/docs/1.x.x/api/registry/index.html @@ -2,19 +2,19 @@ - + registry | Routr Docs - - - + + + -
Version: 1.x.x

registry

This method gets a list of available(online) gateways.

+
Version: 1.x.x

registry

This method gets a list of available(online) gateways.

URL

/registry

Method

@@ -26,6 +26,6 @@

Response

This method returns a list with registered devices.

Sample Call

-
GET /api/{apiversion}/registry
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [
{
"username": "215706",
"host": "atlanta2.voip.ms",
"ip":"209.217.224.50",
"expires": 600,
"registeredOn": 1588525156280,
"gwRef": "gw50a1a4ca",
"gwURI": "sip:215706@atlanta2.voip.ms:5060",
"regOnFormatted": "a few seconds ago"
}
]
}
+
GET /api/{apiversion}/registry
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"meta": {
"currentPage": 1,
"totalPages": 1,
"itemsPerPage": 30,
"totalItems": 1
},
"data": [
{
"username": "215706",
"host": "atlanta2.voip.ms",
"ip":"209.217.224.50",
"expires": 600,
"registeredOn": 1588525156280,
"gwRef": "gw50a1a4ca",
"gwURI": "sip:215706@atlanta2.voip.ms:5060",
"regOnFormatted": "a few seconds ago"
}
]
}
\ No newline at end of file diff --git a/docs/1.x.x/api/status/get/index.html b/docs/1.x.x/api/status/get/index.html index 0591ebf0a..1c448f144 100644 --- a/docs/1.x.x/api/status/get/index.html +++ b/docs/1.x.x/api/status/get/index.html @@ -2,19 +2,19 @@ - + checkSystemStatus | Routr Docs - - - + + + -
Version: 1.x.x

checkSystemStatus

+
Version: 1.x.x

checkSystemStatus

Pings an instance of Routr engine.

URL

/system/status

@@ -29,6 +29,6 @@ this method can assumed that no answer or a bad answer means that the server us down or "unhealthy."

Sample Call

-
GET /api/{apiversion}/system/status
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data": "up"
}
+
GET /api/{apiversion}/system/status
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Successful request",
"data": "up"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/status/update/index.html b/docs/1.x.x/api/status/update/index.html index bcacd2bbb..3e3d5ed52 100644 --- a/docs/1.x.x/api/status/update/index.html +++ b/docs/1.x.x/api/status/update/index.html @@ -2,19 +2,19 @@ - + restartServer | Routr Docs - - - + + + -
Version: 1.x.x

restartServer

+
Version: 1.x.x

restartServer

This method returns information about the server.

URL

/system/status/{status}

@@ -27,6 +27,6 @@

Response

If successful this method causes the server to change its status.

Sample Call

-
POST /api/{apiversion}/system/status/reload
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Request sent to server"
}
+
POST /api/{apiversion}/system/status/reload
{

}

HTTP/1.1 200 OK
{
"status": "200",
"message": "Request sent to server"
}
\ No newline at end of file diff --git a/docs/1.x.x/api/sys/info/index.html b/docs/1.x.x/api/sys/info/index.html index f86ffa612..a3c7d91ab 100644 --- a/docs/1.x.x/api/sys/info/index.html +++ b/docs/1.x.x/api/sys/info/index.html @@ -2,19 +2,19 @@ - + getServerInfo | Routr Docs - - - + + + -
Version: 1.x.x

getServerInfo

+
Version: 1.x.x

getServerInfo

This method returns information about the server.

URL

/system/info

@@ -27,6 +27,6 @@

Response

If successful this method returns relevant information about the server.

Sample Call

-
GET /api/{apiversion}/system/info
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":{
"version":"v1.0",
"apiVersion":"v1beta1",
"apiPath":"/api/v1beta1",
"env":[
{
"var":"EXTERN_ADDR",
"value":"172.220.246.46"
},
{
"var":"LOCALNETS",
"value": "192.168.1.149/31"
},
{
"var":"REGISTRAR_INTF",
"value": "External"
}
]
}
}
+
GET /api/{apiversion}/system/info
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":{
"version":"v1.0",
"apiVersion":"v1beta1",
"apiPath":"/api/v1beta1",
"env":[
{
"var":"EXTERN_ADDR",
"value":"172.220.246.46"
},
{
"var":"LOCALNETS",
"value": "192.168.1.149/31"
},
{
"var":"REGISTRAR_INTF",
"value": "External"
}
]
}
}
\ No newline at end of file diff --git a/docs/1.x.x/api/sys/logs/index.html b/docs/1.x.x/api/sys/logs/index.html index 73899c543..347c42095 100644 --- a/docs/1.x.x/api/sys/logs/index.html +++ b/docs/1.x.x/api/sys/logs/index.html @@ -2,19 +2,19 @@ - + getServerLogs | Routr Docs - - - + + + -
Version: 1.x.x

getServerLogs

+
Version: 1.x.x

getServerLogs

This method returns logs from the server

URL

/system/logs

@@ -27,6 +27,6 @@

Response

If successful this method returns logging information from the server.

Sample Call

-
GET /api/{apiversion}/system/logs
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":"[DEBUG] 2020-04-13 12:29:49.785..."
}
+
GET /api/{apiversion}/system/logs
{

}

HTTP/1.1 200 OK
{
"status":200,
"message":"Successful request",
"data":"[DEBUG] 2020-04-13 12:29:49.785..."
}
\ No newline at end of file diff --git a/docs/1.x.x/api/token/index.html b/docs/1.x.x/api/token/index.html index d456a7789..70ca7fb7b 100644 --- a/docs/1.x.x/api/token/index.html +++ b/docs/1.x.x/api/token/index.html @@ -2,19 +2,19 @@ - + token | Routr Docs - - - + + + -
Version: 1.x.x

token

This method gets a token for subsequent API calls.

+
Version: 1.x.x

token

This method gets a token for subsequent API calls.

URL

/token

Method

@@ -28,6 +28,6 @@

Sample Call

GET /api/{apiversion}/token
{

}

HTTP/1.1 200 OK
{
"status": 200,
"message": "Successful request",
"data": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.TZZ4kp5xIdYzs5RRt6_qVxJcOiLdk1IEHFMBSZ7SRENx6kyVhwfAlm-oeM4L2XFIr4evlTCxKEIKc0fZKwPcjw"
}

Notes

-

You must send a basic authentication header with this request.

+

You must send a basic authentication header with this request.

\ No newline at end of file diff --git a/docs/1.x.x/concepts/index.html b/docs/1.x.x/concepts/index.html index 0d83f206d..de1103572 100644 --- a/docs/1.x.x/concepts/index.html +++ b/docs/1.x.x/concepts/index.html @@ -2,30 +2,30 @@ - + Concepts | Routr Docs - - - + + + -
Version: 1.x.x

Concepts

+
Version: 1.x.x

Concepts

The following are some key concepts, including some of the essential routing strategies implemented in Routr.

-

Intra-Domain Routing

+

Intra-Domain Routing

Intra-Domain Routing(IDR) offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not.

For a small company with less than 50 users, you may define a domain sip.domain.com. Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames.

A multinational company like Walmart have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains sip.0001.walmart.com and sip.0002.walmart.com, and... you get the idea.

-

Double Agents

+

Double Agents



Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's spec.domain[*] list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain.

-

Single Domain Example

+

Single Domain Example

The following yaml configuration shows a simple setup, involving one Domain and two Agents:

Domain configuration

- apiVersion: v1beta1
kind: Domain
metadata:
name: Local Office
spec:
context:
domainUri: sip.local
@@ -43,7 +43,7 @@

Single
  • Agents must belong to a Domain
  • Agents Are not allowed to send a Digest username different than the username in the From-Header
  • -

    Domain Ingress Routing

    +

    Domain Ingress Routing

    In Routr, the process of receiving a call from PSTN to a Domain is as Domain Ingress Routing(DIR) and it is done using a Gateway resource. The yaml file config/gateways.yml contains the Gateways. The following example shows a typical Gateway configuration.

    - apiVersion: v1beta1
    kind: Gateway
    metadata:
    name: Plain Old Phone Service Provider
    spec:
    regService:
    host: sip.provider.net
    credentials:
    username: 'gwuser'
    secret: gwsecret
    transport: udp
    registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network

    You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected.

    @@ -52,7 +52,7 @@

    Domai

    Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.

    Routing Rules

    The spec.location block of a Number resource configuration, determines the path of an inbound call from the PSTN. The aorLink refers to an Address of Record(Agent or Peer) that is available in the location service.

    -

    Domain Egress Routing

    +

    Domain Egress Routing

    Domain Egress Routing(DER) is the way that Routr deals with a call request to a callee that exists in the Public Switched Telephone Network(PSTN) and not in the callers' Domain. The EgressPolicy consists of a rule, and a numberRef defined in the spec.context section of Domains resources.

    The rule and numberRef is defined as follows:

      @@ -65,7 +65,7 @@

      Domain

    Routing Rules

    Agents can only perform outbound calls using the Egress Policy of their Domains.

    -

    Peers Routing

    +

    Peers Routing

    Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling.

    Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the Location Service just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent.

    The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the spec.location settings in the numbers.yml configuration file.

    @@ -73,6 +73,6 @@

    Peers Routing<

    Agents are not allowed to call Peers.

    A future version of the Peer resource might feature a spec.acceptFrom.* field to allow calls from Domains or specific Agents.

    -

    +
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/agents/index.html b/docs/1.x.x/configuration/agents/index.html index 55e74ab9d..9090a5415 100644 --- a/docs/1.x.x/configuration/agents/index.html +++ b/docs/1.x.x/configuration/agents/index.html @@ -2,28 +2,28 @@ - + Agents | Routr Docs - - - + + + -
    Version: 1.x.x

    Agents

    +
    Version: 1.x.x

    Agents

    Agents represent SIP endpoints such as softphones, IP phones, or paging speakers. A Domain binds agents together. An Agent can belong to one or multiple Domains.

    The Agents configuration can be provided using the file config/agents.yml located at the root of your Routr installation.

    If using Redis this configuration gets stored in the database.

    -

    Agent Resource

    +

    Agent Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.nameFriendly name for the SIP deviceYes
    spec.privacyIf set to Private the server removes identifiable information for the requests. Defaults to NoneNo
    spec.credentials.usernameAgent's credential usernameYes
    spec.credentials.secretAgent's credential secretYes
    spec.domains[*]Context/s in which this Agent is allowed to communicate. FQDN is recommendedYes
    -

    Example

    -
    - apiVersion: v1beta1
    kind: Agent
    metadata:
    name: John Doe
    spec:
    credentials:
    username: john
    secret: '1234'
    domains: [sip.local]
    +

    Example

    +
    - apiVersion: v1beta1
    kind: Agent
    metadata:
    name: John Doe
    spec:
    credentials:
    username: john
    secret: '1234'
    domains: [sip.local]
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/domains/index.html b/docs/1.x.x/configuration/domains/index.html index 6085859a8..d1c3ed876 100644 --- a/docs/1.x.x/configuration/domains/index.html +++ b/docs/1.x.x/configuration/domains/index.html @@ -2,25 +2,25 @@ - + Domains | Routr Docs - - - + + + -
    Version: 1.x.x

    Domains

    +
    Version: 1.x.x

    Domains

    Domains group Agents together. They help isolate groups and allow the creation of rule for incoming and outgoing calling. The domains configuration can be provided using the file config/domains.yml located at the root of your Routr installation.

    If using Redis this configuration gets stored in the database.

    -

    Domain Resource

    +

    Domain Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.nameFriendly name for the SIP domainYes
    spec.context.domainUriDomain URI. FQDN is recommendedYes
    spec.context.egressPolicy.ruleRegular expression indicating when a call will be routed via spec.context.egressPolicy.numberRefNo
    spec.context.egressPolicy.numberRefReference to the Number that will route the callNo
    spec.context.accessControlList.allow[*]Traffic allow for Network in listNo
    spec.context.accessControlList.deny[*]Traffic disabled for Network in listNo

    ACL Rules may be in CIDR, IP/Mask, or single IP format. Example of rules are:

      @@ -28,7 +28,7 @@

      Domain Resou
    • 192.168.1.0/255.255.255.0
    • 192.168.0.1/31
    -

    Example

    -
    - apiVersion: v1beta1
    kind: Domain
    metadata:
    name: Local Server
    spec:
    context:
    domainUri: sip.local
    egressPolicy:
    rule: .*
    numberRef: Number0001
    accessControlList:
    deny: [0.0.0.0/1] # Deny all
    allow: [192.168.0.1/31]
    +

    Example

    +
    - apiVersion: v1beta1
    kind: Domain
    metadata:
    name: Local Server
    spec:
    context:
    domainUri: sip.local
    egressPolicy:
    rule: .*
    numberRef: Number0001
    accessControlList:
    deny: [0.0.0.0/1] # Deny all
    allow: [192.168.0.1/31]
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/gateways/index.html b/docs/1.x.x/configuration/gateways/index.html index 9c8cd2806..06645374a 100644 --- a/docs/1.x.x/configuration/gateways/index.html +++ b/docs/1.x.x/configuration/gateways/index.html @@ -2,30 +2,30 @@ - + Gateways | Routr Docs - - - + + + -
    Version: 1.x.x

    Gateways

    +
    Version: 1.x.x

    Gateways

    Use the Gateway resource to register with a SIP Gateways or SBCs and send or receive calls from the PSTN.

    The Gateways configuration can be provided using the file config/gateways.yml. The file is located at the root of your Routr installation, or as defined in the environment variable CONFIG_FILE.

    If using Redis this configuration gets stored in the database.

    For static IP authentication be sure to properly configure the spec.externAddr and spec.localnets in config.yml.

    -

    Gateway Resource

    +

    Gateway Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.nameFriendly name for the SIP deviceYes
    metadata.refReference to this resourceNo
    spec.sendRegisterSend SIP REGISTER package to gateway host. Defaults to falseNo
    spec.credentials.usernameGateway username. No required for static IP authenticationNo
    spec.credentials.secretGateway secret. No required for static IP authenticationNo
    spec.hostGateway hostYes
    spec.transportTransport protocolYes
    spec.expiresRequested lifespan of the registration in seconds. Defaults to 600No
    spec.registries.[*]Additional registries for ingress callsNo
    -

    Example of Gateway in Registration Mode

    +

    Example of Gateway in Registration Mode

    - apiVersion: v1beta1
    kind: Gateway
    metadata:
    name: Provider, Inc
    ref: GW0001
    spec:
    host: sip.provider.com
    transport: tcp
    credentials:
    username: 'user'
    secret: changeit
    -

    Example if Gateway using Static Mode

    -
    - apiVersion: v1beta1
    kind: Gateway
    metadata:
    name: Provider 2, Inc
    ref: GW0002
    spec:
    host: sip2.provider.com
    port: 5080
    transport: tcp
    +

    Example if Gateway using Static Mode

    +
    - apiVersion: v1beta1
    kind: Gateway
    metadata:
    name: Provider 2, Inc
    ref: GW0002
    spec:
    host: sip2.provider.com
    port: 5080
    transport: tcp
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/general/index.html b/docs/1.x.x/configuration/general/index.html index 5622bb790..dd1232d6e 100644 --- a/docs/1.x.x/configuration/general/index.html +++ b/docs/1.x.x/configuration/general/index.html @@ -2,54 +2,54 @@ - + General | Routr Docs - - - + + + -
    Version: 1.x.x

    General

    +
    Version: 1.x.x

    General

    The general configuration affects your entire Routr instance. The general configuration can be provided using the file config/config.yml located at the root of your Routr installation.

    -

    General Configuration Parameters

    +

    General Configuration Parameters

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    metadata.userAgentSets sip header User-Agent to the desired valueNo
    spec.dataSource.providerDefines data provider. Defaults to files_data_providerNo
    spec.dataSource.parametersData Source Parameters. Ex.: 'host=localhost,port=6379'No
    spec.bindAddrDefault stack IP addressNo
    spec.externAddrIP address to advertiseNo
    spec.localnetsLocal networks. Use in combination with spec.externAddrNo
    spec.recordRouteStay within the signaling pathNo
    spec.transport.[*].bindAddrOverwrites spec.bindAddr for transport entryNo
    spec.transport.[*].portTransport portYes
    spec.transport.[*].protocolValid values are: tcp, udp, tls, sctp, ws, wssYes
    spec.registrarIntfInternal causes the server to use the IP and port it "sees"(received & rport) from a device attempting to register. Defaults to ExternalNo
    spec.accessControlList.deny.[*]Deny incoming traffic from network listNo
    spec.accessControlList.allow.[*]Allow incoming traffic from network listNo
    spec.restService.bindAddrRestful service listening addressNo
    spec.restService.portRestful service port. Defaults to 4567No
    spec.restService.minThreadsMinimum thread allocation. Defaults to 8No
    spec.restService.maxThreadsMaximum thread allocation. Defaults to 200No
    spec.restService.timeOutMillisWill reject requests that last more than this value. Defaults to 5000(5 seconds)No
    spec.restService.unsecuredDisabled https for restful calls. Defaults to falseNo
    spec.restService.keyStorePath to keyStoreNo
    spec.restService.trueStorePath to trueStoreNo
    spec.restService.keyStorePasswordPassword for keyStoreNo
    spec.restService.trueStorePasswordPassword for trueStoreNo
    spec.securityContext.keyStorePath to keyStoreYes
    spec.securityContext.trustStorePath to trueStoreYes
    spec.securityContext.keyStorePasswordPassword for keyStoreYes
    spec.securityContext.keyStoreTypeKeyStore typeYes
    spec.securityContext.client.authTypeType of client authentication. Defaults to DisabledAll. See https://goo.gl/1vKbXW for more optionsNo
    spec.securityContext.client.protocols.[*]Accepted TLS protocols. Defaults to [TLSv1.2]No
    spec.securityContext.debuggingTurns ON or OFF ssl debugging. Defaults to falseNo
    spec.ex_rtpEngine.enabledIf enabled, it will send all media thru the RTPEngine. Defaults to falseNo
    spec.ex_rtpEngine.protoReserved to allow for NG commands via http, https, and udp. Currently only http is supportedNo
    spec.ex_rtpEngine.hostAddress for RTPEngineNo
    spec.ex_rtpEngine.portPort for RTPEngineNo
    spec.ex_convertTelToE164If enabled, it will convert the number on ingress calls to E164 format before routing the call. Defaults to falseNo
    spec.ex_uniqueGatewayPerHostPortIf enabled, it will yield an error if a Gateway with the same host and port combination already exists. Defaults to falseNo

    Variables prefixed with ex_ are experimental features and may be removed or renamed in the future.

    -

    Transport Configuration

    +

    Transport Configuration

    Routr supports tcp, udp, tls, sctp, ws, and wss as transport protocols.

    The server requires at least one transport protocol. To bind a transport protocol to a specific IP address, you can use the spec.transport.bindAddr or more generally spec.bindAddr.

    -

    Datasource Providers

    +

    Datasource Providers

    Routr currently implements two data providers: redis_data_provider and files_data_provider. The default data provider is the files_data_provider.

    The docker distribution of the server uses redis_data_provider by default

    -

    Redis Data Provider

    +

    Redis Data Provider

    The parameters for redis_data_provider are:

    ParameterDescriptionRequired
    hostRedis host. Defaults to 'localhost'No
    portRedis port. The default port is 6379No
    secretPassword to access databaseNo
    -

    Files Data Provider

    +

    Files Data Provider

    The parameters for files_data_provider are:

    ParameterDescriptionRequired
    pathPath to configuration files. Defaults to the config folderNo

    This implementation has the limitation that writes operations have to be performed manually on the files.

    -

    Configuring the server behind a NAT

    +

    Configuring the server behind a NAT

    The spec.externAddr and spec.localnets parameters help Routr identify the correct path for any given traffic. The spec.externAddr is typically the Internet facing IP address. The spec.localnets is an array with valid CIDR, IP/Mask, or single IP values. Here is quick example:

    spec:
    externAddr: 172.220.231.23
    localnets: [172.17.0.2/16]
    -

    Access Control List

    +

    Access Control List

    The Access Control List(ACL) provides with a security mechanism to disable network access from unwanted sources. ACL rules exist at general or Domain level. Here is an example, blocking all traffic except from IP address 192.168.0.1.

    spec:
    accessControlList:
    deny: [0.0.0.0/1] # Deny all
    allow: [192.168.0.1/31]
    -

    Basic Example

    -
    apiVersion: v1beta1
    spec:
    transport:
    - protocol: tcp
    port: 5060
    - protocol: udp
    port: 5060
    +

    Basic Example

    +
    apiVersion: v1beta1
    spec:
    transport:
    - protocol: tcp
    port: 5060
    - protocol: udp
    port: 5060
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/numbers/index.html b/docs/1.x.x/configuration/numbers/index.html index 01c219aa3..9268cebda 100644 --- a/docs/1.x.x/configuration/numbers/index.html +++ b/docs/1.x.x/configuration/numbers/index.html @@ -2,27 +2,27 @@ - + Numbers | Routr Docs - - - + + + -
    Version: 1.x.x

    Numbers

    +
    Version: 1.x.x

    Numbers

    Numbers represent virtual numbers used to route calls from/to the PSTN through Gateways.

    The Numbers configuration can be provided using the file config/numbers.yml located at the root of your Routr installation.

    If using Redis this configuration gets stored in the database.

    -

    Number Resource

    +

    Number Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.refReference to this resourceNo
    metadata.gwRefReference to parent GatewayYes
    metadata.geoInfo.cityCity of the NumberNo
    metadata.geoInfo.countryCountry of the NumberNo
    metadata.geoInfo.countryISOCodeThe Country ISO code for the Number (i.e., US)No
    spec.location.telUrlNumber URI available in the location serverYes
    spec.location.aorLinkAddress of record of SIP device for call routingYes
    -

    Example

    -
    - apiVersion: v1beta1
    kind: Number
    metadata:
    ref: Number0001
    gwRef: GW0001
    geoInfo:
    city: Columbus, GA
    country: USA
    countryISOCode: US
    spec:
    location:
    telUrl: 'tel:17066041487'
    aorLink: 'sip:john@sip.local'
    +

    Example

    +
    - apiVersion: v1beta1
    kind: Number
    metadata:
    ref: Number0001
    gwRef: GW0001
    geoInfo:
    city: Columbus, GA
    country: USA
    countryISOCode: US
    spec:
    location:
    telUrl: 'tel:17066041487'
    aorLink: 'sip:john@sip.local'
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/peers/index.html b/docs/1.x.x/configuration/peers/index.html index 0a5b85fd6..c6ef2b548 100644 --- a/docs/1.x.x/configuration/peers/index.html +++ b/docs/1.x.x/configuration/peers/index.html @@ -2,31 +2,31 @@ - + Peers | Routr Docs - - - + + + -
    Version: 1.x.x

    Peers

    +
    Version: 1.x.x

    Peers

    Like Agents, Peers represent SIP endpoints such as Media Servers.

    Unlike Agents, Peers aren't bound by a Domain.

    The Peers configuration can be provided using the file config/peers.yml located at the root of your Routr installation.

    If using Redis this configuration gets stored in the database.

    -

    Peer Resource

    +

    Peer Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.nameFriendly name for the SIP deviceYes
    spec.credentials.usernamePeer's credential usernameYes
    spec.credentials.secretPeer's credential secretYes
    spec.deviceWhen set it is used by the location serviceNo
    spec.contactAddrWhen set advertises this as the contactURINo
    -

    Example

    +

    Example

    - apiVersion: v1beta1
    kind: Peer
    metadata:
    name: Asterisk (Media Server)
    spec:
    credentials:
    username: ast
    secret: 'astsecret'
    device: astserver # If is not define the IP address will be used
    contactAddr: '192.168.1.2:6060'

    This peer can be reached using the AOR: ast@astserver.

    -
    +
    \ No newline at end of file diff --git a/docs/1.x.x/configuration/users/index.html b/docs/1.x.x/configuration/users/index.html index 68277855b..4f9d948c4 100644 --- a/docs/1.x.x/configuration/users/index.html +++ b/docs/1.x.x/configuration/users/index.html @@ -2,29 +2,29 @@ - + Users | Routr Docs - - - + + + -
    Version: 1.x.x

    Users

    +
    Version: 1.x.x

    Users

    Users exist in Routr to perform administrative actions on a Routr instance. The Users configuration can be provided using the file config/users.yml located at the root of your Routr installation.

    If using Redis this configuration gets stored in the database.

    -

    User Resource

    +

    User Resource

    PropertyDescriptionRequired
    apiVersionIndicates the version of the resource (Not yet implemented)Yes
    kindDefines the type of resourceYes
    metadata.nameFriendly name for the User deviceYes
    spec.credentials.usernameUser's credential usernameYes
    spec.credentials.secretUser's credential secretYes
    -

    Example

    +

    Example

    - apiVersion: v1beta1
    kind: User
    metadata:
    name: Administrator
    spec:
    credentials:
    username: admin
    secret: changeit
    -

    Changing the password? (Redis)

    +

    Changing the password? (Redis)

    First, run the command redis-cli smembers users to obtain the reference to the user. Here is an example:

    $ redis-cli smembers users
    1) "5aa69ead8fd6861d92385bac"

    Then, retrieve the document for reference running redis-cli get {REF}. For example

    @@ -33,6 +33,6 @@

    $ redis-cli set 5aa69ead8fd6861d92385bac
    "{\"apiVersion\":\"v1beta1\",\"kind\":\"User\",\"metadata\":{\"name\":\"Ctl\",\"ref\":\"5aa69ead8fd6861d92385bac\"},\"spec\":{\"credentials\":{\"username\":\"admin\",\"secret\":\"newpass\"}}}"

    A new token is issued after your next login with rctl

    -

    +
    \ No newline at end of file diff --git a/docs/1.x.x/guides/basic-setup/index.html b/docs/1.x.x/guides/basic-setup/index.html index 6e2f6bcc5..52fe41c24 100644 --- a/docs/1.x.x/guides/basic-setup/index.html +++ b/docs/1.x.x/guides/basic-setup/index.html @@ -2,54 +2,54 @@ - + Basic Setup | Routr Docs - - - + + + -
    Version: 1.x.x

    Basic Setup

    +
    Version: 1.x.x

    Basic Setup

    This document is a step-by-step guide on VoIP setup at home or the office. For calls to the PSTN you need to have a SIP provider like voip.ms or did.logic.com.

    Content

    -

    Requirements

    +

    Requirements

    This tutorial assumes the following:

    • Two SIP phones connected to the same LAN
    • A fresh installation of Routr
    • SIP providers such as voip.ms or did.logic.com
    -

    Setting up the Server

    +

    Setting up the Server

    A set of sample configuration covering this scenario is available in the Github repo. You might overwrite the files in the config folder if you wish to skip this section.

    -

    Configuring the Gateway

    +

    Configuring the Gateway

    To configure the Gateway, you must consult your SIP provider and obtain the credentials and registration host. The key fields for the configuration are metadata.ref, spec.regService.host and spec.regService.credentials. Here is an example:

    - apiVersion: v1beta1
    kind: Gateway
    metadata:
    name: Provider Inc
    spec:
    host: sip.provider.net
    credentials:
    username: 'youruser'
    secret: 'yoursecret'
    transport: udp
    -

    Configuring the Number

    +

    Configuring the Number

    To configure your Number or virtual number, you must open and edit the file config/numbers.yml. Notice in the example below, how your reference the Gateway by using the field metadata.geRef. The key field while configuring Numbers are spec.location.telUrl and spec.location.aorLink. Keep in mind that the value in spec.location.telUrl must be formatted, precisely, as sent by the provider.

    - apiVersion: v1beta1
    kind: Number
    metadata:
    gwRef: gweef506
    geoInfo:
    city: Columbus, GA
    country: USA
    countryISOCode: US
    spec:
    location:
    telUrl: 'tel:17066041487'
    aorLink: 'sip:1001@sip.local'
    -

    Creating a new Domain and EgressPolicy

    +

    Creating a new Domain and EgressPolicy

    Routr is a Domain centric SIP Server. A Domain is used to group several Agents in the same context. The Domain URI can be an arbitrary name, but we recommend using a fully qualified domain name (FQDN). You also need to configure an EgressPolicy to allow calls outside the Domain. Here is how the file config/domains.yml needs to look like:

    - apiVersion: v1beta1
    kind: Domain
    metadata:
    name: Local Office
    spec:
    context:
    domainUri: sip.local
    egressPolicy:
    rule: .*
    numberRef: dd50baa4
    -

    Creating the Agents

    +

    Creating the Agents

    We now create the Agents 1001 and 1002. Keep in mind that field spec.credentials.username can be alphanumeric, so john or john001 is also acceptable.

    Pay close attention to the credentials block since it contains the username and secret for both Agents.

    - apiVersion: v1beta1
    kind: Agent
    metadata:
    name: John Doe
    spec:
    credentials:
    username: '1001'
    secret: '1234'
    domains: [sip.local]
    - apiVersion: v1beta1
    kind: Agent
    metadata:
    name: Janie Doe
    spec:
    credentials:
    username: '1002'
    secret: '1234'
    domains: [sip.local]
    @@ -65,7 +65,7 @@

    Creating

    Verifying the Configuration

    -

    Configuring the SIP devices

    +

    Configuring the SIP devices

    We are using "Telephone" for this example. You might use any softphone you wish, keep in mind that the configuration might look slightly different.

    @@ -77,13 +77,13 @@

    If everything went well, we only need to confirm that both softphones have registered correctly. Conveniently you can use the .rctl locate to obtain a list of registered devices. It may seem like much information. However, what's relevant here is that both 1001 and 1002 are present in the location service and therefore, can reach each other.

    -

    Making calls

    +

    Making calls

    The last step is easy. If everything went well, you are now able to call any device inside or outside your Domain. Use the destination URI (eg.: 1001@sip.local or 7853178060@sip.local).

    -

    What's Next?

    +

    What's Next?

    You can check out the https://github.com/fonoster../wiki/Home to see more examples. If you have any questions, start an issue or contact us via:

    +
    \ No newline at end of file diff --git a/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html b/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html index 56ad3df9c..9a7c6ea44 100644 --- a/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html +++ b/docs/1.x.x/guides/routr-as-asterisk-frontend/index.html @@ -2,30 +2,30 @@ - + Routr as Asterisk frontend | Routr Docs - - - + + + -
    Version: 1.x.x

    Routr as Asterisk frontend

    +
    Version: 1.x.x

    Routr as Asterisk frontend

    This guide explores the use case of using Asterisk merely as a Media Server and more specialized software, like Routr, to take care of the signaling and resource management. In other words, Asterisk is in charge of the IVR, voice mail, call recording, while Routr deals with connecting Agents, Peers, and Gateways. The following illustration depicts our scenario:

    Content

    -

    Requirements

    +

    Requirements

    This tutorial assumes the following:

    • You have a SIP phone connected to the same LAN as Routr and Asterisk
    • @@ -35,7 +35,7 @@

      Requirements

      Before starting this guide make sure to have a fresh installation of Routr server.

      -

      Configuration Overview

      +

      Configuration Overview

      With a fresh installation of Routr, you have most of the configuration you need to follow this tutorial. We, however, need to make some minor changes to configuration files to run our scenario.

      The first file we need to examine and change is config/peers.yml. Make a note of the username and secret for the Peer "ast" since we are using this to configure Asterisk. Also, search for the field spec.device and change it to match the Agents domain(sip.local). The file now looks similar to this:

      config/peers.yml

      @@ -52,7 +52,7 @@

      Confi

      You can verify that your device registered correctly with Routr by running the locate command:

      -

      Configuring Asterisk

      +

      Configuring Asterisk

      Using PJSIP

      Backup your pjsip.conf and pjsip_wizard.conf. Update your pjsip.conf with the following:

      [transport-tcp]
      type=transport
      protocol=tcp
      bind=0.0.0.0:6060
      @@ -66,13 +66,13 @@

      Configu
      [default]
      exten => 1001,1,Answer
      exten => 1001,n,Playback(tt-monkeys)
      exten => 1001,n,Hangup

      Restart your Asterisk and check the location service. A new device now appears.

      -

      Calling Asterisk from John's device

      +

      Calling Asterisk from John's device

      We can now call ast@sip.local and if everything went well listen to a group of really annoying monkeys :).

      -

      What's Next?

      +

      What's Next?

      You can check out the wiki to see more examples. If you have any questions start an issue or contact us via:

    +
    \ No newline at end of file diff --git a/docs/1.x.x/guides/running-on-kubernetes/index.html b/docs/1.x.x/guides/running-on-kubernetes/index.html index d9aca77a5..3388c2390 100644 --- a/docs/1.x.x/guides/running-on-kubernetes/index.html +++ b/docs/1.x.x/guides/running-on-kubernetes/index.html @@ -2,26 +2,26 @@ - + Running on Kubernetes | Routr Docs - - - + + + -
    Version: 1.x.x

    Running on Kubernetes

    +
    Version: 1.x.x

    Running on Kubernetes

    This document is a short guide about running the dockerized version of Routr Server on Kubernetes.

    -

    Run in Kubernetes

    +

    Run in Kubernetes

    To run Routr in Kubernetes, you must set your EXTERN_ADDR in .k8s/routr.yml.

    This variable must be set to the public address(if running Routr locally, use your host address)

    Additionally, you must create the following Kubernetes resources:

    -
    kubectl create -f k8s/configmaps.yml
    kubectl create -f k8s/redis.yml
    kubectl create -f k8s/routr.yml
    +
    kubectl create -f k8s/configmaps.yml
    kubectl create -f k8s/redis.yml
    kubectl create -f k8s/routr.yml
    \ No newline at end of file diff --git a/docs/1.x.x/guides/running-with-docker-or-compose/index.html b/docs/1.x.x/guides/running-with-docker-or-compose/index.html index b784d6feb..5d87bc3cd 100644 --- a/docs/1.x.x/guides/running-with-docker-or-compose/index.html +++ b/docs/1.x.x/guides/running-with-docker-or-compose/index.html @@ -2,19 +2,19 @@ - + Running with Docker | Routr Docs - - - + + + -
    Version: 1.x.x

    Running with Docker

    -

    Please refer to Docker Hub for a detail guide on how to use Routr's docker image.

    +
    Version: 1.x.x

    Running with Docker

    +

    Please refer to Docker Hub for a detail guide on how to use Routr's docker image.

    \ No newline at end of file diff --git a/docs/1.x.x/guides/securing-the-signaling-path/index.html b/docs/1.x.x/guides/securing-the-signaling-path/index.html index 2fd9a68db..9993510ab 100644 --- a/docs/1.x.x/guides/securing-the-signaling-path/index.html +++ b/docs/1.x.x/guides/securing-the-signaling-path/index.html @@ -2,34 +2,34 @@ - + Securing the signaling path | Routr Docs - - - + + + -
    Version: 1.x.x

    Securing the signaling path

    +
    Version: 1.x.x

    Securing the signaling path

    Follow this guide to secure the signaling between your endpoints and Routr. Keep in mind that Routr only secures the signaling and that the endpoints are ultimately responsible for securing the media.

    For this guide, we used a fictitious domain name to demonstrate the process of securing the signaling path

    -

    Creating a Java Keystore(.JKS) certificate

    +

    Creating a Java Keystore(.JKS) certificate

    We need a keystore (.jks) to properly handling the certificates. The following steps create a valid keystore file using a self-signed method or using the free Let's Encrypt service.

    -

    Creating a self-signed Certificate

    +

    Creating a self-signed Certificate

    Perhaps the easiest way to create a valid certificate for Routr is using a self-signed certificate. To generate the certificate change into etc/certs in your Routr installation and run the following script:

    keytool -genkey -keyalg RSA \
    -noprompt \
    -alias routr \
    -keystore domains-cert.jks \
    -storepass changeit \
    -keypass changeit \
    -validity 365 \
    -keysize 2048 \
    -dname "CN=sip.ocean.com, OU=OSS, O=Your Company Inc, L=Sanford, ST=NC, C=US" \
    -ext SAN=dns:sip.ocean.com,dns:localhost,ip:127.0.0.1

    Remember to adjust the values to match your project's information.

    WSS does not work with a self-signed certificate. However, you can add a security exception by using https instead of wss in your browser's search bar and then accepting the security certificate.

    -

    Creating a Certificate using Let's Encrypt

    +

    Creating a Certificate using Let's Encrypt

    The recommended way to create a valid certificate for Routr is using the free service Let's Encrypt. Please go to https://letsencrypt.org/ for details on how to install the required tooling. To generate the certificate, use the following steps:

    ➊ Create keys

    certbot certonly --standalone -d sip.ocean.com --email admin@sip.ocean.com
    @@ -39,18 +39,18 @@

    keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore domains-cert.jks

    -

    Installing the Certificate in Routr

    +

    Installing the Certificate in Routr

    To enable secure signaling in Routr, copy your certificate in etc/certs and edit the file config/config.yml to look like this:

    apiVersion: v1beta1
    metadata:
    userAgent: Routr v1.0
    spec:
    securityContext:
    keyStore: etc/certs/domains-cert.jks
    trustStore: etc/certs/domains-cert.jks
    keyStorePassword: 'changeit'
    trustStorePassword: 'changeit'
    keyStoreType: 'jks'
    debugging: true # Enabled debug only for testing
    transport:
    - protocol: tls
    port: 5061
    ...

    If you set the property spec.securityContext.debugging to true, you can get some valuable information about the status of the configuration. You can also test your configuration using the following command:

    openssl s_client -host 192.168.1.2 -port 5061    # Remember to use Routr's IP
    -

    Setting up the Sip Phones

    +

    Setting up the Sip Phones

    For this guide, we are using Blink Pro.

    Go to the account that you want to secure, select Advanced -> Sip Signaling and change the parameter Primary Proxy to ${proxyHost}:${proxyPort};transport=tls. See the example in the following image:

    If everything went well, you should see a green padlock like the one in the image below:

    -
    + \ No newline at end of file diff --git a/docs/1.x.x/introduction/community/index.html b/docs/1.x.x/introduction/community/index.html index 9de224bed..f40981870 100644 --- a/docs/1.x.x/introduction/community/index.html +++ b/docs/1.x.x/introduction/community/index.html @@ -2,19 +2,19 @@ - + Community | Routr Docs - - - + + + -
    Version: 1.x.x

    Community

    +
    Version: 1.x.x

    Community

    Routr is developed in the open. Here are some of the channels we use to communicate and contribute:

    Discord community GitHub Discussions

    @@ -28,19 +28,19 @@

    Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. If community support is insufficient for your situation, please refer to the Commercial Support section below.

    -

    Contributing

    +

    Contributing

    We welcome community contributions! Please see the CONTRIBUTING.md file in the respective Routr repository for instructions on how to submit changes. If you are planning on making more elaborate or controversial changes, please discuss them on the mailing list before sending a pull request.

    Development: GitHub Discussions – for discussions around Routr development

    -

    Developer Summits

    +

    Developer Summits

    We strive to be as open and public as possible. Technical discussions happen on the development list, our in-person meeting notes are public, and we have public calls. Below, you can find links to our developer summits at JConfDominicana 2019.

    2019 developer summit notes (Come back to see updated link)

    -

    Code of Conduct

    +

    Code of Conduct

    To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

    -

    Commercial Support

    +

    Commercial Support

    The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open source project which does not endorse any company. This list goes down alphabetically.

    Pedro Sanders (independent contractor)

    -

    Acknowledgments

    +

    Acknowledgments

    Routr was developed initially by Pedro Sanders. Fonoster sponsored the majority of its development.

    -

    Pedro Sanders contributed Routr's logo.

    +

    Pedro Sanders contributed Routr's logo.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/comparison/index.html b/docs/1.x.x/introduction/comparison/index.html index 5f1e7abc8..49bc07bf2 100644 --- a/docs/1.x.x/introduction/comparison/index.html +++ b/docs/1.x.x/introduction/comparison/index.html @@ -2,24 +2,24 @@ - + Comparison | Routr Docs - - - + + + -
    Version: 1.x.x

    Comparison

    +
    Version: 1.x.x

    Comparison

    A question we always get is how Routr compares to other software such as Asterisk, FreeSWITCH, or Kamailio. For a fair comparison, we separate this into two basic categories: SIP Servers and PBX.

    -

    Routr vs Asterisk/FreeSWITCH?

    +

    Routr vs Asterisk/FreeSWITCH?

    Asterisk and FreeSWITCH fall into the PBX category. Their role is to provide media capabilities such as IVR, Voicemail, Conferencing, Recording, and even video. Both Asterisk and FreeSWITCH are very good at what they do, each with their strengths and weaknesses.

    Routr is not a PBX and does not pretend to solve the same issue. Routr focuses on the SIP Server role.

    -

    Routr vs Kamailio/OpenSER?

    +

    Routr vs Kamailio/OpenSER?

    Typically, large VoIP networks and Unified Communication platforms include SIP servers of some sort. The perform the following functions:

    • Proxy, Registrar, Location, Forking, Redirect
    • @@ -28,9 +28,9 @@

      Rou
    • Gateway to the PSTN

    Routr attempts to solve the same core problems as Kamailio/OpenSER but with a different approach.

    -

    So what is the problem with Kamailio/OpenSER?

    +

    So what is the problem with Kamailio/OpenSER?

    Kamailio is an impressive piece of software but is not ready-to-use like Asterisk or FreeSWITCH. To get it to work, you have to understand SIP and write some code.

    -

    What can we do to make it better?

    +

    What can we do to make it better?

    Our vision for a Next-generation SIP Server can be summarized as follows:

    • Make Routr Cloud-Native (After all it is 2019)
    • @@ -38,6 +38,6 @@

      join the discussion.

    +

    If you want to support the initiative, please join the discussion.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/faq/index.html b/docs/1.x.x/introduction/faq/index.html index 6f50d5d17..ca0d7e556 100644 --- a/docs/1.x.x/introduction/faq/index.html +++ b/docs/1.x.x/introduction/faq/index.html @@ -2,29 +2,29 @@ - + FAQ | Routr Docs - - - + + + -
    Version: 1.x.x

    FAQ

    -

    What is Routr?

    +
    Version: 1.x.x

    FAQ

    +

    What is Routr?

    Routr is an open-source SIP Server and tooling to deploy VoIP networks. See the overview.

    -

    What dependencies does Routr have?

    +

    What dependencies does Routr have?

    Routr server runs standalone and has no external dependencies. However, you might need to use Redis depending in the complexity of your requirements.

    -

    How does Routr compare with other SIP servers

    +

    How does Routr compare with other SIP servers

    See the comparison page.

    -

    What language is used to develop Routr?

    +

    What language is used to develop Routr?

    Most components in Routr are written in Javascript(with Oracle's GraalJS).

    -

    What license does Routr uses?

    -

    Routr is released under the MIT license.

    +

    What license does Routr uses?

    +

    Routr is released under the MIT license.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/glossary/index.html b/docs/1.x.x/introduction/glossary/index.html index a4b954ada..2f3a71bc1 100644 --- a/docs/1.x.x/introduction/glossary/index.html +++ b/docs/1.x.x/introduction/glossary/index.html @@ -2,40 +2,40 @@ - + Glossary | Routr Docs - - - + + + -
    Version: 1.x.x

    Glossary

    +
    Version: 1.x.x

    Glossary

    This following table features some essential concepts, including the different routing types implemented by the server.

    -

    User

    +

    User

    Users perform administrative actions on the server.

    -

    Agent

    +

    Agent

    Agents represent SIP endpoints such as softphones and IP phones, or paging speakers.

    -

    Domain

    +

    Domain

    Enables the creation of isolated groups of Agents

    -

    Peer

    +

    Peer

    Similar to Agents but without Domain boundaries

    -

    Gateway

    +

    Gateway

    IP entity that allows call termination

    -

    Number

    +

    Number

    Routes and translate calls between the PSTN and Routr

    -

    Intra-Domain Routing (IDR)

    +

    Intra-Domain Routing (IDR)

    Routing strategy for signaling within the same Domain

    -

    Domain Ingress Routing (DIR)

    +

    Domain Ingress Routing (DIR)

    Routing strategy used when an Agent or Peer must go outside the Domain using a Gateway

    -

    Domain Egress Routing (DER)

    +

    Domain Egress Routing (DER)

    Calling from an Agent to the PSTN thru a Gateway

    -

    Peer Egress Routing (PER)

    -

    Similar to DER but applies only to Peers.

    +

    Peer Egress Routing (PER)

    +

    Similar to DER but applies only to Peers.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/installation/index.html b/docs/1.x.x/introduction/installation/index.html index d4f383213..040778f1d 100644 --- a/docs/1.x.x/introduction/installation/index.html +++ b/docs/1.x.x/introduction/installation/index.html @@ -2,47 +2,47 @@ - + Installation | Routr Docs - - - + + + -
    Version: 1.x.x

    Installation

    -

    Instant Server Installation with Snaps

    +
    Version: 1.x.x

    Installation

    +

    Instant Server Installation with Snaps

    Install Routr in seconds on Linux (Ubuntu and others) with:

    sudo snap install routr-server

    Get it from the Snap Store

    Routr Snap is recommended for Linux deployments

    Installing snaps is very quick. By running that command you have your full Routr server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto-update when we release new versions.

    -

    DigitalOcean droplet

    +

    DigitalOcean droplet

    Build and Deploy to a DigitalOcean droplet

    do-btn-blue

    -

    Docker

    +

    Docker

    Deploy with docker compose

    Docker logo

    OR Use the automated build image of our most recent release

    docker pull fonoster/routr:latest

    OR select a specific release (details of releases available):

    docker pull fonoster/routr:vX.X.X
    -

    Kubernetes

    +

    Kubernetes

    Deploy to Kubernetes in few easy steps

    -

    Google Cloud Shell

    +

    Google Cloud Shell

    Routr one-click interactive tutorial will get you familiar with Routr server and the command-line interface.

    Open in Cloud Shell

    -

    Custom

    +

    Custom

    There are no special requirements to install and run the server. Just follow this easy steps:

    ➊ Download the server for your platform

    PlatformDownload
    Linuxtar.gz
    macOStar.gz
    Windowstar.gz, zip

    ➋ Then extract it:

    tar xvfz routr-*.tar.gz
    cd routr-*

    ➌ Run the server using the routr command

    -
    ./routr
    +
    ./routr
    \ No newline at end of file diff --git a/docs/1.x.x/introduction/media/index.html b/docs/1.x.x/introduction/media/index.html index 90bc76030..c9feaa711 100644 --- a/docs/1.x.x/introduction/media/index.html +++ b/docs/1.x.x/introduction/media/index.html @@ -2,29 +2,29 @@ - + Media | Routr Docs - - - + + + -
    Version: 1.x.x

    Media

    +
    +
    \ No newline at end of file diff --git a/docs/1.x.x/introduction/overview/index.html b/docs/1.x.x/introduction/overview/index.html index 5685b98c3..6c58112cd 100644 --- a/docs/1.x.x/introduction/overview/index.html +++ b/docs/1.x.x/introduction/overview/index.html @@ -2,22 +2,22 @@ - + Overview | Routr Docs - - - + + + -
    Version: 1.x.x

    Overview

    -

    What is Routr?

    +
    Version: 1.x.x

    Overview

    +

    What is Routr?

    Routr is a lightweight sip proxy, location server, and registrar that provides a reliable and scalable SIP infrastructure for telephony carriers, communication service providers, and integrators. It also provides with capabilities that are suitable for the enterprise and personal needs. To get involved in the development of this project, please contact us at @fonoster.

    -

    Features

    +

    Features

    Routr's main features are:

    • Typical Sip Server functions; Proxy, Registrar, Location Service
    • @@ -27,22 +27,22 @@

      FeaturesComponents

      +

      Components

      The Routr ecosystem consists of three main components:

      • The Routr server which is the main component of the ecosystem
      • The command-line interface, rctl, for remote management of the server
      • An optional web console for easy management of the server
      -

      Architecture

      +

      Architecture

      This diagram illustrates the architecture of Routr and some of its ecosystem components:




      At the center of Routr are the routing rules. These rules are the core of Routr, in addition to the typical SIP Server the functions such as Proxy, Location, and Registrar. The primary integration points are the data abstraction layer, the event publisher, and the RESTful API. This integration points, allow for easy integration with third-party software.

      -

      Use cases

      +

      Use cases

      Routr specializes in the management of SIP resources and domain-centric routing strategies. It works well in front of the Media servers like Asterisk or FreeSWITCH. Routr runs in all major operating systems, in Docker, and Kubernetes.

      -

      Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI.

    +

    Unlike Kamailio and OpenSIPS, Routr does not require any scripting to perform any of its typical routing tasks. Routing rules are configured, not programmed. The monitoring tasks are centralized using a RESTful API, and from that API, it is possible to control de service using the command-line interface or the web UI.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/performance-tests/user-location/index.html b/docs/1.x.x/introduction/performance-tests/user-location/index.html index 068f5165d..3fe1c0187 100644 --- a/docs/1.x.x/introduction/performance-tests/user-location/index.html +++ b/docs/1.x.x/introduction/performance-tests/user-location/index.html @@ -2,36 +2,36 @@ - + Routr 1.0RC3 - User Location Lookup Performance Tests | Routr Docs - - - + + + -
    Version: 1.x.x

    Routr 1.0RC3 - User Location Lookup Performance Tests

    +
    Version: 1.x.x

    Routr 1.0RC3 - User Location Lookup Performance Tests

    Author: Pedro Sanders

    1. Overview
    2. User Location Performance Tests
      1. New registrations
      2. Update registrations
      3. User location lookup
    3. Conclusions
    4. Notes
    5. References
    -

    Overview

    -

    Scope

    +

    Overview

    +

    Scope

    These tests were intended to show the performances of the User Location implementation in Routr 1.0RC3. These can be useful to help you better dimension your Routr installation. For these test the login module was deactivated. The network configuration used during the test is depicted in the following image:

    -

    Software

    +

    Software

    As load generator (UAC side) it was used SIPp.

    All used SIP-related software was configured to use TCP as the transport protocol for SIP.

    -

    Platform

    +

    Platform

    Description of the elements used:

    Equipment #1 - [Processor], [Memory] with [Operating system] testing. Equipment #2 - [Processor], [Memory] with [Operating system] testing. Equipment #x - [Processor], [Memory] with [Operating system] testing.

    -

    Performance Tests

    +

    Performance Tests

    Routr running without any special

    SIPp was used to generate [# of interaction] MESSAGE requests via Routr. The results reflect the capacity [General or sub topic] and speed (average response time).

    @@ -59,6 +59,6 @@

    Performanc
  • Conclusions
  • Notes
  • References
  • -

    +
    \ No newline at end of file diff --git a/docs/1.x.x/introduction/roadmap/index.html b/docs/1.x.x/introduction/roadmap/index.html index f9413849e..6c948f0bf 100644 --- a/docs/1.x.x/introduction/roadmap/index.html +++ b/docs/1.x.x/introduction/roadmap/index.html @@ -2,27 +2,27 @@ - + Roadmap | Routr Docs - - - + + + -
    Version: 1.x.x

    Roadmap

    +
    Version: 1.x.x

    Roadmap

    The following is only a selection of some of the major features we plan to implement soon. To get a complete overview of planned features and current work, see the issue trackers for the various repositories, for example, the Routr server.

    -

    Accounting, Authentication, and Authorization

    +

    Accounting, Authentication, and Authorization

    Routr does not currently provide any mechanism for aid the accounting. Our current priority is to implement a module to support pushing accounting, authentication, and authorization events.

    -

    IM and Presence

    +

    IM and Presence

    We understand that instant-messaging and presence are an essential piece of any VoIP network. We are currently looking into the SIMPLE and XCAP protocols to provide IM and Presence in Routr.

    -

    Per-domain Certificate

    +

    Per-domain Certificate

    Routr, currently its only possible to install a single certificate with multiple-domains. In the future, we want to ease the certificate installation/updating process by allowing a per-domain certificate.

    -

    Support the Ecosystem

    -

    We want to release a stable version of the web UI soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr.

    +

    Support the Ecosystem

    +

    We want to release a stable version of the web UI soon. The web UI is one of our primary strategy to facilitate the deployment of VoIP networks with Routr.

    \ No newline at end of file diff --git a/docs/1.x.x/introduction/test-plan/index.html b/docs/1.x.x/introduction/test-plan/index.html index 866a7ca4c..4f8461bac 100644 --- a/docs/1.x.x/introduction/test-plan/index.html +++ b/docs/1.x.x/introduction/test-plan/index.html @@ -2,20 +2,20 @@ - + Test Plan | Routr Docs - - - + + + -
    Version: 1.x.x

    Test Plan

    -

    DUT and Endpoints Configuration

    +
    Version: 1.x.x

    Test Plan

    +

    DUT and Endpoints Configuration

    • Routr has a Gateway resource configured to use TCP transport.
    • The Gateway resource is configured with a range of E.164 numbers.
    • @@ -23,12 +23,12 @@

      Test Case Summary

      +

      Test Case Summary

      Test Case IDTitleRequired
      1.1.1Registration SetupYes
      1.1.2Registration FailureYes
      1.1.3Maintaining RegistrationYes
      1.1.4AuthenticationYes
      1.1.5TLS Server ModeNo
      1.2.1DNS LookupYes
      1.2.2Static Mode Failure DetectionNo
      1.2.3TLS AuthenticationNo
      1.2.4TLS Certificate ValidationNo
      1.3.1Intra-Domain Routing / Successful Invite SetupYes
      1.3.2Intra-Domain Routing / Invite Rejected by CalleeYes
      1.3.3Intra-Domain Routing / Invite Cancelled by CallerYes
      1.3.4Intra-Domain Routing / Invite Cancelled by CalleeYes
      1.4.1Domain-Ingress Routing / Successful Invite SetupYes
      1.4.2Domain-Ingress Routing / Invite Rejected by CalleeYes
      1.4.3Domain-Ingress Routing / Invite Cancelled by CallerYes
      1.4.4Domain-Ingress Routing / Invite Cancelled by CalleeYes
      1.5.1Domain-Egress Routing / Successful Invite SetupYes
      1.5.2Domain-Egress Routing / Invite Rejected by CalleeYes
      1.5.3Domain-Egress Routing / Invite Cancelled by CallerYes
      1.5.4Domain-Egress Routing / Invite Cancelled by CalleeYes
      1.6.1Peer-Egress Routing / Successful Invite SetupYes
      -

      Test Cases

      -

      Test Case 1.1.1: Registration Setup

      +

      Test Cases

      +

      Test Case 1.1.1: Registration Setup

      Objective: This section tests the registration compatibility between Routr and the SIP Trunk provider. If the SIP Trunk provider under testing is IP-based, this section can be skipped.

      Procedure:

      -
      DescriptionExpected Result
      Step 1Restart Routr to send a REGISTER message to the GatewayRoutr restarts
      Step 2Wait for the server to restartUAS receives correct registration sequence
      Step 3Clear the registration tableRegistry table is empty
    +
    DescriptionExpected Result
    Step 1Restart Routr to send a REGISTER message to the GatewayRoutr restarts
    Step 2Wait for the server to restartUAS receives correct registration sequence
    Step 3Clear the registration tableRegistry table is empty
    \ No newline at end of file diff --git a/docs/1.x.x/welcome/index.html b/docs/1.x.x/welcome/index.html index e9786e9c8..775d1bcd4 100644 --- a/docs/1.x.x/welcome/index.html +++ b/docs/1.x.x/welcome/index.html @@ -2,19 +2,19 @@ - + Welcome | Routr Docs - - - + + + -
    Version: 1.x.x

    Welcome

    -

    Use the left-hand to navigate to find topics of interest.

    +
    Version: 1.x.x

    Welcome

    +

    Use the left-hand to navigate to find topics of interest.

    \ No newline at end of file diff --git a/docs/2.0.0/changelog/index.html b/docs/2.0.0/changelog/index.html index e0cd90ebe..5083a3a24 100644 --- a/docs/2.0.0/changelog/index.html +++ b/docs/2.0.0/changelog/index.html @@ -1,20 +1,20 @@ - + - -Changelog | Routr Docs + +Changelog | Routr Docs - - - + + + - +
    \ No newline at end of file diff --git a/docs/2.0.0/community/index.html b/docs/2.0.0/community/index.html index 307233f67..1468c929f 100644 --- a/docs/2.0.0/community/index.html +++ b/docs/2.0.0/community/index.html @@ -1,20 +1,20 @@ - + - -Community | Routr Docs + +Community | Routr Docs - - - + + + -
    Version: 2.0.0

    Community

    +
    Version: 2.0.0

    Community

    We are developing Routr in the open. These are the channels we use for communication and contribution:

    • Discord community
    • @@ -25,17 +25,17 @@

      Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required.

      -

      Contributing

      +

      Contributing

      We welcome community contributions! Please see the CONTRIBUTING.md file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request.

      Development: GitHub Discussions – for discussions around Routr development

      -

      Developer Summits

      +

      Developer Summits

      We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting.

      -

      Code of Conduct

      +

      Code of Conduct

      To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

      -

      Commercial Support

      +

      Commercial Support

      The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically.

      Pedro Sanders (creator and maintainer)

      -

      Acknowledgments

      -

      Routr was developed initially by Pedro Sanders. Fonoster and Camanio AB sponsored the majority of its development.

    +

    Acknowledgments

    +

    Routr was developed initially by Pedro Sanders. Fonoster and Camanio AB sponsored the majority of its development.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/command-line/ctl/index.html b/docs/2.0.0/connect/command-line/ctl/index.html index 6b3834220..32dafd581 100644 --- a/docs/2.0.0/connect/command-line/ctl/index.html +++ b/docs/2.0.0/connect/command-line/ctl/index.html @@ -1,204 +1,204 @@ - + - -CTL | Routr Docs + +CTL | Routr Docs - - - + + + -
    Version: 2.0.0

    CTL

    +
    Version: 2.0.0

    CTL

    Command-Line for Routr server.

    Usage

    $ npm install -g @routr/ctl
    $ rctl COMMAND
    running command...
    $ rctl (--version)
    @routr/ctl/2.1.11 linux-x64 node-v18.17.1
    $ rctl --help [COMMAND]
    USAGE
    $ rctl COMMAND
    ...

    Commands

    -

    rctl acl create

    +

    rctl acl create

    Creates a new ACL

    USAGE
    $ rctl acl create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new ACL

    EXAMPLES
    $ rctl acl create
    Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/acl/create.ts

    -

    rctl acl delete [REF]

    +

    rctl acl delete [REF]

    Deletes an Access Control List

    USAGE
    $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes an Access Control List

    EXAMPLES
    $ rctl acl delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/acl/delete.ts

    -

    rctl acl describe [REF]

    +

    rctl acl describe [REF]

    shows details of an ACL

    USAGE
    $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details of an ACL

    See code: dist/commands/acl/describe.ts

    -

    rctl acl get [REF]

    +

    rctl acl get [REF]

    Shows a list of paginated ACLs or a single ACL if a ref is provided

    USAGE
    $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to an ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated ACLs or a single ACL if a ref is provided

    EXAMPLES
    $ rctl acl get
    Ref Name Deny List Allow List
    9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28

    See code: dist/commands/acl/get.ts

    -

    rctl acl update REF

    +

    rctl acl update REF

    Updates an existing ACL

    USAGE
    $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing ACL

    EXAMPLES
    $ rctl acl update
    Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/acl/update.ts

    -

    rctl agents create

    +

    rctl agents create

    Creates a new Agent

    USAGE
    $ rctl agents create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Agent

    EXAMPLES
    $ rctl agents create
    Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/agents/create.ts

    -

    rctl agents delete [REF]

    +

    rctl agents delete [REF]

    Deletes an Agent

    USAGE
    $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes an Agent

    EXAMPLES
    $ rctl agents delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/agents/delete.ts

    -

    rctl agents describe [REF]

    +

    rctl agents describe [REF]

    shows details of an Agent

    USAGE
    $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Agent

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details of an Agent

    See code: dist/commands/agents/describe.ts

    -

    rctl agents get [REF]

    +

    rctl agents get [REF]

    Shows a list of paginated Agents or a single Agent if ref is provided

    USAGE
    $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF Optional Agents reference

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] The number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Agents or a single Agent if ref is provided

    EXAMPLES
    $ rctl agents get
    Ref Name Username Domain Privacy Enabled
    d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes

    See code: dist/commands/agents/get.ts

    -

    rctl agents update REF

    +

    rctl agents update REF

    Updates an existing Agent

    USAGE
    $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Agent

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Agent

    EXAMPLES
    $ rctl agents update
    Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/agents/update.ts

    -

    rctl autocomplete [SHELL]

    +

    rctl autocomplete [SHELL]

    display autocomplete installation instructions

    USAGE
    $ rctl autocomplete [SHELL] [-r]

    ARGUMENTS
    SHELL shell type

    FLAGS
    -r, --refresh-cache Refresh cache (ignores displaying instructions)

    DESCRIPTION
    display autocomplete installation instructions

    EXAMPLES
    $ rctl autocomplete

    $ rctl autocomplete bash

    $ rctl autocomplete zsh

    $ rctl autocomplete --refresh-cache

    See code: @oclif/plugin-autocomplete

    -

    rctl credentials create

    +

    rctl credentials create

    Creates a new set of Credentials

    USAGE
    $ rctl credentials create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new set of Credentials

    EXAMPLES
    $ rctl credentials create
    Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/credentials/create.ts

    -

    rctl credentials delete [REF]

    +

    rctl credentials delete [REF]

    Deletes a set of Credentials

    USAGE
    $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a set of Credentials

    EXAMPLES
    $ rctl credentials delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/credentials/delete.ts

    -

    rctl credentials describe [REF]

    +

    rctl credentials describe [REF]

    shows details for a set of Credentials

    USAGE
    $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a set of Credentials

    See code: dist/commands/credentials/describe.ts

    -

    rctl credentials get [REF]

    +

    rctl credentials get [REF]

    Shows a list of paginated Credentials or a single set if ref is provided

    USAGE
    $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Credentials or a single set if ref is provided

    EXAMPLES
    $ rctl credentials get
    Ref Name Deny List Allow List
    80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25

    See code: dist/commands/credentials/get.ts

    -

    rctl credentials update REF

    +

    rctl credentials update REF

    Updates an existing set of Credentials

    USAGE
    $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing set of Credentials

    EXAMPLES
    $ rctl credentials update
    Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/credentials/update.ts

    -

    rctl domains create

    +

    rctl domains create

    Creates a new set Domain

    USAGE
    $ rctl domains create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new set Domain

    EXAMPLES
    $ rctl domains create
    Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/domains/create.ts

    -

    rctl domains delete [REF]

    +

    rctl domains delete [REF]

    Deletes a Domain

    USAGE
    $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Domain

    EXAMPLES
    $ rctl domains delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/domains/delete.ts

    -

    rctl domains describe [REF]

    +

    rctl domains describe [REF]

    show details of a Domain

    USAGE
    $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    show details of a Domain

    See code: dist/commands/domains/describe.ts

    -

    rctl domains get [REF]

    +

    rctl domains get [REF]

    Shows a list of paginated Domains or a single Domain if ref is provided

    USAGE
    $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Domains or a single Domain if ref is provided

    EXAMPLES
    $ rctl domains get
    Ref Name URI
    ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local

    See code: dist/commands/domains/get.ts

    -

    rctl domains update REF

    +

    rctl domains update REF

    Updates an existing Domain

    USAGE
    $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Domain

    EXAMPLES
    $ rctl domains update
    Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/domains/update.ts

    -

    rctl numbers create

    +

    rctl numbers create

    Creates a new Number

    USAGE
    $ rctl numbers create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Number

    EXAMPLES
    $ rctl numbers create
    Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468

    See code: dist/commands/numbers/create.ts

    -

    rctl numbers delete [REF]

    +

    rctl numbers delete [REF]

    Deletes a Number

    USAGE
    $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Number

    EXAMPLES
    $ rctl numbers delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/numbers/delete.ts

    -

    rctl numbers describe [REF]

    +

    rctl numbers describe [REF]

    shows details for a Number

    USAGE
    $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Number

    See code: dist/commands/numbers/describe.ts

    -

    rctl numbers get [REF]

    +

    rctl numbers get [REF]

    Shows a list of paginated Numbers or a single Number if ref is provided

    USAGE
    $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Numbers or a single Number if ref is provided

    EXAMPLES
    $ rctl numbers get
    Ref Name Telephony URL AOR Link Geo
    a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)

    See code: dist/commands/numbers/get.ts

    -

    rctl numbers update REF

    +

    rctl numbers update REF

    Updates an existing set of Credentials

    USAGE
    $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing set of Credentials

    EXAMPLES
    $ rctl numbers update
    Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/numbers/update.ts

    -

    rctl peers create

    +

    rctl peers create

    Creates a new Peer

    USAGE
    $ rctl peers create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Peer

    EXAMPLES
    $ rctl peers create
    Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/peers/create.ts

    -

    rctl peers delete [REF]

    +

    rctl peers delete [REF]

    Deletes a Peer

    USAGE
    $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Peer

    EXAMPLES
    $ rctl peers delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/peers/delete.ts

    -

    rctl peers describe [REF]

    +

    rctl peers describe [REF]

    shows details for a Peer

    USAGE
    $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Peer

    See code: dist/commands/peers/describe.ts

    -

    rctl peers get [REF]

    +

    rctl peers get [REF]

    Shows a list of paginated Peers or a single Peer if ref is provided

    USAGE
    $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Peers or a single Peer if ref is provided

    EXAMPLES
    $ rctl peers get
    Ref Name Username AOR Balancing Algorithm Session Affinity
    6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes

    See code: dist/commands/peers/get.ts

    -

    rctl peers update REF

    +

    rctl peers update REF

    Updates an existing Peer

    USAGE
    $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Peer

    EXAMPLES
    $ rctl peers update
    Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555

    See code: dist/commands/peers/update.ts

    -

    rctl plugins

    +

    rctl plugins

    List installed plugins.

    USAGE
    $ rctl plugins [--core]

    FLAGS
    --core Show core plugins.

    DESCRIPTION
    List installed plugins.

    EXAMPLES
    $ rctl plugins

    See code: @oclif/plugin-plugins

    -

    rctl plugins:install PLUGIN...

    +

    rctl plugins:install PLUGIN...

    Installs a plugin into the CLI.

    USAGE
    $ rctl plugins:install PLUGIN...

    ARGUMENTS
    PLUGIN Plugin to install.

    FLAGS
    -f, --force Run yarn install with force flag.
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Installs a plugin into the CLI.
    Can be installed from npm or a git url.

    Installation of a user-installed plugin will override a core plugin.

    e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
    will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
    the CLI without the need to patch and update the whole CLI.


    ALIASES
    $ rctl plugins add

    EXAMPLES
    $ rctl plugins:install myplugin

    $ rctl plugins:install https://github.com/someuser/someplugin

    $ rctl plugins:install someuser/someplugin
    -

    rctl plugins:inspect PLUGIN...

    +

    rctl plugins:inspect PLUGIN...

    Displays installation properties of a plugin.

    USAGE
    $ rctl plugins:inspect PLUGIN...

    ARGUMENTS
    PLUGIN [default: .] Plugin to inspect.

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    GLOBAL FLAGS
    --json Format output as json.

    DESCRIPTION
    Displays installation properties of a plugin.

    EXAMPLES
    $ rctl plugins:inspect myplugin

    See code: @oclif/plugin-plugins

    -

    rctl plugins:install PLUGIN...

    +

    rctl plugins:install PLUGIN...

    Installs a plugin into the CLI.

    USAGE
    $ rctl plugins:install PLUGIN...

    ARGUMENTS
    PLUGIN Plugin to install.

    FLAGS
    -f, --force Run yarn install with force flag.
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Installs a plugin into the CLI.
    Can be installed from npm or a git url.

    Installation of a user-installed plugin will override a core plugin.

    e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
    will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
    the CLI without the need to patch and update the whole CLI.


    ALIASES
    $ rctl plugins add

    EXAMPLES
    $ rctl plugins:install myplugin

    $ rctl plugins:install https://github.com/someuser/someplugin

    $ rctl plugins:install someuser/someplugin

    See code: @oclif/plugin-plugins

    - +

    Links a plugin into the CLI for development.

    USAGE
    $ rctl plugins:link PLUGIN

    ARGUMENTS
    PATH [default: .] path to plugin

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Links a plugin into the CLI for development.
    Installation of a linked plugin will override a user-installed or core plugin.

    e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
    command will override the user-installed or core plugin implementation. This is useful for development work.


    EXAMPLES
    $ rctl plugins:link myplugin

    See code: @oclif/plugin-plugins

    -

    rctl plugins:uninstall PLUGIN...

    +

    rctl plugins:uninstall PLUGIN...

    Removes a plugin from the CLI.

    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove
    -

    rctl plugins:uninstall PLUGIN...

    +

    rctl plugins:uninstall PLUGIN...

    Removes a plugin from the CLI.

    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove

    See code: @oclif/plugin-plugins

    -

    rctl plugins:uninstall PLUGIN...

    +

    rctl plugins:uninstall PLUGIN...

    Removes a plugin from the CLI.

    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove
    -

    rctl plugins update

    +

    rctl plugins update

    Update installed plugins.

    USAGE
    $ rctl plugins update [-h] [-v]

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Update installed plugins.

    See code: @oclif/plugin-plugins

    -

    rctl trunks create

    +

    rctl trunks create

    Creates a new Trunk

    USAGE
    $ rctl trunks create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Trunk

    EXAMPLES
    $ rctl trunks create
    Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793

    See code: dist/commands/trunks/create.ts

    -

    rctl trunks delete [REF]

    +

    rctl trunks delete [REF]

    Deletes a Trunk

    USAGE
    $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Trunk

    EXAMPLES
    $ rctl trunks delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done

    See code: dist/commands/trunks/delete.ts

    -

    rctl trunks describe [REF]

    +

    rctl trunks describe [REF]

    shows details for a Trunk

    USAGE
    $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Trunk

    See code: dist/commands/trunks/describe.ts

    -

    rctl trunks get [REF]

    +

    rctl trunks get [REF]

    Shows a list of paginated Trunks or a single Trunk if ref is provided

    USAGE
    $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Trunks or a single Trunk if ref is provided

    EXAMPLES
    $ rctl trunks get
    Ref Name Inbound SIP URI
    8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net

    See code: dist/commands/trunks/get.ts

    -

    rctl trunks update REF

    +

    rctl trunks update REF

    Updates an existing Trunk

    USAGE
    $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Trunk

    EXAMPLES
    $ rctl trunks update
    Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555
    -

    See code: dist/commands/trunks/update.ts

    +

    See code: dist/commands/trunks/update.ts

    \ No newline at end of file diff --git a/docs/2.0.0/connect/command-line/overview/index.html b/docs/2.0.0/connect/command-line/overview/index.html index 9369a1622..b3518946f 100644 --- a/docs/2.0.0/connect/command-line/overview/index.html +++ b/docs/2.0.0/connect/command-line/overview/index.html @@ -1,24 +1,24 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
    Version: 2.0.0

    Overview

    +
    Version: 2.0.0

    Overview

    The command-line tool contains all commands you will need to manage your Routr Connect server.

    To install Routr with npm, you will need to run the following command:

    npm install --location=global @routr/ctl

    Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.

    -

    Please see the following sections for more information on each command.

    +

    Please see the following sections for more information on each command.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/concepts/index.html b/docs/2.0.0/connect/concepts/index.html index e5d647655..297b7a8f4 100644 --- a/docs/2.0.0/connect/concepts/index.html +++ b/docs/2.0.0/connect/concepts/index.html @@ -1,24 +1,24 @@ - + - -Concepts | Routr Docs + +Concepts | Routr Docs - - - + + + -
    Version: 2.0.0

    Concepts

    +
    Version: 2.0.0

    Concepts

    The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.

    The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.

    The following routing types are supported:

    -

    Agent-to-Agent

    +

    Agent-to-Agent

    The agent-to-agent routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:

    Domain configuration

    - apiVersion: v2beta1
    kind: Domain
    ref: domain-01
    metadata:
    name: Local Domain
    spec:
    context:
    domainUri: sip.local
    @@ -28,7 +28,7 @@

    Agent-to-Agen

    Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources.

    -

    Agent-to-PSTN

    +

    Agent-to-PSTN

    In the Connect Mode, the agent-to-pstn routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking.

    The egressPolicies section of the Domain resource handles the routing. The examples below show how these resources relate to each other.

    Domain configuration

    @@ -36,14 +36,14 @@

    Agent-to-PSTN<

    Number configuration

    - apiVersion: v2beta1
    kind: Number
    ref: number-01
    metadata:
    name: "(910)343-4434"
    geoInfo:
    city: Durham, NC
    country: USA
    countryISOCode: US
    spec:
    trunkRef: trunk-01
    location:
    telUrl: tel:+19103434434

    With the previous configuration, any Agent in the Domain can call the PSTN using the Number (910)343-4434.

    -

    From-PSTN

    +

    From-PSTN

    The from-pstn routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The location section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:

    - apiVersion: v2beta1
    kind: Number
    ref: number-01
    metadata:
    name: "(910)343-4434"
    geoInfo:
    city: Durham, NC
    country: USA
    countryISOCode: US
    spec:
    trunkRef: trunk-01
    location:
    telUrl: tel:+19103434434
    aorLink: sip:john@sip.local

    You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr.

    -

    Peer-to-PSTN

    +

    Peer-to-PSTN

    The peer-to-pstn routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike agent-to-pstn, this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the Trunking resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table.

    -

    Agent-to-Peer

    +

    Agent-to-Peer

    This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain's boundaries, the Agent must have a valid JWT token in the X-Connect-Token header. Incidentally, required claims in the JWT token include fields similar to the Agent resource. Here is an example of the payload of a JWT token:

    -
    {
    "ref": "agent-01",
    "domainRef": "domain-01",
    "aor": "sip:1001@sip.local",
    "aorLink": "sip:asterisk@default",
    "domain": "sip.local",
    "privacy": "NONE",
    "allowedMethods": ["INVITE", "REGISTER"]
    }
    +
    {
    "ref": "agent-01",
    "domainRef": "domain-01",
    "aor": "sip:1001@sip.local",
    "aorLink": "sip:asterisk@default",
    "domain": "sip.local",
    "privacy": "NONE",
    "allowedMethods": ["INVITE", "REGISTER"]
    }
    \ No newline at end of file diff --git a/docs/2.0.0/connect/home-or-office-setup/index.html b/docs/2.0.0/connect/home-or-office-setup/index.html index c4de59bfa..f05d96397 100644 --- a/docs/2.0.0/connect/home-or-office-setup/index.html +++ b/docs/2.0.0/connect/home-or-office-setup/index.html @@ -1,20 +1,20 @@ - + - -Home or Office Setup | Routr Docs + +Home or Office Setup | Routr Docs - - - + + + - +
    Version: 2.0.0

    Home or Office Setup

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/introduction/index.html b/docs/2.0.0/connect/introduction/index.html index 2e14855fc..33390b47e 100644 --- a/docs/2.0.0/connect/introduction/index.html +++ b/docs/2.0.0/connect/introduction/index.html @@ -1,20 +1,20 @@ - + - -Introduction | Routr Docs + +Introduction | Routr Docs - - - + + + -
    Version: 2.0.0

    Introduction

    +
    Version: 2.0.0

    Introduction

    The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.

    In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr.

    Some of the use cases for the Connect Mode are:

    @@ -25,6 +25,6 @@
  • Connect your phone system to the PSTN
  • Connect your phone system to Microsoft Teams (coming soon)
  • Connect your phone system to AWS Chime (coming soon)
  • -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/connect/nodesdk/overview/index.html b/docs/2.0.0/connect/nodesdk/overview/index.html index ffc494fa7..4ec8716be 100644 --- a/docs/2.0.0/connect/nodesdk/overview/index.html +++ b/docs/2.0.0/connect/nodesdk/overview/index.html @@ -1,20 +1,20 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
    Version: 2.0.0

    Overview

    +
    Version: 2.0.0

    Overview

    Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.

    This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server.

    The following example demonstrates how you can use the Node.js SDK to create a new Domain.

    @@ -32,6 +32,6 @@

    Now, go ahead and run the code:

    node index.js

    If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at https://www.npmjs.com/package/@routr/sdk.

    -

    Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos.

    +

    Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/nodesdk/sdk/index.html b/docs/2.0.0/connect/nodesdk/sdk/index.html index 9bd30a747..75b45d008 100644 --- a/docs/2.0.0/connect/nodesdk/sdk/index.html +++ b/docs/2.0.0/connect/nodesdk/sdk/index.html @@ -1,133 +1,133 @@ - + - -SDK | Routr Docs + +SDK | Routr Docs - - - + + + -
    Version: 2.0.0

    SDK

    +
    Version: 2.0.0

    SDK

    Installation

    $ npm install --save @routr/sdk

    APIs

    - -

    ACL ⇐ APIClient

    + +

    Acls ⇐ APIClient

    Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get and delete Access Control Lists. The ACL API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    - -

    new ACL(options)

    -

    Constructs a new ACL API object.

    + +

    new Acls(options)

    +

    Constructs a new Acl API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    -
    const SDK = require("@routr/sdk")
    const acl = new SDK.ACL()

    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    - -

    acL.createACL(request) ⇒ Promise.<CreateACLResponse>

    +
    const SDK = require("@routr/sdk")
    const acl = new SDK.Acls()

    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createAcl(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acls.createAcl(request) ⇒ Promise.<CreateAclResponse>

    Creates a new AccessControlList on Routr.

    -

    Kind: instance method of ACL
    -Returns: Promise.<CreateACLResponse> - The newly created AccessControlList
    +

    Kind: instance method of Acls
    +Returns: Promise.<CreateAclResponse> - The newly created AccessControlList
    Throws:

    • if request is null
    -
    ParamTypeDescription
    requestCreateACLRequestThe request to create an ACL
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes
    +
    ParamTypeDescription
    requestCreateAclRequestThe request to create an ACL
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes

    Example

    -
    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    - -

    acL.updateACL(request) ⇒ Promise.<UpdateACLResponse>

    +
    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createAcl(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acls.updateAcl(request) ⇒ Promise.<UpdateAclResponse>

    Updates an already existing AccessControlList on Routr.

    -

    Kind: instance method of ACL
    -Returns: Promise.<UpdateACLResponse> - The AccessControlList

    -
    ParamTypeDescription
    requestUpdateACLRequestPartial with the fields to update
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes
    +

    Kind: instance method of Acls
    +Returns: Promise.<UpdateAclResponse> - The AccessControlList

    +
    ParamTypeDescription
    requestUpdateAclRequestPartial with the fields to update
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes

    Example

    -
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Peer network updated",
    }

    acl.updateACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    - -

    acL.getACL(ref) ⇒ Promise.<GetACLResponse>

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Peer network updated",
    }

    acl.updateAcl(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acls.getAcl(ref) ⇒ Promise.<GetAclResponse>

    Gets an AccessControlList from Routr.

    -

    Kind: instance method of ACL
    -Returns: Promise.<GetACLResponse> - The AccessControlList

    +

    Kind: instance method of Acls
    +Returns: Promise.<GetAclResponse> - The AccessControlList

    ParamTypeDescription
    refstringThe ACL reference

    Example

    -
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.getACL(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    - -

    acL.deleteACL(ref) ⇒ Promise.<void>

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.getAcl(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acls.deleteAcl(ref) ⇒ Promise.<void>

    Deletes an AccessControlList from Routr.

    -

    Kind: instance method of ACL

    +

    Kind: instance method of Acls

    ParamTypeDescription
    refstringThe ACL reference

    Example

    -
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.deleteACL(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    - -

    acL.listACLs(request) ⇒ Promise.<ListACLResponse>

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.deleteAcl(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acls.listAcls(request) ⇒ Promise.<ListAclResponse>

    Lists all AccessControlLists from Routr with pagination.

    -

    Kind: instance method of ACL
    -Returns: Promise.<ListACLResponse> - The list of AccessControlLists

    -
    ParamTypeDescription
    requestListACLRequestThe request to list ACLs
    request.pageSizenumberThe number of ACLs to return
    request.pageTokenstringThe page token to use for pagination
    +

    Kind: instance method of Acls
    +Returns: Promise.<ListAclResponse> - The list of AccessControlLists

    +
    ParamTypeDescription
    requestListAclRequestThe request to list ACLs
    request.pageSizenumberThe number of ACLs to return
    request.pageTokenstringThe page token to use for pagination

    Example

    -
    const request = {
    pageSize: 10
    }

    acl.listACLs(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    +
    const request = {
    pageSize: 10
    }

    acl.listAcls(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Agents ⇐ APIClient

    +

    Agents ⇐ APIClient

    Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get and delete Agents. The Agents API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Agents(options)

    +

    new Agents(options)

    Constructs a new Agent API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    const SDK = require("@routr/sdk")
    const agents = new SDK.Agents()

    const request = {
    name: "Jonh Doe",
    username: "jdoe",
    privacy: Privacy.PRIVATE,
    domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    agents.createAgent(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    agents.createAgent(request) ⇒ Promise.<CreateAgentResponse>

    +

    agents.createAgent(request) ⇒ Promise.<CreateAgentResponse>

    Creates a new Agent on Routr.

    -

    Kind: instance method of Agents
    +

    Kind: instance method of Agents
    Returns: Promise.<CreateAgentResponse> - The newly created Agent
    Throws:

      @@ -137,65 +137,65 @@

      const request = {
      name: "Jonh Doe",
      username: "jdoe",
      privacy: Privacy.PRIVATE,
      domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      enabled: true,
      extended: {
      "key": "value"
      }
      }

      agents.createAgent(request)
      .then(console.log)
      .catch(console.error) // an error occurred

    -

    agents.updateAgent(request) ⇒ Promise.<UpdateAgentResponse>

    +

    agents.updateAgent(request) ⇒ Promise.<UpdateAgentResponse>

    Updates an already existing Agent on Routr.

    -

    Kind: instance method of Agents
    +

    Kind: instance method of Agents
    Returns: Promise.<UpdateAgentResponse> - The updated Agent

    ParamTypeDescription
    requestUpdateAgentRequestPartial with the fields to update
    request.namestringName of the Agent
    request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
    request.domainRefstringDomain reference of the Domain the Agent belongs to
    request.credentialsRefstringCredentials reference of the Credentials for the Agent
    request.enabledbooleanWhether the Agent is enabled or not (for future use)
    request.extendedObjectOptional extended attributes

    Example

    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "John D Doe",
    enabled: false
    }

    agents.updateAgent(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    agents.getAgent(ref) ⇒ Promise.<GetAgentResponse>

    +

    agents.getAgent(ref) ⇒ Promise.<GetAgentResponse>

    Gets an Agent from Routr.

    -

    Kind: instance method of Agents
    +

    Kind: instance method of Agents
    Returns: Promise.<GetAgentResponse> - The Agent

    ParamTypeDescription
    refstringThe Agent's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    agents.getAgent(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    agents.deleteAgent(ref) ⇒ Promise.<void>

    +

    agents.deleteAgent(ref) ⇒ Promise.<void>

    Deletes an Agent from Routr.

    -

    Kind: instance method of Agents

    +

    Kind: instance method of Agents

    ParamTypeDescription
    refstringThe Agent's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    agents.deleteAgent(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    agents.listAgents(request) ⇒ Promise.<ListAgentResponse>

    +

    agents.listAgents(request) ⇒ Promise.<ListAgentResponse>

    Lists all Agents from Routr with pagination.

    -

    Kind: instance method of Agents
    +

    Kind: instance method of Agents
    Returns: Promise.<ListAgentResponse> - The list of Agents in the current page

    ParamTypeDescription
    requestListAgentRequestThe request to list Agents
    request.pageSizenumberThe number of Agents to return
    request.pageTokenstringThe page token to use for pagination

    Example

    const request = {
    pageSize: 10
    }

    agents.listAgents(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Credentials ⇐ APIClient

    +

    Credentials ⇐ APIClient

    Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get and delete Credentials. The Credentials API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Credentials(options)

    +

    new Credentials(options)

    Constructs a new Credentials API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    const SDK = require("@routr/sdk")
    const credentials = new SDK.Credentials()

    const request = {
    name: "Credentials for John Doe",
    username: "jdoe",
    password: "123456",
    extended: {
    "key": "value"
    }
    }

    credentials.createCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    credentials.createCredentials(request) ⇒ Promise.<CreateCredentialsResponse>

    +

    credentials.createCredentials(request) ⇒ Promise.<CreateCredentialsResponse>

    Creates a new Credentials on Routr.

    -

    Kind: instance method of Credentials
    +

    Kind: instance method of Credentials
    Returns: Promise.<CreateCredentialsResponse> - The newly created Credentials
    Throws:

      @@ -205,201 +205,201 @@

      const request = {
      name: "Credentials for John Doe",
      username: "jdoe",
      password: "123456",
      extended: {
      "key": "value"
      }
      }

      credentials.createCredentials(request)
      .then(console.log)
      .catch(console.error) // an error occurred

    -

    credentials.updateCredentials(request) ⇒ Promise.<UpdateCredentialsResponse>

    +

    credentials.updateCredentials(request) ⇒ Promise.<UpdateCredentialsResponse>

    Updates an already existing Credentials on Routr.

    -

    Kind: instance method of Credentials
    +

    Kind: instance method of Credentials
    Returns: Promise.<UpdateCredentialsResponse> - The updated Credentials

    ParamTypeDescription
    requestUpdateCredentialsRequestPartial with the fields to update
    request.namestringThe friendly name of the Credentials
    request.usernamestringUsername of the Credentials
    request.passwordstringPassword of the Credentials
    request.extendedObjectOptional extended attributes

    Example

    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "John Doe's Credentials"
    }

    credentials.updateCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    credentials.getCredentials(ref) ⇒ Promise.<GetCredentialsResponse>

    +

    credentials.getCredentials(ref) ⇒ Promise.<GetCredentialsResponse>

    Gets an Credentials from Routr.

    -

    Kind: instance method of Credentials
    +

    Kind: instance method of Credentials
    Returns: Promise.<GetCredentialsResponse> - The Credentials

    ParamTypeDescription
    refstringThe Credentials's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    credentials.getCredentials(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    credentials.deleteCredentials(ref) ⇒ Promise.<void>

    +

    credentials.deleteCredentials(ref) ⇒ Promise.<void>

    Deletes an Credentials from Routr.

    -

    Kind: instance method of Credentials

    +

    Kind: instance method of Credentials

    ParamTypeDescription
    refstringThe Credentials's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    credentials.deleteCredentials(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    credentials.listCredentials(request) ⇒ Promise.<ListCredentialsResponse>

    +

    credentials.listCredentials(request) ⇒ Promise.<ListCredentialsResponse>

    Lists all Credentials from Routr with pagination.

    -

    Kind: instance method of Credentials
    +

    Kind: instance method of Credentials
    Returns: Promise.<ListCredentialsResponse> - The list of Credentials in the current page

    ParamTypeDescription
    requestListCredentialsRequestThe request to list Credentials
    request.pageSizenumberThe number of Credentials to return
    request.pageTokenstringThe page token to use for pagination

    Example

    const request = {
    pageSize: 10
    }

    credentials.listCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Domains ⇐ APIClient

    +

    Domains ⇐ APIClient

    Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get and delete Domains. The Domains API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Domains(options)

    +

    new Domains(options)

    Constructs a new Domain API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    const SDK = require("@routr/sdk")
    const domains = new SDK.Domains()

    const request = {
    name: "Local domain",
    domainUri: "sip.local",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    egressPolicies: [{
    rule: ".*",
    numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }],
    extended: {
    "key": "value"
    }
    }

    domains.createDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    domains.createDomain(request) ⇒ Promise.<CreateDomainResponse>

    +

    domains.createDomain(request) ⇒ Promise.<CreateDomainResponse>

    Creates a new Domain on Routr.

    -

    Kind: instance method of Domains
    +

    Kind: instance method of Domains
    Returns: Promise.<CreateDomainResponse> - The newly created Domain
    Throws:

    • if request is null
    -
    ParamTypeDescription
    requestCreateDomainRequestThe request to create an Domain
    request.namestringName of the Domain
    request.domainUristringThe FQDN of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes
    +
    ParamTypeDescription
    requestCreateDomainRequestThe request to create an Domain
    request.namestringName of the Domain
    request.domainUristringThe FQDN of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes

    Example

    const request = {
    name: "Local domain",
    domainUri: "sip.local",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    egressPolicies: [{
    rule: ".*",
    numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }],
    extended: {
    "key": "value"
    }
    }

    domains.createDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    domains.updateDomain(request) ⇒ Promise.<UpdateDomainResponse>

    +

    domains.updateDomain(request) ⇒ Promise.<UpdateDomainResponse>

    Updates an already existing Domain on Routr.

    -

    Kind: instance method of Domains
    +

    Kind: instance method of Domains
    Returns: Promise.<UpdateDomainResponse> - The updated Domain

    -
    ParamTypeDescription
    requestUpdateDomainRequestPartial with the fields to update
    request.namestringName of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes
    +
    ParamTypeDescription
    requestUpdateDomainRequestPartial with the fields to update
    request.namestringName of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes

    Example

    const request = {
    name: "Local domain updated",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }

    domains.updateDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    domains.getDomain(ref) ⇒ Promise.<GetDomainResponse>

    +

    domains.getDomain(ref) ⇒ Promise.<GetDomainResponse>

    Gets a Domain from Routr.

    -

    Kind: instance method of Domains
    +

    Kind: instance method of Domains
    Returns: Promise.<GetDomainResponse> - The Domain

    ParamTypeDescription
    refstringThe Domain's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    domains.getDomain(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    domains.deleteDomain(ref) ⇒ Promise.<void>

    +

    domains.deleteDomain(ref) ⇒ Promise.<void>

    Deletes a Domain from Routr.

    -

    Kind: instance method of Domains

    +

    Kind: instance method of Domains

    ParamTypeDescription
    refstringThe Domain's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    domains.deleteDomain(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    domains.listDomains(request) ⇒ Promise.<ListDomainResponse>

    +

    domains.listDomains(request) ⇒ Promise.<ListDomainResponse>

    Lists all Domains from Routr with pagination.

    -

    Kind: instance method of Domains
    +

    Kind: instance method of Domains
    Returns: Promise.<ListDomainResponse> - The list of Domains

    ParamTypeDescription
    requestListDomainRequestThe request to list Domains
    request.pageSizenumberThe number of Domains to return
    request.pageTokenstringThe page token to use for pagination

    Example

    const request = {
    pageSize: 10
    }

    domains.listDomains(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Numbers ⇐ APIClient

    +

    Numbers ⇐ APIClient

    Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get and delete Numbers. The Number API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Numbers(options)

    +

    new Numbers(options)

    Constructs a new Number API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    -
    const SDK = require("@routr/sdk")
    const numbers = new SDK.Numbers()

    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryISOCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    +
    const SDK = require("@routr/sdk")
    const numbers = new SDK.Numbers()

    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryIsoCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    numbers.createNumber(request) ⇒ Promise.<CreateNumberResponse>

    +

    numbers.createNumber(request) ⇒ Promise.<CreateNumberResponse>

    Creates a new Number on Routr.

    -

    Kind: instance method of Numbers
    +

    Kind: instance method of Numbers
    Returns: Promise.<CreateNumberResponse> - The newly created Number
    Throws:

    • if request is null
    -
    ParamTypeDescription
    requestCreateNumberRequestThe request to create an Number
    request.namestringName of the Number
    request.telUrlstringThe number URI to be used (e.g., te:+1234567890)
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.citystringThe city where the number is located
    request.countrystringThe country where the number is located
    request.countryISOCodestringThe country ISO code where the number is located
    request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes
    +
    ParamTypeDescription
    requestCreateNumberRequestThe request to create an Number
    request.namestringName of the Number
    request.telUrlstringThe number URI to be used (e.g., te:+1234567890)
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.citystringThe city where the number is located
    request.countrystringThe country where the number is located
    request.countryIsoCodestringThe country ISO code where the number is located
    request.extraHeadersArray.<JsonObject>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes

    Example

    -
    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryISOCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    +
    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryIsoCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    numbers.updateNumber(request) ⇒ Promise.<UpdateNumberResponse>

    +

    numbers.updateNumber(request) ⇒ Promise.<UpdateNumberResponse>

    Updates an already existing Number on Routr.

    -

    Kind: instance method of Numbers
    +

    Kind: instance method of Numbers
    Returns: Promise.<UpdateNumberResponse> - The updated Number

    -
    ParamTypeDescription
    requestUpdateNumberRequestPartial with the fields to update
    request.namestringName of the Number
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes
    +
    ParamTypeDescription
    requestUpdateNumberRequestPartial with the fields to update
    request.namestringName of the Number
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.extraHeadersArray.<JsonObject>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes

    Example

    const request = {
    name: "(415) 555-1212 (friendly name)",
    aorLink: "sip:2001@sip.local"
    }

    numbers.updateNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    numbers.getNumber(ref) ⇒ Promise.<GetNumberResponse>

    +

    numbers.getNumber(ref) ⇒ Promise.<GetNumberResponse>

    Gets a Number from Routr.

    -

    Kind: instance method of Numbers
    +

    Kind: instance method of Numbers
    Returns: Promise.<GetNumberResponse> - The Number

    ParamTypeDescription
    refstringThe Number's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    numbers.getNumber(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    numbers.deleteNumber(ref) ⇒ Promise.<void>

    +

    numbers.deleteNumber(ref) ⇒ Promise.<void>

    Deletes a Number from Routr.

    -

    Kind: instance method of Numbers

    +

    Kind: instance method of Numbers

    ParamTypeDescription
    refstringThe Number's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    numbers.deleteNumber(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    numbers.listNumbers(request) ⇒ Promise.<ListNumberResponse>

    +

    numbers.listNumbers(request) ⇒ Promise.<ListNumberResponse>

    Lists all Numbers from Routr with pagination.

    -

    Kind: instance method of Numbers
    +

    Kind: instance method of Numbers
    Returns: Promise.<ListNumberResponse> - The list of Numbers

    ParamTypeDescription
    requestListNumberRequestThe request to list Numbers
    request.pageSizenumberThe number of Numbers to return
    request.pageTokenstringThe page token to use for pagination

    Example

    const request = {
    pageSize: 10
    }

    numbers.listNumbers(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Peers ⇐ APIClient

    +

    Peers ⇐ APIClient

    Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get and delete Peers. The Peers API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Peers(options)

    +

    new Peers(options)

    Constructs a new Peer API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    const SDK = require("@routr/sdk")
    const peers = new SDK.Peers()

    const request = {
    name: "Asterisk Conference Server",
    username: "conference",
    aor: "sip:conference@sip.local",
    contactAddr: "10.0.0.1:5060",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
    withSessionAffinity: true,
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    peers.createPeer(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    peers.createPeer(request) ⇒ Promise.<CreatePeerResponse>

    +

    peers.createPeer(request) ⇒ Promise.<CreatePeerResponse>

    Creates a new Peer on Routr.

    -

    Kind: instance method of Peers
    +

    Kind: instance method of Peers
    Returns: Promise.<CreatePeerResponse> - The newly created Peer
    Throws:

      @@ -409,65 +409,65 @@

      const request = {
      name: "Asterisk Conference Server",
      username: "conference",
      aor: "sip:conference@sip.local",
      contactAddr: "10.0.0.1:5060",
      accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
      withSessionAffinity: true,
      enabled: true,
      extended: {
      "key": "value"
      }
      }

      peers.createPeer(request)
      .then(console.log)
      .catch(console.error) // an error occurred

    -

    peers.updatePeer(request) ⇒ Promise.<UpdatePeerResponse>

    +

    peers.updatePeer(request) ⇒ Promise.<UpdatePeerResponse>

    Updates an already existing Peer on Routr.

    -

    Kind: instance method of Peers
    +

    Kind: instance method of Peers
    Returns: Promise.<UpdatePeerResponse> - The updated Peer

    ParamTypeDescription
    requestUpdatePeerRequestPartial with the fields to update
    request.namestringName of the Peer
    request.aorstringAddress of Record of the Peer
    request.contactAddrstringOptional contact address of the Peer
    request.accessControlListRefstringAccess Control List reference of the Peer
    request.credentialsRefstringCredentials reference of the Credentials for the Peer
    request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
    request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
    request.enabledbooleanWhether the Peer is enabled or not (for future use)
    request.extendedObjectOptional extended attributes

    Example

    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Feature Server"
    }

    peers.updatePeer(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    peers.getPeer(ref) ⇒ Promise.<GetPeerResponse>

    +

    peers.getPeer(ref) ⇒ Promise.<GetPeerResponse>

    Gets an Peer from Routr.

    -

    Kind: instance method of Peers
    +

    Kind: instance method of Peers
    Returns: Promise.<GetPeerResponse> - The Peer

    ParamTypeDescription
    refstringThe Peer's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    peers.getPeer(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    peers.deletePeer(ref) ⇒ Promise.<void>

    +

    peers.deletePeer(ref) ⇒ Promise.<void>

    Deletes an Peer from Routr.

    -

    Kind: instance method of Peers

    +

    Kind: instance method of Peers

    ParamTypeDescription
    refstringThe Peer's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    peers.deletePeer(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    peers.listPeers(request) ⇒ Promise.<ListPeerResponse>

    +

    peers.listPeers(request) ⇒ Promise.<ListPeerResponse>

    Lists all Peers from Routr with pagination.

    -

    Kind: instance method of Peers
    +

    Kind: instance method of Peers
    Returns: Promise.<ListPeerResponse> - The list of Peers in the current page

    ParamTypeDescription
    requestListPeerRequestThe request to list Peers
    request.pageSizenumberThe number of Peers to return
    request.pageTokenstringThe page token to use for pagination

    Example

    const request = {
    pageSize: 10
    }

    peers.listPeers(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    Trunks ⇐ APIClient

    +

    Trunks ⇐ APIClient

    Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get and delete Trunks. The Trunks API requires of a running Routr deployment.

    Kind: global class
    Extends: APIClient
    See: module:core:APIClient

    -

    new Trunks(options)

    +

    new Trunks(options)

    Constructs a new Trunk API object.

    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint

    Example

    const SDK = require("@routr/sdk")
    const trunks = new SDK.Trunks()

    const request = {
    name: "Trunk from Twilio",
    inboundUri: "sip:twilio.sip.acme.io",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    uris: [{
    host: "acme.sip.twilio.com",
    port: 5060,
    transport: "udp",
    user: "AC1234567890",
    weight: 1,
    priority: 1
    }],
    extended: {
    "key": "value"
    }
    }

    trunks.createTrunk(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    trunks.createTrunk(request) ⇒ Promise.<CreateTrunkResponse>

    +

    trunks.createTrunk(request) ⇒ Promise.<CreateTrunkResponse>

    Creates a new Trunk on Routr.

    -

    Kind: instance method of Trunks
    +

    Kind: instance method of Trunks
    Returns: Promise.<CreateTrunkResponse> - The newly created Trunk
    Throws:

      @@ -477,35 +477,35 @@

      const request = {
      name: "Trunk from Twilio",
      inboundUri: "sip:twilio.sip.acme.io",
      accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
      uris: [{
      host: "acme.sip.twilio.com",
      port: 5060,
      transport: "udp",
      user: "AC1234567890",
      weight: 1,
      priority: 1
      }],
      extended: {
      "key": "value"
      }
      }

      trunks.createTrunk(request)
      .then(console.log)
      .catch(console.error) // an error occurred

    -

    trunks.updateTrunk(request) ⇒ Promise.<UpdateTrunkResponse>

    +

    trunks.updateTrunk(request) ⇒ Promise.<UpdateTrunkResponse>

    Updates an already existing Trunk on Routr.

    -

    Kind: instance method of Trunks
    +

    Kind: instance method of Trunks
    Returns: Promise.<UpdateTrunkResponse> - The updated Trunk

    ParamTypeDescription
    requestUpdateTrunkRequestPartial with the fields to update
    request.namestringName of the Trunk
    request.inboundUristringInbound URI of the Trunk
    request.accessControlListRefstringAccess Control List reference
    request.inboundCredentialsRefstringThe reference of the inbound credentials
    request.outboundCredentialsRefstringThe reference of the outbound credentials
    request.urisArray.<TrunkURI>The outbound URIs of the Trunk
    request.extendedObjectOptional extended attributes

    Example

    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Trunk from Twilio (US-East)",
    }

    trunks.updateTrunk(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    trunks.getTrunk(ref) ⇒ Promise.<GetTrunkResponse>

    +

    trunks.getTrunk(ref) ⇒ Promise.<GetTrunkResponse>

    Gets an Trunk from Routr.

    -

    Kind: instance method of Trunks
    +

    Kind: instance method of Trunks
    Returns: Promise.<GetTrunkResponse> - The Trunk

    ParamTypeDescription
    refstringThe Trunk's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    trunks.getTrunk(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    trunks.deleteTrunk(ref) ⇒ Promise.<void>

    +

    trunks.deleteTrunk(ref) ⇒ Promise.<void>

    Deletes an Trunk from Routr.

    -

    Kind: instance method of Trunks

    +

    Kind: instance method of Trunks

    ParamTypeDescription
    refstringThe Trunk's reference

    Example

    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    trunks.deleteTrunk(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    -

    trunks.listTrunks(request) ⇒ Promise.<ListTrunkResponse>

    +

    trunks.listTrunks(request) ⇒ Promise.<ListTrunkResponse>

    Lists all Trunks from Routr with pagination.

    -

    Kind: instance method of Trunks
    +

    Kind: instance method of Trunks
    Returns: Promise.<ListTrunkResponse> - The list of Trunks in the current page

    ParamTypeDescription
    requestListTrunkRequestThe request to list Trunks
    request.pageSizenumberThe number of Trunks to return
    request.pageTokenstringThe page token to use for pagination

    Example

    -
    const request = {
    pageSize: 10
    }

    trunks.listTrunks(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    +
    const request = {
    pageSize: 10
    }

    trunks.listTrunks(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    \ No newline at end of file diff --git a/docs/2.0.0/connect/quick-start/docker/index.html b/docs/2.0.0/connect/quick-start/docker/index.html index de64b0843..e9319f739 100644 --- a/docs/2.0.0/connect/quick-start/docker/index.html +++ b/docs/2.0.0/connect/quick-start/docker/index.html @@ -1,20 +1,20 @@ - + - -Docker installation | Routr Docs + +Docker installation | Routr Docs - - - + + + -
    Version: 2.0.0

    Docker installation

    +
    Version: 2.0.0

    Docker installation

    First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

    Filename: compose.yaml

    version: "3"

    services:

    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    ports:
    - 51908:51908
    - 5060:5060/udp

    volumes:
    shared:
    @@ -33,6 +33,6 @@

    The --insecure flag is required as we did not set up the TLS settings.

    -

    For additional examples, refer to the command line documentation.

    +

    For additional examples, refer to the command line documentation.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/quick-start/kubernetes/index.html b/docs/2.0.0/connect/quick-start/kubernetes/index.html index 9fc8dd61a..d0999c84b 100644 --- a/docs/2.0.0/connect/quick-start/kubernetes/index.html +++ b/docs/2.0.0/connect/quick-start/kubernetes/index.html @@ -1,20 +1,20 @@ - + - -Installing in Kubernetes | Routr Docs + +Installing in Kubernetes | Routr Docs - - - + + + -
    Version: 2.0.0

    Installing in Kubernetes

    +
    Version: 2.0.0

    Installing in Kubernetes

    Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.

    You can use Minikube or Docker Desktop to create a local Kubernetes cluster.

    @@ -29,6 +29,6 @@
    kubectl get pods -n sipnet

    You should see a list of pods and their status. If the status is Running, then you are ready to go.

    For more details, please refer to the chart's README.

    -

    Please see the Command-Line Tools section for detauls on how to interact with Routr Connect via the CLI.

    +

    Please see the Command-Line Tools section for detauls on how to interact with Routr Connect via the CLI.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/securing-the-server/index.html b/docs/2.0.0/connect/securing-the-server/index.html index 22f7bf099..eae641d19 100644 --- a/docs/2.0.0/connect/securing-the-server/index.html +++ b/docs/2.0.0/connect/securing-the-server/index.html @@ -1,20 +1,20 @@ - + - -Securing the Server | Routr Docs + +Securing the Server | Routr Docs - - - + + + - +
    Version: 2.0.0

    Securing the Server

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/sending-call-events-to-nats/index.html b/docs/2.0.0/connect/sending-call-events-to-nats/index.html index a1946fb70..f61ccacb4 100644 --- a/docs/2.0.0/connect/sending-call-events-to-nats/index.html +++ b/docs/2.0.0/connect/sending-call-events-to-nats/index.html @@ -1,20 +1,20 @@ - + - -Sending Call Events to NATS | Routr Docs + +Sending Call Events to NATS | Routr Docs - - - + + + -
    Version: 2.0.0

    Sending Call Events to NATS

    +
    Version: 2.0.0

    Sending Call Events to NATS

    Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATS_PUBLISHER_ENABLED to true as well as the environment variable NATS_PUBLISHER_URL to the URL of your NATS server. For example:

    version: "3"
    services:
    routr:
    image: fonoster/routr-one:latest
    ports:
    - 51908:51908
    - 5060:5060/udp
    environment:
    - NATS_PUBLISHER_ENABLED=true
    - NATS_PUBLISHER_URL=nats:4222

    Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events. @@ -61,6 +61,6 @@

  • expires: The time in seconds the endpoint will remain registered
  • extraHeaders: Any extra headers that were sent with the call
  • -

    You can use the NATS_PUBLISHER_SUBJECT environment variable to change the based subject name. For example, you can set it to myserver to receive call events in the myserver.calls.started subject.

    +

    You can use the NATS_PUBLISHER_SUBJECT environment variable to change the based subject name. For example, you can set it to myserver to receive call events in the myserver.calls.started subject.

    \ No newline at end of file diff --git a/docs/2.0.0/connect/webrtc-support/index.html b/docs/2.0.0/connect/webrtc-support/index.html index 685da8774..bf49d684d 100644 --- a/docs/2.0.0/connect/webrtc-support/index.html +++ b/docs/2.0.0/connect/webrtc-support/index.html @@ -1,20 +1,20 @@ - + - -WebRTC Support | Routr Docs + +WebRTC Support | Routr Docs - - - + + + -
    Version: 2.0.0

    WebRTC Support

    +
    Version: 2.0.0

    WebRTC Support

    The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.

    Let’s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients.

    Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step.

    @@ -22,6 +22,6 @@
    version: "3"

    services:

    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    RTPENGINE_HOST: ${RTPE_HOST}
    ports:
    - 51908:51908
    - 5060:5060/udp

    -- snip --

    If using Helm, you will need to add the following configuration to your values.yaml file:

    rtprelay:
    enabled: true
    rtpeHost: /* rtpengine */
    rtpPort: 22222
    -

    Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere.

    +

    Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere.

    \ No newline at end of file diff --git a/docs/2.0.0/contributing/index.html b/docs/2.0.0/contributing/index.html index 7a0f11627..d70f7aff5 100644 --- a/docs/2.0.0/contributing/index.html +++ b/docs/2.0.0/contributing/index.html @@ -1,30 +1,30 @@ - + - -Contributing Guide | Routr Docs + +Contributing Guide | Routr Docs - - - + + + -
    Version: 2.0.0

    Contributing Guide

    +
    Version: 2.0.0

    Contributing Guide

    @@ -36,7 +36,7 @@
  • Bugs in our automation scripts
  • If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!

    -

    Ways to Contribute

    +

    Ways to Contribute

    We welcome many different types of contributions including:

    • New features
    • @@ -52,22 +52,22 @@

      Ways to C

    Not everything happens through a GitHub pull request. Please come to our meetings or contact us and let's discuss how we can work together.

    -

    Come to Meetings

    +

    Come to Meetings

    Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don’t have anything you feel like you want to contribute. Just being there is enough!

    You can find out more about our meetings here. You don’t have to turn on your video. The first time you come, introducing yourself is more than enough.

    Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences.

    -

    Find an Issue

    +

    Find an Issue

    We have good first issues for new contributors and help wanted issues suitable for any contributor. good first issue has extra information to help you make your first contribution. help wanted are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request.

    Sometimes there won’t be any issues with these labels. That’s ok! There is likely still something for you to work on. If you want to contribute but you don’t know where to start or can't find a suitable issue, you can reach out to us via Discord or GitHub Discussions and we will help you find something.

    Once you see an issue that you'd like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.

    -

    Ask for Help

    +

    Ask for Help

    The best way to reach us with a question when contributing is to ask on:

    -

    Pull Request Lifecycle

    +

    Pull Request Lifecycle

    Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request.

    After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:

      @@ -81,10 +81,10 @@

      Pull
    • Delay the integration of your pull request to align with future releases
    • Close your current pull request and, if needed, open a new one with revised changes
    -

    Development Environment Setup

    +

    Development Environment Setup

    See our Development environment setup guide to get started locally or using Gitpod.

    -

    Sign your Commits

    -

    DCO

    +

    Sign your Commits

    +

    DCO

    Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The Developer Certificate of Origin (DCO) is a way to certify that you wrote and have the right to contribute the code you are submitting to the project.

    You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit.

    This is my commit message

    Signed-off-by: Your Name <your.name@example.com>
    @@ -92,7 +92,7 @@

    DCO
    git commit -s -m 'This is my commit message'

    If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running

    git commit --amend -s
    -

    Pull Request Checklist

    +

    Pull Request Checklist

    When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:

    • Your code builds and passes tests locally
    • @@ -100,6 +100,6 @@

      Pull
    • You have signed your commits
    • You have added tests for your code (if applicable)
    • You have updated the documentation (if applicable)
    • -

    + \ No newline at end of file diff --git a/docs/2.0.0/development/alterations/methods/index.html b/docs/2.0.0/development/alterations/methods/index.html index e35d2a785..2a002b3a5 100644 --- a/docs/2.0.0/development/alterations/methods/index.html +++ b/docs/2.0.0/development/alterations/methods/index.html @@ -1,20 +1,20 @@ - + - -Alteration Methods | Routr Docs + +Alteration Methods | Routr Docs - - - + + + - +
    \ No newline at end of file diff --git a/docs/2.0.0/development/alterations/overview/index.html b/docs/2.0.0/development/alterations/overview/index.html index d81595e92..dee9adfbf 100644 --- a/docs/2.0.0/development/alterations/overview/index.html +++ b/docs/2.0.0/development/alterations/overview/index.html @@ -1,20 +1,20 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + - + \ No newline at end of file diff --git a/docs/2.0.0/development/building-a-chat-application/index.html b/docs/2.0.0/development/building-a-chat-application/index.html index 2236fff73..17c619577 100644 --- a/docs/2.0.0/development/building-a-chat-application/index.html +++ b/docs/2.0.0/development/building-a-chat-application/index.html @@ -1,20 +1,20 @@ - + - -Building a Chat Application | Routr Docs + +Building a Chat Application | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/development/building-a-middleware/index.html b/docs/2.0.0/development/building-a-middleware/index.html index cb80e3bf8..62ef16396 100644 --- a/docs/2.0.0/development/building-a-middleware/index.html +++ b/docs/2.0.0/development/building-a-middleware/index.html @@ -1,20 +1,20 @@ - + - -Building a Middleware | Routr Docs + +Building a Middleware | Routr Docs - - - + + + -
    Version: 2.0.0

    Building a Middleware

    -

    Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.

    +
    Version: 2.0.0

    Building a Middleware

    +

    Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.

    \ No newline at end of file diff --git a/docs/2.0.0/development/building-a-processor/index.html b/docs/2.0.0/development/building-a-processor/index.html index 89c6235c6..acc6fadfa 100644 --- a/docs/2.0.0/development/building-a-processor/index.html +++ b/docs/2.0.0/development/building-a-processor/index.html @@ -1,20 +1,20 @@ - + - -Building a Processor | Routr Docs + +Building a Processor | Routr Docs - - - + + + -
    Version: 2.0.0

    Building a Processor

    +
    Version: 2.0.0

    Building a Processor

    Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.

    Here is a non-exhaustive list of things you can do with a Processor:

      @@ -24,7 +24,7 @@
    • Doorbell Camera System integration
    • Custom logic for a SIP IoT system
    -

    Processor Contract

    +

    Processor Contract

    A Processor is a gRPC service that implements the Processor interface. The interface is defined in the processor.proto file.

    Here is the definition of the Processor interface:

    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid session information
    INFO = 12;
    // Asks the recipient to issue call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    @@ -33,7 +33,7 @@

    Processor

    One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript.

    As an example, here is the JSON representation of a SIP REGISTER message:

    {
    "ref": "AynhXaFtbdXwHrUEzt_rUQ..",
    "edgePortRef": "edgeport-01",
    "method": "REGISTER",
    "externalAddrs": ["200.22.21.42"],
    "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],
    "listeningPoints": [
    {
    "host": "0.0.0.0",
    "port": 5060,
    "transport": "TCP"
    },
    {
    "host": "0.0.0.0",
    "port": 5060,
    "transport": "UDP"
    }
    ],
    "sender": {
    "host": "127.0.0.1",
    "port": 36214,
    "transport": "TCP"
    },
    "message": {
    "via": [
    {
    "host": "proxy",
    "port": 5060,
    "branch": "z9hG4bK-524287-1---7315a24d84546819",
    "transport": "TCP"
    },
    {
    "host": "127.0.0.1",
    "port": 36214,
    "branch": "z9hG4bK-524287-1---7315a24d84546819",
    "transport": "TCP"
    }
    ],
    "extensions": [
    {
    "name": "CSeq",
    "value": "14 REGISTER"
    },
    {
    "name": "Allow",
    "value": "INVITE"
    },
    {
    "name": "User-Agent",
    "value": "Z 5.4.12 v2.10.13.2"
    },
    {
    "name": "Allow-Events",
    "value": "presence"
    }
    ],
    "from": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "UDP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "John Doe",
    "wildcard": false
    },
    "tag": "9041462a"
    },
    "to": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    },
    "tag": ""
    },
    "contact": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "127.0.0.1",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 36214,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    },
    "expires": -1,
    "qValue": -1
    },
    "callId": {
    "callId": "AynhXaFtbdXwHrUEzt_rUQ.."
    },
    "contentLength": {
    "contentLength": 0
    },
    "maxForwards": {
    "maxForwards": 70
    },
    "expires": {
    "expires": 60
    },
    "recordRoute": [
    {
    "parameters": {
    "a": "1",
    "b": "2"
    },
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    }
    ],
    "route": [
    {
    "parameters": null,
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "10.100.42.127",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    },
    {
    "parameters": null,
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "10.100.42.128",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    }
    ],
    "authorization": {
    "realm": "sip.local",
    "scheme": "Digest",
    "cNonce": "acbcc60094edde23f49b01e18bafd34e",
    "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",
    "algorithm": "MD5",
    "qop": "",
    "opaque": "",
    "response": "227fe247ff0b9fa4fcf2706b587bf995",
    "username": "1001",
    "uri": "sip:sip.local;transport=TCP",
    "nonceCount": 13
    },
    "requestUri": {
    "user": "",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "messageType": "REQUEST"
    }
    }
    -

    Building a Processor from a Template

    +

    Building a Processor from a Template

    To make it easier to build processors, we provide a template you can use to get started. The template is available in the routr-processor-template.

    To use the template, you must have NodeJS installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:

    npx degit fonoster/nodejs-processor my-processor
    @@ -42,6 +42,6 @@

    cd my-processor
    npm install
    npm start

    -

    You may now start sending SIP messages to your processor from EdgePort or Dispatcher.

    +

    You may now start sending SIP messages to your processor from EdgePort or Dispatcher.

    \ No newline at end of file diff --git a/docs/2.0.0/development/building-a-scaip-processor/index.html b/docs/2.0.0/development/building-a-scaip-processor/index.html index 4c36e51cb..202fc6cd8 100644 --- a/docs/2.0.0/development/building-a-scaip-processor/index.html +++ b/docs/2.0.0/development/building-a-scaip-processor/index.html @@ -1,20 +1,20 @@ - + - -Building a SCAIP Processor | Routr Docs + +Building a SCAIP Processor | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/development/components/apiserver/index.html b/docs/2.0.0/development/components/apiserver/index.html index db5f2d3ec..922bf9390 100644 --- a/docs/2.0.0/development/components/apiserver/index.html +++ b/docs/2.0.0/development/components/apiserver/index.html @@ -1,26 +1,26 @@ - + - -APIServer | Routr Docs + +APIServer | Routr Docs - - - + + + -
    Version: 2.0.0

    APIServer

    +
    Version: 2.0.0

    APIServer

    The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.

    The APIServer has two implementations: the pgdata for persistent data storage in a PostgreSQL database and the simpledata for storing data in files. The simpledata implementation is intended for testing and small deployments.

    The pgdata has several advantages over the simpledata implementation. The first advantage is that the pgdata allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the extended attribute, enabling you to store additional data in the database in JSON format—more on this in later sections.

    Data Migration

    The pgdata implementation uses Prisma to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily.

    -

    Configuration Spec

    +

    Configuration Spec

    pgdata

    The pgdata has the following environment variables available for configuration:

      @@ -105,12 +105,12 @@

      Configura

      An example of an ACLs configuration file:

      Filename: acl.yaml

      - apiVersion: v2beta1
      kind: AccessControlList
      ref: acl-01
      metadata:
      name: Europe ACL
      spec:
      accessControlList:
      deny:
      - 0.0.0.0/1
      allow:
      - 192.168.1.3/31
      - 127.0.0.1/8
      - 10.111.221.22/31
      -

      Communication and Protobuf Spec

      +

      Communication and Protobuf Spec

      Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc.

      The following protobuf defines the Agent service interface:

      syntax = "proto3";

      package fonoster.routr.connect.agents.v2beta1;

      // The Agents service definition
      service Agents {
      // Creates a new Agent
      rpc Create (CreateAgentRequest) returns (Agent) {}
      // Updates an existing Agent
      rpc Update (UpdateAgentRequest) returns (Agent) {}
      // Gets an existing Agent
      rpc Get (GetAgentRequest) returns (Agent) {}
      // Deletes an existing Agent
      rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}
      // Lists all Agents
      rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}
      // Find Agents by field name and value
      rpc FindBy (FindByRequest) returns (FindByResponse) {}
      }

      enum Privacy {
      PRIVATE = 0;
      NONE = 1;
      }

      // The message for the Agent resource
      message Agent {
      // The API version of the Agent
      string api_version = 1;
      // The unique identifier of the Agent
      string ref = 2;
      // The name of the Agent
      string name = 3;
      // The username of the Agent
      string username = 4;
      // The password of the Agent
      Privacy privacy = 5;
      // The enabled status of the Agent
      bool enabled = 6;
      // The created_at timestamp of the Agent
      int32 created_at = 7;
      // The updated_at timestamp of the Agent
      int32 updated_at = 8;
      // The domain of the Agent
      fonoster.routr.connect.domains.v2beta1.Domain domain = 9;
      // The credentials of the Agent
      fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;
      // The extended attributes of the Agent
      .google.protobuf.Struct extended = 11;
      }

      // The request message for the Agents.Create method
      message CreateAgentRequest {
      // The name of the Agent
      string name = 1;
      // The username of the Agent
      string username = 2;
      // The password of the Agent
      Privacy privacy = 3;
      // The enabled status of the Agent
      bool enabled = 4;
      // Reference to the Domain of the Agent
      string domain_ref = 5;
      // Reference to the Credentials of the Agent
      string credentials_ref = 6;
      // The extended attributes of the Agent
      .google.protobuf.Struct extended = 7;
      }

      // The request message for the Agents.Update method
      message UpdateAgentRequest {
      // The unique identifier of the Agent
      string ref = 1;
      // The name of the Agent
      string name = 2;
      // The privacy settings of the Agent
      Privacy privacy = 3;
      // The enabled status of the Agent
      bool enabled = 4;
      // Reference to the Domain of the Agent
      string domain_ref = 5;
      // Reference to the Credentials of the Agent
      string credentials_ref = 6;
      // The extended attributes of the Agent
      .google.protobuf.Struct extended = 7;
      }

      // The request message for the Agents.Get method
      message GetAgentRequest {
      // The unique identifier of the Agent
      string ref = 1;
      }

      // The request message for the Agents.Delete method
      message DeleteAgentRequest {
      // The unique identifier of the Agent
      string ref = 1;
      }

      // The request message for the Agents.FindBy method
      message FindByRequest {
      // The field name to search
      string field_name = 1;
      // The value to search
      string field_value = 2;
      }

      // The response message for the Agents.FindBy method
      message FindByResponse {
      // The list of Agents
      repeated Agent items = 1;
      }

      // The request message for the Agents.List method
      message ListAgentsRequest {
      // The maximum number of items in the list
      int32 page_size = 1;

      // The next_page_token value returned from the previous request, if any
      string page_token = 2;
      }

      // The response message for the Agents.List method
      message ListAgentsResponse {
      // List of Agents
      repeated Agent items = 1;

      // Token to retrieve the next page of results or empty if there are no more results in the list
      string next_page_token = 2;
      }

      To see the complete protobuf spec, please visit the protobuf directory.

      -

      Launching the APIServer

      +

      Launching the APIServer

      Both implementations are available as Docker images from Docker Hub as fonoster/routr-pgdata and fonoster/routr-simpledata.

      pgdata

      To launch the pgdata implementation with Docker, you can use the following command:

      @@ -119,9 +119,9 @@

      Laun

      simpledata

      To launch the simpledata implementation with Docker, you can use the following command:

      docker run -it \
      -v /path/to/resources:/etc/routr/resources \
      -p 51907:51907 \
      fonoster/routr-simpledata
      -

      Quick Test with gRPCurl

      +

      Quick Test with gRPCurl

      One easy way to interact with the APIServer for testing and development is to use gRPCurl. The following example shows how to send a request to the Agents service within the APIServer:

      grpcurl -plaintext \
      -import-path /path/to/protos \
      -proto agents.proto -d '{...}' \
      localhost:51907 \
      fonoster.routr.connect.agents.v2beta1.Agents/Get
      -

      Please remember that the simpledata implementation does not accept write operations.

    +

    Please remember that the simpledata implementation does not accept write operations.

    \ No newline at end of file diff --git a/docs/2.0.0/development/components/dispatcher/index.html b/docs/2.0.0/development/components/dispatcher/index.html index e4b0a62d8..6e08c850c 100644 --- a/docs/2.0.0/development/components/dispatcher/index.html +++ b/docs/2.0.0/development/components/dispatcher/index.html @@ -1,25 +1,25 @@ - + - -Message Dispatcher | Routr Docs + +Message Dispatcher | Routr Docs - - - + + + -
    Version: 2.0.0

    Message Dispatcher

    +
    Version: 2.0.0

    Message Dispatcher

    The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.

    The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor.

    The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor.

    ┌────────┐ ┌──────────────────┐             ┌─────────────────┐
    │EdgePort│ │Message Dispatcher│ │Message Processor│
    └───┬────┘ └──────┬───────────┘ └────────┬────────┘
    │ │ │
    │gRPC request │ │
    │────────────>│ │
    │ │ │
    │ │findProcessor() & forwardMessage()│
    │ │─────────────────────────────────>│
    │ │ │
    │ │ Processed Message │
    │ │<─────────────────────────────────│
    │ │ │
    │gRPC response│ │
    │<────────────│ │
    ┌───┴────┐ ┌──────┴───────────┐ ┌────────┴────────┐
    │EdgePort│ │Message Dispatcher│ │Message Processor│
    └────────┘ └──────────────────┘ └─────────────────┘
    -

    Configuration Spec

    +

    Configuration Spec

    To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure.

    You can configure the Dispatcher using a YAML or JSON file that has the following structure:

    PropertyDescriptionRequired
    refReference to the DispatcherYes
    spec.bindAddrIpv4 interface to accept requests onNo
    spec.processorsList of ProcessorsYes
    spec.processors[*].refReference to the ProcessorYes
    spec.processors[*].matchFuncMatching functionYes
    spec.processors[*].addrAddress of the ProcessorYes
    spec.processors[*].methodsList of SIP Methods supported by the ProcessorYes
    spec.middlewaresList of MiddlewaresNo
    spec.middlewares[*].refReference to the MiddlewareYes
    spec.middlewares[*].addrAddress of the MiddlewareYes
    spec.middlewares[*].postProcessorWhether to process the SIP Message after the ProcessorYes
    @@ -39,16 +39,16 @@

    Configura
    req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"

    Match SIP Messages with a specific User-Agent header.

    req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
    -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:

    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid-session information
    INFO = 12;
    // Asks the recipient to issue a call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }

    Link to the protobuf definition.

    -

    Launching the Dispatcher with Docker

    +

    Launching the Dispatcher with Docker

    The Message Dispatcher is available as a Docker image from Docker Hub. To launch the Dispatcher with Docker, you can use the following command:

    docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher

    The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port 51901 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51901.

    -

    Quick Test with gRPCurl

    +

    Quick Test with gRPCurl

    One easy way to interact with the Dispatcher for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the Dispatcher.

    -
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    \ No newline at end of file diff --git a/docs/2.0.0/development/components/edgeport/index.html b/docs/2.0.0/development/components/edgeport/index.html index d1f84a934..47b86461f 100644 --- a/docs/2.0.0/development/components/edgeport/index.html +++ b/docs/2.0.0/development/components/edgeport/index.html @@ -1,27 +1,27 @@ - + - -EdgePort | Routr Docs + +EdgePort | Routr Docs - - - + + + -
    Version: 2.0.0

    EdgePort

    +
    Version: 2.0.0

    EdgePort

    The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.

    The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher.

    -
    ┌──────────┐  ┌────────┐ ┌──────────────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └────┬─────┘ └───┬────┘ └──────┬───────────┘
    │ │ │
    │SIP request │ │
    │───────────>│ │
    │ │ │
    │ │gRPC request │
    │ │────────────>│
    │ │ │
    │ │gRPC response│
    │ │<────────────│
    │ │ │
    │SIP response│ │
    │<───────────│ │
    ┌────┴─────┐ ┌───┴────┐ ┌──────┴───────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └──────────┘ └────────┘ └──────────────────┘
    +
    ┌──────────┐  ┌────────┐ ┌──────────────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └────┬─────┘ └───┬────┘ └──────┬───────────┘
    │ │ │
    │SIP request │ │
    │───────────>│ │
    │ │ │
    │ │gRPC request │
    │ │────────────>│
    │ │ │
    │ │gRPC response│
    │ │<────────────│
    │ │ │
    │SIP response│ │
    │<───────────│ │
    ┌────┴─────┐ ┌───┴────┐ ┌──────┴───────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └──────────┘ └────────┘ └──────────────────┘

    While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware.

    For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher.

    If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster.

    -

    Configuration Spec

    +

    Configuration Spec

    To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure.

    PropertyDescriptionRequired
    refReference to the EdgePortYes
    metadata.regionRegion where the EdgePort is located (reserved for future use)No
    spec.unknownMethodActionWhat to do if an incoming request type is not allowed (reserved for future use)No
    spec.transportEnabled Transport ProtocolsYes
    spec.transport[*].protocolTransport protocolYes
    spec.transport[*].bindAddrIpv4 interface to accept requests onNo
    spec.transport[*].portPort to listen onYes
    spec.methodsAcceptable SIP MethodsYes
    spec.processorAdjacent service for message routingYes
    spec.processor.addrAddress of the adjacent serviceYes
    spec.localnetsNetworks considered to be in the same local networkNo
    spec.externalAddrsEdgePort external ip addressesNo
    spec.bindAddrIpv4 interface to accept requests onNo
    spec.securityContextSecurity contextNo
    spec.securityContext.clientClient security contextNo
    spec.securityContext.client.protocolsTLS protocols used by the client (e.g., SSLv3, TLSv1.2)No
    spec.securityContext.client.authTypeClient authentication type (e.g., Disabled, DisabledAll, Required, Wanted)No
    spec.securityContext.keyStorePath to the key store fileNo
    spec.securityContext.trustStorePath to the trust store fileNo
    spec.securityContext.keyStorePasswordPassword for the key storeNo
    spec.securityContext.trustStorePasswordPassword for the trust storeNo
    spec.securityContext.keyStoreTypeType of the key store (e.g., pkcs12)No

    The security context is required if the EdgePort is configured to use a secure protocol such as TLS or WSS.

    @@ -43,13 +43,13 @@

    Configura
  • NATS_PUBLISHER_SUBJECT - Overwrites the default subject the NATS publisher uses. The default subject is routr.
  • NATS_PUBLISHER_URL - This is required if NATS_PUBLISHER_ENABLED is set to true. It should contain the NATS server URL. For example: nats://nats:4222.
  • -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition.

    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid session information
    INFO = 12;
    // Asks the recipient to issue call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }

    Link to the protobuf definition.

    -

    Launching the EdgePort with Docker

    +

    Launching the EdgePort with Docker

    The EdgePort is available as a Docker image from Docker Hub. To launch the EdgePort with Docker, you can use the following command:

    docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport
    -

    The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port 5060 for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port 5061 for TLS traffic, you must add the following flag to the docker run command: -p 5061:5061.

    +

    The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port 5060 for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port 5061 for TLS traffic, you must add the following flag to the docker run command: -p 5061:5061.

    \ No newline at end of file diff --git a/docs/2.0.0/development/components/location/index.html b/docs/2.0.0/development/components/location/index.html index 7f95b035d..31ceafb9d 100644 --- a/docs/2.0.0/development/components/location/index.html +++ b/docs/2.0.0/development/components/location/index.html @@ -1,20 +1,20 @@ - + - -Location Service | Routr Docs + +Location Service | Routr Docs - - - + + + -
    Version: 2.0.0

    Location Service

    +
    Version: 2.0.0

    Location Service

    In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

    Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

    For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

    @@ -24,7 +24,7 @@
    apiVersion: v2beta1
    kind: Peer
    ref: peer-01
    metadata:
    name: Asterisk (Media Server)
    spec:
    aor: sip:conference@sip.local
    username: asterisk
    credentialsRef: credentials-01
    loadBalancing:
    withSessionAffinity: true
    algorithm: least-sessions

    Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

    Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

    -

    Configuration Spec

    +

    Configuration Spec

    To configure the Location Service, you must provide a YAML or JSON configuration with the following structure.

    PropertyDescriptionRequired
    regionReserved for future useNo
    bindAddrIPv4 interface on which to accept requestsNo
    cacheCache configurationNo
    cache.providerCache provider (Accepts either memory or redis)No
    cache.parametersCache parameters (Comma-separated key-value pairs)No

    The cache.parameters property is only needed if you are using the Redis provider.

    @@ -34,17 +34,17 @@

    Configura

    Filename: location.yaml or location.json

    kind: Location
    apiVersion: v2beta1
    metadata:
    region: default
    spec:
    bindAddr: 0.0.0.0:51902
    cache:
    provider: redis
    parameters: "host=localhost,port=6379"

    Notice that using the memory provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the least-session algorithm and run multiple instances of the Location Service. In such cases, you will need the redis provider.

    -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API.

    syntax = "proto3";

    package fonoster.routr.location.v2beta1;

    import "google/protobuf/empty.proto";
    import "common.proto";
    import "processor.proto";

    service Location {
    rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}
    rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}
    rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}
    }

    // A binding created by an endpoint (Softphone, PBX, Conference System, etc.)
    message Route {
    string user = 1;
    string host = 2;
    string port = 3;
    string advertised_host = 13;
    string advertised_port = 14;
    fonoster.routr.common.v2beta1.Transport transport = 4;
    int64 registered_on = 5;
    int32 expires = 6;
    int32 session_count = 7;
    string edge_port_ref = 8;
    repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;
    repeated string localnets = 10;
    repeated string external_addrs = 11;
    // During route creation, an endpoint can request to add labels that can later be
    // used as selectors. For example, a Softphone can add a label `priority=1` to indicate
    // that it is the preferred endpoint for the given AOR.
    map<string, string> labels = 12;
    }

    message AddRouteRequest {
    // Address of record for the endpoint or trunk
    string aor = 1;
    Route route = 2;
    }

    message FindRoutesRequest {
    message Backend {
    enum Algoritm {
    ROUND_ROBIN = 0;
    LEAST_SESSIONS = 1;
    }
    string ref = 1;
    bool with_session_affinity = 2;
    Algoritm algorithm = 3;
    }
    string call_id = 1;
    string aor = 2;
    string session_affinity_ref = 3;
    Backend backend = 4;
    map<string, string> labels = 5;
    }

    message FindRoutesResponse {
    repeated Route routes = 1;
    }

    message RemoveRoutesRequest {
    string aor = 1;
    }

    Upon receiving a valid AddRoute request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition.

    Link to the protobuf definition.

    -

    Launching the Location Service with Docker

    +

    Launching the Location Service with Docker

    The Location Service is available as a Docker image from Docker Hub. To launch the Location Service with Docker, you can use the following command:

    docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location

    The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port 51902 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51902.

    -

    Quick Test with gRPCurl

    +

    Quick Test with gRPCurl

    One easy way to interact with the Location Service for testing and development is to use gRPCurl. The following example shows how to send a request to the Location Service using gRPCurl:

    -
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto location.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.location.v2beta1.Location/AddRouteRequest
    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto location.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.location.v2beta1.Location/AddRouteRequest
    \ No newline at end of file diff --git a/docs/2.0.0/development/components/overview/index.html b/docs/2.0.0/development/components/overview/index.html index 0a1127aa8..70e399e9d 100644 --- a/docs/2.0.0/development/components/overview/index.html +++ b/docs/2.0.0/development/components/overview/index.html @@ -1,22 +1,22 @@ - + - -Overview | Routr Docs + +Overview | Routr Docs - - - + + + -
    Version: 2.0.0

    Overview

    -
    ┌────────────┐┌────────────┐                           
    │EdgePort 001││EdgePort 002│
    └┬───────────┘└┬───────────┘
    ┌▽─────────────▽───────────────────────┐
    │Message Dispatcher │
    └┬────────────────┬───────────────────┬┘
    ┌▽──────────────┐┌▽─────────────────┐┌▽───────────────┐
    │IM Processor ││Connect Processor ││Twilio Processor│
    └┬──────────────┘└──────────────────┘└────────────────┘
    ┌▽────────────────────────────┐
    │Data APIs & External Services│
    └─────────────────────────────┘
    +
    Version: 2.0.0

    Overview

    +
    ┌────────────┐┌────────────┐                           
    │EdgePort 001││EdgePort 002│
    └┬───────────┘└┬───────────┘
    ┌▽─────────────▽───────────────────────┐
    │Message Dispatcher │
    └┬────────────────┬───────────────────┬┘
    ┌▽──────────────┐┌▽─────────────────┐┌▽───────────────┐
    │IM Processor ││Connect Processor ││Twilio Processor│
    └┬──────────────┘└──────────────────┘└────────────────┘
    ┌▽────────────────────────────┐
    │Data APIs & External Services│
    └─────────────────────────────┘

    This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.

    -

    Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more.

    +

    Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more.

    \ No newline at end of file diff --git a/docs/2.0.0/development/components/registry/index.html b/docs/2.0.0/development/components/registry/index.html index 7379a7bfc..57e11b1fe 100644 --- a/docs/2.0.0/development/components/registry/index.html +++ b/docs/2.0.0/development/components/registry/index.html @@ -1,22 +1,22 @@ - + - -Registry Service | Routr Docs + +Registry Service | Routr Docs - - - + + + -
    Version: 2.0.0

    Registry Service

    +
    Version: 2.0.0

    Registry Service

    The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.

    -

    Configuration Spec

    +

    Configuration Spec

    To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure.

    PropertyDescriptionRequired
    requesterAddrAddress of service to send requestsYes
    apiAddrAddress of API serviceYes
    registerIntervalInterval for sending registration requests (Defaults to 60s)No
    cacheCache configurationNo
    cache.providerAccepts either memory or redisNo
    cache.parametersComma-separated key-value pairsNo
    methodsAcceptable SIP Methods (reserved for future use)No
    edgePortsList of EdgePorts for outbound registrationsYes
    edgePorts.addressAddress of EdgePortYes
    edgePorts.regionRegion of EdgePort (reserved for future use)No

    The cache.parameters property is only needed if you are using the Redis provider.

    @@ -25,13 +25,13 @@

    Configura

    Here is an example of a configuration file:

    Filename: registry.yaml or registry.json

    kind: Registry
    apiVersion: v2beta1
    spec:
    requesterAddr: requester:51909
    apiAddr: apiserver:51907
    cache:
    provider: memory
    methods:
    - INVITE
    - MESSAGE
    edgePorts:
    - address: sip01.edgeport.net:5060
    region: us-east1
    - address: sip02.edgeport.net:6060
    -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

    syntax = "proto3";

    package fonoster.routr.requester.v2beta1;

    import "common.proto";
    import "sipmessage.proto";
    import "processor.proto";

    // Requester service
    service Requester {
    // Send Message Request
    rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
    }

    message SendMessageRequest {
    string target = 1;
    fonoster.routr.processor.v2beta1.Method method = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
    }

    message SendMessageResponse {
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
    }

    Link to the protobuf definition.

    -

    Launching the Registry Service with Docker

    +

    Launching the Registry Service with Docker

    The Registry Service is available as a Docker image from Docker Hub. To launch the Registry Service with Docker, you can use the following command:

    docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry
    -

    The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address requester:51909 and the API service using the address apiserver:51907.

    +

    The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address requester:51909 and the API service using the address apiserver:51907.

    \ No newline at end of file diff --git a/docs/2.0.0/development/components/requester/index.html b/docs/2.0.0/development/components/requester/index.html index e3212372f..7787bfbee 100644 --- a/docs/2.0.0/development/components/requester/index.html +++ b/docs/2.0.0/development/components/requester/index.html @@ -1,37 +1,37 @@ - + - -Requester | Routr Docs + +Requester | Routr Docs - - - + + + -
    Version: 2.0.0

    Requester

    +
    Version: 2.0.0

    Requester

    The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.

    -

    Configuration Spec

    +

    Configuration Spec

    The Requester service does not have a configuration file. However the following environment variables are available:

    • BIND_ADDR - Address to bind the service (Defaults to 0.0.0.0:51909)
    • ENABLE_HEALTHCHECKS - Enable health checks (Defaults to true)
    -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

    syntax = "proto3";

    package fonoster.routr.requester.v2beta1;

    import "common.proto";
    import "sipmessage.proto";
    import "processor.proto";

    // Requester service
    service Requester {
    // Send Message Request
    rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
    }

    message SendMessageRequest {
    string target = 1;
    fonoster.routr.processor.v2beta1.Method method = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
    }

    message SendMessageResponse {
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
    }

    Link to the protobuf definition.

    -

    Launching the Requester with Docker

    +

    Launching the Requester with Docker

    The Requester is available as a Docker image from Docker Hub. To launch the Requester with Docker, you can use the following command:

    docker run -it -p 51909:51909 fonoster/routr-requester

    The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port 51909 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port 51909.

    -

    Quick Test with gRPCurl

    +

    Quick Test with gRPCurl

    One easy way to interact with the Requester for testing and development is to use gRPCurl. The following example shows how to send a request to the Requester using gRPCurl:

    -
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto requester.proto -d '{...}' \
    localhost:51909 \
    fonoster.routr.requester.v2beta1.Requester/SendMessage
    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto requester.proto -d '{...}' \
    localhost:51909 \
    fonoster.routr.requester.v2beta1.Requester/SendMessage
    \ No newline at end of file diff --git a/docs/2.0.0/development/components/rtprelay/index.html b/docs/2.0.0/development/components/rtprelay/index.html index 172ec41c9..98ace4a7e 100644 --- a/docs/2.0.0/development/components/rtprelay/index.html +++ b/docs/2.0.0/development/components/rtprelay/index.html @@ -1,22 +1,22 @@ - + - -RTPRelay | Routr Docs + +RTPRelay | Routr Docs - - - + + + -
    Version: 2.0.0

    RTPRelay

    +
    Version: 2.0.0

    RTPRelay

    The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.

    -

    Configuration Spec

    +

    Configuration Spec

    Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:

    • BIND_ADDR - The IP address and port to bind the gRPC server. Defaults to 0.0.0.0:51903
    • @@ -24,16 +24,16 @@

      Configura
    • RTPENGINE_PORT - The port of the RTPEngine service. Defaults to 22222.
    • RTPENGINE_TIMEOUT - The timeout in milliseconds for the RTPEngine service. Defaults to 5000.
    -

    Communication and Protobuf Spec

    +

    Communication and Protobuf Spec

    Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:

    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid-session information
    INFO = 12;
    // Asks the recipient to issue a call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }

    Link to the protobuf definition.

    -

    Launching the RTPRelay with Docker

    +

    Launching the RTPRelay with Docker

    The RTPRelay is available as a Docker image from Docker Hub. To launch the RTPRelay with Docker, you can use the following command:

    docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay

    The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

    -

    Quick Test with gRPCurl

    +

    Quick Test with gRPCurl

    One easy way to interact with the RTPRelay for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the RTPRelay.

    -
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51903 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51903 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    \ No newline at end of file diff --git a/docs/2.0.0/development/components/simpleauth/index.html b/docs/2.0.0/development/components/simpleauth/index.html index b1e1c3240..5aee2ff25 100644 --- a/docs/2.0.0/development/components/simpleauth/index.html +++ b/docs/2.0.0/development/components/simpleauth/index.html @@ -1,22 +1,22 @@ - + - -SimpleAuth Service | Routr Docs + +SimpleAuth Service | Routr Docs - - - + + + -
    Version: 2.0.0

    SimpleAuth Service

    +
    Version: 2.0.0

    SimpleAuth Service

    The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.

    -

    Configuration Spec

    +

    Configuration Spec

    The SimpleAuth provides the following environment variables for configuration:

    • BIND_ADDR - The address where the service will listen for gRPC requests. Default: 0.0.0.0:51903
    • @@ -27,17 +27,17 @@

      Configura

      Example of the authentication file:

      Filename auth.json

      [
      {
      "username": "1001",
      "secret": "1234"
      },
      {
      "username": "john",
      "secret": "1234"
      }
      ]
      -

      Communication and Protobuf Spec

      +

      Communication and Protobuf Spec

      The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid.

      The following is the protobuf definition for the SimpleAuth service:


      ```protobuf
      syntax = "proto3";

      package fonoster.routr.processor.v2beta1;

      import "common.proto";
      import "sipmessage.proto";

      // Processor service
      service Processor {
      // Process Message Request
      rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
      }

      enum Method {
      UNKNOWN = 0;
      // Communicates user location (hostname, IP)
      REGISTER = 1;
      // Establishes a session
      INVITE = 2;
      // Transports Instant Messages
      MESSAGE = 3;
      // Publishes an event to the Server
      PUBLISH = 4;
      // Notifies the subscriber of a new event
      NOTIFY = 5;
      // Subscribes for Notification from the notifier
      SUBSCRIBE = 6;
      // Confirms an INVITE request
      ACK = 7;
      // Terminates a session
      BYE = 8;
      // Cancels establishing of a session
      CANCEL = 9;
      // Communicates information about the capabilities of calling and receiving SIP phones
      OPTIONS = 10;
      // Provisional Acknowledgement
      PRACK = 11;
      // Sends mid-session information
      INFO = 12;
      // Asks the recipient to issue a call transfer
      REFER = 13;
      // Modifies the state of a session
      UPDATE = 14;
      }

      message NetInterface {
      string host = 1;
      int32 port = 2;
      fonoster.routr.common.v2beta1.Transport transport = 3;
      }

      message MessageRequest {
      // Same as the Call-Id header
      string ref = 1;
      string edge_port_ref = 2;
      Method method = 3;
      NetInterface sender = 4;
      repeated NetInterface listening_points = 5;
      repeated string external_addrs = 6;
      repeated string localnets = 7;
      fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
      map<string, string> metadata = 9;
      }

      message MessageResponse {
      NetInterface sender = 1;
      fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
      map<string, string> metadata = 3;
      }

      Link to the protobuf definition.

      -

      Launching the SimpleAuth with Docker

      +

      Launching the SimpleAuth with Docker

      The SimpleAuth is available as a Docker image from Docker Hub. To launch the SimpleAuth with Docker, you can use the following command:

      docker run -it \
      -p 51903:51903 \
      -e ALLOWLIST=anonymous,1001 \
      -e METHODS=INVITE,REGISTER,MESSAGE \
      -e PATH_TO_AUTH=/path/to/auth.json \
      -v /path/to/auth.json:/path/to/auth.json \
      fonoster/routr-simpleauth

      The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

      -

      Quick Test with gRPCurl

      +

      Quick Test with gRPCurl

      One easy way to interact with SimpleAuth for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the SimpleAuth.

      -
      grpcurl -plaintext \
      -import-path /path/to/protos \
      -proto processor.proto -d '{...}' \
      localhost:51901 \
      fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    \ No newline at end of file diff --git a/docs/2.0.0/development/custom-data-with-the-apiserver/index.html b/docs/2.0.0/development/custom-data-with-the-apiserver/index.html index 1b06cb275..ef6bd07be 100644 --- a/docs/2.0.0/development/custom-data-with-the-apiserver/index.html +++ b/docs/2.0.0/development/custom-data-with-the-apiserver/index.html @@ -1,31 +1,31 @@ - + - -Custom data with the APIServer | Routr Docs + +Custom data with the APIServer | Routr Docs - - - + + + -
    Version: 2.0.0

    Custom data with the APIServer

    +
    Version: 2.0.0

    Custom data with the APIServer

    Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.

    The APIServer, typically used for Routr Connect, consists of objects with an extended property to store custom data. This extended property is a JSON object you can use to store any data you want.

    -

    When to store custom data

    +

    When to store custom data

    Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system.

    You might also need to store information a Processor requires, like the User-Agent of a device an Agent uses, and use that information to adjust the signaling process.

    -

    How to store custom data

    +

    How to store custom data

    To store custom data, add a property to the extended object. For instance, to add the external identifier of an Agent in your external system, do the following:

    const request = {
    name: "John Doe",
    username: "jdoe",
    privacy: Privacy.PRIVATE,
    domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    enabled: true,
    extended: {
    "externalId": "123456789"
    }
    };

    agents.createAgent(request)
    .then(console.log)
    .catch(console.error); // an error occurred

    For additional examples of how to store custom data, see the Node SDK and search for "extended."

    -

    How to retrieve custom data

    +

    How to retrieve custom data

    To retrieve custom data, read the extended property. For instance, to retrieve the external identifier of a user in your external system, do the following:

    -
    agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")
    .then(agent => {
    console.log(agent.extended.externalId);
    })
    .catch(console.error); // an error occurred
    +
    agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")
    .then(agent => {
    console.log(agent.extended.externalId);
    })
    .catch(console.error); // an error occurred
    \ No newline at end of file diff --git a/docs/2.0.0/development/development-mode-with-gitpod/index.html b/docs/2.0.0/development/development-mode-with-gitpod/index.html index f15f6de22..1849a39ad 100644 --- a/docs/2.0.0/development/development-mode-with-gitpod/index.html +++ b/docs/2.0.0/development/development-mode-with-gitpod/index.html @@ -1,20 +1,20 @@ - + - -Development with Gitpod | Routr Docs + +Development with Gitpod | Routr Docs - - - + + + -
    Version: 2.0.0

    Development with Gitpod

    +
    Version: 2.0.0

    Development with Gitpod

    Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.

    To launch a Gitpod workspace, click the button below:

    Open in Gitpod

    @@ -44,6 +44,6 @@

    This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:

    https://github.com/fonoster/routr/blob/main/config/resources

    -

    Feel free to explore these files and make changes as needed.

    +

    Feel free to explore these files and make changes as needed.

    \ No newline at end of file diff --git a/docs/2.0.0/development/extending-the-ctl/index.html b/docs/2.0.0/development/extending-the-ctl/index.html index 73ff9f28f..d9c76c273 100644 --- a/docs/2.0.0/development/extending-the-ctl/index.html +++ b/docs/2.0.0/development/extending-the-ctl/index.html @@ -1,30 +1,30 @@ - + - -Extending the Command-Line Tool | Routr Docs + +Extending the Command-Line Tool | Routr Docs - - - + + + -
    Version: 2.0.0

    Extending the Command-Line Tool

    +
    Version: 2.0.0

    Extending the Command-Line Tool

    Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.

    You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins.

    -

    Installing the Command-Line Tool

    +

    Installing the Command-Line Tool

    The CTL comes as an npm package. To install it, you run the following command:

    npm install --location=global @routr/ctl
    -

    Using the Command-Line Tool

    +

    Using the Command-Line Tool

    The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands.

    Most commands adopt the {substantive} {verb} pattern. For instance, rctl agents get retrieves a list of agents.

    If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins.

    -

    Creating a plugin

    +

    Creating a plugin

    To create a new plugin, you start by running the following command:

    npx oclif generate mycommand

    The system will prompt you for some information about your plugin. For this example, let's choose mycommand as the name.

    @@ -40,6 +40,6 @@

    Creating a

    If you have published your plugin to NPM, you can install it with this command:

    rctl plugins install mycommand

    To see your new command in action, you run the command with the --help flag and follow the instructions.

    -

    With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the Node.js SDK to interact with the server.

    +

    With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the Node.js SDK to interact with the server.

    \ No newline at end of file diff --git a/docs/2.0.0/development/introduction/index.html b/docs/2.0.0/development/introduction/index.html index 1105b6277..ff65d4f61 100644 --- a/docs/2.0.0/development/introduction/index.html +++ b/docs/2.0.0/development/introduction/index.html @@ -1,25 +1,25 @@ - + - -Introduction | Routr Docs + +Introduction | Routr Docs - - - + + + -
    Version: 2.0.0

    Introduction

    +
    Version: 2.0.0

    Introduction

    Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.

    Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool.

    -

    How to read this section

    +

    How to read this section

    The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most.

    -

    Tooling and dependencies

    +

    Tooling and dependencies

    The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:

    • Docker: We use Docker to build and run individual components
    • @@ -30,6 +30,6 @@

      Too
    • sngrep: A tool for monitoring SIP traffic (You could use Wireshark as well)
    • grpcurl: A command-line tool for interacting with gRPC servers
    -

    If you don't have a Kubernetes cluster, you can use Minikube or Docker Desktop with Kubernetes enabled.

    +

    If you don't have a Kubernetes cluster, you can use Minikube or Docker Desktop with Kubernetes enabled.

    \ No newline at end of file diff --git a/docs/2.0.0/development/metrics-events-logs-and-traces/index.html b/docs/2.0.0/development/metrics-events-logs-and-traces/index.html index 0f6fc65ed..65149dea4 100644 --- a/docs/2.0.0/development/metrics-events-logs-and-traces/index.html +++ b/docs/2.0.0/development/metrics-events-logs-and-traces/index.html @@ -1,20 +1,20 @@ - + - -Everything about MELT | Routr Docs + +Everything about MELT | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/development/orchestration-with-docker/index.html b/docs/2.0.0/development/orchestration-with-docker/index.html index 6315eef0e..874a7fe6f 100644 --- a/docs/2.0.0/development/orchestration-with-docker/index.html +++ b/docs/2.0.0/development/orchestration-with-docker/index.html @@ -1,20 +1,20 @@ - + - -Orchestration with Docker | Routr Docs + +Orchestration with Docker | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/development/orchestration-with-kubernetes/index.html b/docs/2.0.0/development/orchestration-with-kubernetes/index.html index cdfe0966c..cf59bf6d8 100644 --- a/docs/2.0.0/development/orchestration-with-kubernetes/index.html +++ b/docs/2.0.0/development/orchestration-with-kubernetes/index.html @@ -1,20 +1,20 @@ - + - -Orchestration with Kubernetes | Routr Docs + +Orchestration with Kubernetes | Routr Docs - - - + + + -
    Version: 2.0.0

    Orchestration with Kubernetes

    -

    Coming soon.

    +
    Version: 2.0.0

    Orchestration with Kubernetes

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.0.0/development/quick-start/index.html b/docs/2.0.0/development/quick-start/index.html index edfed7dfc..5136e4bfd 100644 --- a/docs/2.0.0/development/quick-start/index.html +++ b/docs/2.0.0/development/quick-start/index.html @@ -1,27 +1,27 @@ - + - -Quick Start | Routr Docs + +Quick Start | Routr Docs - - - + + + -
    Version: 2.0.0

    Quick Start

    +
    Version: 2.0.0

    Quick Start

    Before starting the development, you need to install the following tools:

    • NodeJS (>=16.14)
    • JDK (>=11)

    For NodeJS, we recommend using nvm to manage your NodeJS versions.

    -

    Clone and Build the Project

    +

    Clone and Build the Project

    To get started, first, clone the repository:

    git clone https://github.com/fonoster/routr

    The previous command will create a directory called routr with the project's source code.

    @@ -30,7 +30,7 @@

    Finally, build the project:

    cd routr
    npm run make

    The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors.

    -

    Run the Project

    +

    Run the Project

    To run all the components, you can use the following command:

    npm run start

    The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry.

    @@ -43,7 +43,7 @@

    Run the Proj

    In a separate terminal:

    npm run start:location

    Example output:

    -
    > start:location
    > cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner

    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): mods/**/*
    [nodemon] watching extensions: ts
    [nodemon] starting `ts-node mods/location/src/runner.ts`
    2023-09-05 12:41:38.733 [verbose]: (grpc-health-check) /node_modules/@fonoster/grpc-health-check/dist/add-health-to-server.js added healthcheck service {}
    2023-09-05 12:41:38.735 [info]: (location) /mods/location/src/service.ts using memory as cache provider {}
    2023-09-05 12:41:38.739 [info]: (common) /mods/common/dist/service.js starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}
    -

    Please see the scripts section of package.json for a complete list of available commands.

    +
    > start:location
    > cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner

    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): mods/**/*
    [nodemon] watching extensions: ts
    [nodemon] starting `ts-node mods/location/src/runner.ts`
    2023-09-05 12:41:38.735 [info]: (location) using memory as cache provider {}
    2023-09-05 12:41:38.739 [info]: (common) starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}
    +

    Please see the scripts section of package.json for a complete list of available commands.

    \ No newline at end of file diff --git a/docs/2.0.0/development/testing-with-seet/index.html b/docs/2.0.0/development/testing-with-seet/index.html index 8b425c683..4044f848c 100644 --- a/docs/2.0.0/development/testing-with-seet/index.html +++ b/docs/2.0.0/development/testing-with-seet/index.html @@ -1,20 +1,20 @@ - + - -Testing with SEET | Routr Docs + +Testing with SEET | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/faqs/index.html b/docs/2.0.0/faqs/index.html index 577fe76c7..be4055c34 100644 --- a/docs/2.0.0/faqs/index.html +++ b/docs/2.0.0/faqs/index.html @@ -1,36 +1,36 @@ - + - -FAQs | Routr Docs + +FAQs | Routr Docs - - - + + + -
    Version: 2.0.0

    FAQs

    -

    What is Routr?

    +
    Version: 2.0.0

    FAQs

    +

    What is Routr?

    Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

    -

    What dependencies does Routr have?

    +

    What dependencies does Routr have?

    The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache.

    In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes.

    -

    How does Routr compare with other SIP servers

    +

    How does Routr compare with other SIP servers

    Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently.

    For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one.

    -

    Is Routr a Media Server?

    +

    Is Routr a Media Server?

    Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk.

    This is useful when you need load balancing

    -

    Which language is the team using to build Routr?

    +

    Which language is the team using to build Routr?

    The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS.

    -

    What license does Routr use?

    -

    We release Routr under the MIT license.

    +

    What license does Routr use?

    +

    We release Routr under the MIT license.

    \ No newline at end of file diff --git a/docs/2.0.0/overview/architecture/index.html b/docs/2.0.0/overview/architecture/index.html index 22ffaee5c..884080d1a 100644 --- a/docs/2.0.0/overview/architecture/index.html +++ b/docs/2.0.0/overview/architecture/index.html @@ -1,21 +1,21 @@ - + - -Architecture | Routr Docs + +Architecture | Routr Docs - - - + + + -
    Version: 2.0.0

    Architecture

    -

    Routr&#39;s architecture diagram

    +
    Version: 2.0.0

    Architecture

    +

    Routr&#39;s architecture diagram

    Summary

    Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled.

    Specification

    @@ -26,6 +26,6 @@

    Specification

    The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing.

    The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more.

    -

    Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them.

    +

    Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them.

    \ No newline at end of file diff --git a/docs/2.0.0/overview/concepts/index.html b/docs/2.0.0/overview/concepts/index.html index 3e558297a..2bcf5ac86 100644 --- a/docs/2.0.0/overview/concepts/index.html +++ b/docs/2.0.0/overview/concepts/index.html @@ -1,23 +1,23 @@ - + - -Concepts | Routr Docs + +Concepts | Routr Docs - - - + + + -
    Version: 2.0.0

    Concepts

    +
    Version: 2.0.0

    Concepts

    Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.

    The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections.

    -

    EdgePort

    +

    EdgePort

    The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages.

    The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly.

    Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr.

    @@ -43,7 +43,7 @@

    Message Dispatcher

    req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"

    Match SIP Messages with a specific User-Agent header.

    req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
    -

    Location service

    +

    Location service

    In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

    Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

    For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

    @@ -53,7 +53,7 @@

    Location se
    apiVersion: v2beta1
    kind: Peer
    ref: peer-01
    metadata:
    name: Asterisk (Media Server)
    spec:
    aor: sip:conference@sip.local
    username: asterisk
    credentialsRef: credentials-01
    loadBalancing:
    withSessionAffinity: true
    algorithm: least-sessions

    Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

    Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

    -

    Middlewares

    +

    Middlewares

    Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc.

    Some use cases for Middlewares include:

    Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor.

    -

    Processors

    -

    Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the Alterations API to modify SIP messages.

    +

    Processors

    +

    Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the Alterations API to modify SIP messages.

    The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.

    const Processor = require("@routr/processor").default;
    const { MessageRequest, Response } = require("@routr/processor");

    new Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(
    (req: MessageRequest, res: Response) => {
    logger.verbose("got new request: ")
    logger.verbose(JSON.stringify(req, null, " "))
    res.sendOk()
    }
    )
    -

    Alterations

    +

    Alterations

    Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes.

    The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:

    const { Alterations } = require('@routr/processor')
    const { pipe } = require("fp-ts/function");

    function messageProcessing(req: MessageRequest, route: Route): MessageRequest {
    const requestOut = pipe(
    reqIn,
    //example of an Alteration method with two arities
    Alterations.addSelfVia(route),
    Alterations.addSelfRecordRoute(route),
    Alterations.addRouteToPeerEdgePort(route),
    Alterations.addRouteToNextHop(route),
    //example of an Alteration method with one arity
    Alterations.addXEdgePortRef,
    Alterations.decreaseMaxForwards
    )

    return requestOut
    }

    If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output.

    -

    Registry service

    +

    Registry service

    The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service.

    Available configurations include the following:

    PropertyDescriptionRequired
    requesterAddrAddress of service to send requestsYes
    apiAddrAddress of API serviceYes
    registerIntervalInterval to send registration requestsYes
    cacheCache configurationYes
    methodsAcceptable SIP Methods (reserved for future use)No
    edgePortsList of EdgePorts for outbound registrationsYes
    edgePorts.addressAddress of EdgePortYes
    edgePorts.regionRegion of EdgePort (reserved for future use)No

    Here is an example of a Trunk configuration that requires registration:

    kind: Registry
    apiVersion: v2beta1
    spec:
    requesterAddr: requester:51909
    apiAddr: apiserver:51907
    registerInterval: 20
    cache:
    provider: memory
    methods:
    - INVITE
    - MESSAGE
    edgePorts:
    - address: sip01.edgeport.net:5060
    region: us-east1
    - address: sip02.edgeport.net:6060
    -

    Requester

    -

    The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service.

    +

    Requester

    +

    The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service.

    \ No newline at end of file diff --git a/docs/2.0.0/overview/deploy-with-docker/index.html b/docs/2.0.0/overview/deploy-with-docker/index.html index 5654dbee1..83c4c9f8b 100644 --- a/docs/2.0.0/overview/deploy-with-docker/index.html +++ b/docs/2.0.0/overview/deploy-with-docker/index.html @@ -1,26 +1,26 @@ - + - -Deploy with Docker | Routr Docs + +Deploy with Docker | Routr Docs - - - + + + -
    Version: 2.0.0

    Deploy with Docker

    +
    Version: 2.0.0

    Deploy with Docker

    Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.

    You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions here.

    Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later.

    -

    Deploying Routr

    +

    Deploying Routr

    First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

    Filename: compose.yaml

    version: "3"

    services:
    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    ports:
    - 51908:51908
    - 5060:5060/udp
    volumes:
    - shared:/var/lib/postgresql/data

    volumes:
    shared:
    @@ -39,6 +39,6 @@

    Deploying Ro

    The --insecure flag is required as we did not set up the TLS settings.

    -

    For additional examples, refer to the command-line documentation.

    +

    For additional examples, refer to the command-line documentation.

    \ No newline at end of file diff --git a/docs/2.0.0/overview/introduction/index.html b/docs/2.0.0/overview/introduction/index.html index 908b2c8b1..7fee92cca 100644 --- a/docs/2.0.0/overview/introduction/index.html +++ b/docs/2.0.0/overview/introduction/index.html @@ -1,32 +1,32 @@ - + - -introduction | Routr Docs + +introduction | Routr Docs - - - + + + -
    Version: 2.0.0

    +
    Version: 2.0.0

    Community banner

    -

    Welcome

    +

    Welcome

    On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs.

    -

    What is Routr?

    +

    What is Routr?

    Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

    -

    Why Routr?

    +

    Why Routr?

    At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr.

    We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow.

    -

    Who is Routr for?

    +

    Who is Routr for?

    Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community.

    -

    What is the difference between Routr and other SIP servers?

    +

    What is the difference between Routr and other SIP servers?

    Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze.

    -

    We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality.

    +

    We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality.

    \ No newline at end of file diff --git a/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html b/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html index b08bccd91..a3cbd48f4 100644 --- a/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html +++ b/docs/2.0.0/tutorials/deploying-to-civo-with-helm/index.html @@ -1,20 +1,20 @@ - + - -Deploying to Civo with Helm | Routr Docs + +Deploying to Civo with Helm | Routr Docs - - - + + + -
    +
    \ No newline at end of file diff --git a/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html b/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html index 4e00ce94c..60ac5de56 100644 --- a/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html +++ b/docs/2.0.0/tutorials/ephemeral-agents-in-the-browser/index.html @@ -1,20 +1,20 @@ - + - -Ephemeral Agents in the Browser | Routr Docs + +Ephemeral Agents in the Browser | Routr Docs - - - + + + -
    Version: 2.0.0

    Ephemeral Agents in the Browser

    -

    Coming soon.

    +
    Version: 2.0.0

    Ephemeral Agents in the Browser

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html b/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html index ca370080d..d8e88a7ac 100644 --- a/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html +++ b/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetes/index.html @@ -1,20 +1,20 @@ - + - -Intercom System with Routr and Kubernetes | Routr Docs + +Intercom System with Routr and Kubernetes | Routr Docs - - - + + + -
    Version: 2.0.0

    Intercom System with Routr and Kubernetes

    -

    Coming soon.

    +
    Version: 2.0.0

    Intercom System with Routr and Kubernetes

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html b/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html index 5ff16519c..713cc3832 100644 --- a/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html +++ b/docs/2.0.0/tutorials/load-balancing-asterisk-with-routr/index.html @@ -1,20 +1,20 @@ - + - -Load-balancing Asterisk with Routr | Routr Docs + +Load-balancing Asterisk with Routr | Routr Docs - - - + + + -
    Version: 2.0.0

    Load-balancing Asterisk with Routr

    -

    Coming soon.

    +
    Version: 2.0.0

    Load-balancing Asterisk with Routr

    +

    Coming soon.

    \ No newline at end of file diff --git a/docs/2.11.5/changelog/index.html b/docs/2.11.5/changelog/index.html new file mode 100644 index 000000000..5552d7951 --- /dev/null +++ b/docs/2.11.5/changelog/index.html @@ -0,0 +1,20 @@ + + + + + +Changelog | Routr Docs + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/2.11.5/community/index.html b/docs/2.11.5/community/index.html new file mode 100644 index 000000000..64fa5a993 --- /dev/null +++ b/docs/2.11.5/community/index.html @@ -0,0 +1,41 @@ + + + + + +Community | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Community

    +

    We are developing Routr in the open. These are the channels we use for communication and contribution:

    + +

    Twitter: @Fonoster

    +

    Issue tracker: Use the GitHub issue tracker for Routr repository to file bugs and feature requests. If you need support or have a question, please start a discussion in GitHub or Discord rather than create an issue.

    +
    +

    Please do not ask individual project members for support. Use the channels above instead, where the whole community can help you and benefit from the solutions provided. Please refer to the Commercial Support section below if more than community support is required.

    +
    +

    Contributing

    +

    We welcome community contributions! Please see the CONTRIBUTING.md file in the Routr repository for instructions on submitting changes. If you plan on making more elaborate or controversial changes, please discuss them on Discord or GitHub Discussions before sending a pull request.

    +

    Development: GitHub Discussions – for discussions around Routr development

    +

    Developer Summits

    +

    We strive to be as open as possible. Technical discussions happen on Discord and GitHub Discussions; our office-hours meeting notes are public. Please subscribe to the #announcement channel in Discord for the next office-hour meeting.

    +

    Code of Conduct

    +

    To make Routr a welcoming and harassment-free experience for everyone, we follow the Contributor Covenant Code of Conduct.

    +

    Commercial Support

    +

    The following is a list of third-party companies and individuals who provide products or services related to Routr. Routr is an independent open-source project which does not endorse any company. This list goes down alphabetically.

    +

    Pedro Sanders (creator and maintainer)

    +

    Acknowledgments

    +

    Routr was developed initially by Pedro Sanders. Fonoster and Camanio AB sponsored the majority of its development.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/command-line/ctl/index.html b/docs/2.11.5/connect/command-line/ctl/index.html new file mode 100644 index 000000000..9019c0817 --- /dev/null +++ b/docs/2.11.5/connect/command-line/ctl/index.html @@ -0,0 +1,204 @@ + + + + + +CTL | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    CTL

    +

    Command-Line for Routr server.

    + +

    Usage

    +
    $ npm install -g @routr/ctl
    $ rctl COMMAND
    running command...
    $ rctl (--version)
    @routr/ctl/2.1.11 linux-x64 node-v18.17.1
    $ rctl --help [COMMAND]
    USAGE
    $ rctl COMMAND
    ...
    +

    Commands

    +

    rctl acl create

    +

    Creates a new ACL

    +
    USAGE
    $ rctl acl create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new ACL

    EXAMPLES
    $ rctl acl create
    Creating ACL US Eeast... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/acl/create.ts

    +

    rctl acl delete [REF]

    +

    Deletes an Access Control List

    +
    USAGE
    $ rctl acl delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes an Access Control List

    EXAMPLES
    $ rctl acl delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/acl/delete.ts

    +

    rctl acl describe [REF]

    +

    shows details of an ACL

    +
    USAGE
    $ rctl acl describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details of an ACL
    +

    See code: dist/commands/acl/describe.ts

    +

    rctl acl get [REF]

    +

    Shows a list of paginated ACLs or a single ACL if a ref is provided

    +
    USAGE
    $ rctl acl get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to an ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated ACLs or a single ACL if a ref is provided

    EXAMPLES
    $ rctl acl get
    Ref Name Deny List Allow List
    9e7a88f0-8390-42f5-a2cb-689583ba9f4f Local Network ACL 0.0.0.0/0 10.0.0.28
    +

    See code: dist/commands/acl/get.ts

    +

    rctl acl update REF

    +

    Updates an existing ACL

    +
    USAGE
    $ rctl acl update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an ACL

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing ACL

    EXAMPLES
    $ rctl acl update
    Updating ACL US East... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/acl/update.ts

    +

    rctl agents create

    +

    Creates a new Agent

    +
    USAGE
    $ rctl agents create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Agent

    EXAMPLES
    $ rctl agents create
    Creating Agent Jhon Doe... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/agents/create.ts

    +

    rctl agents delete [REF]

    +

    Deletes an Agent

    +
    USAGE
    $ rctl agents delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes an Agent

    EXAMPLES
    $ rctl agents delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/agents/delete.ts

    +

    rctl agents describe [REF]

    +

    shows details of an Agent

    +
    USAGE
    $ rctl agents describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Agent

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details of an Agent
    +

    See code: dist/commands/agents/describe.ts

    +

    rctl agents get [REF]

    +

    Shows a list of paginated Agents or a single Agent if ref is provided

    +
    USAGE
    $ rctl agents get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF Optional Agents reference

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] The number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Agents or a single Agent if ref is provided

    EXAMPLES
    $ rctl agents get
    Ref Name Username Domain Privacy Enabled
    d31f5fb8-e367-42f7-9884-1a7999f53fe8 John Doe jdoe sip.local PRIVATE Yes
    +

    See code: dist/commands/agents/get.ts

    +

    rctl agents update REF

    +

    Updates an existing Agent

    +
    USAGE
    $ rctl agents update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Agent

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Agent

    EXAMPLES
    $ rctl agents update
    Updating Agent John Doe... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/agents/update.ts

    +

    rctl autocomplete [SHELL]

    +

    display autocomplete installation instructions

    +
    USAGE
    $ rctl autocomplete [SHELL] [-r]

    ARGUMENTS
    SHELL shell type

    FLAGS
    -r, --refresh-cache Refresh cache (ignores displaying instructions)

    DESCRIPTION
    display autocomplete installation instructions

    EXAMPLES
    $ rctl autocomplete

    $ rctl autocomplete bash

    $ rctl autocomplete zsh

    $ rctl autocomplete --refresh-cache
    +

    See code: @oclif/plugin-autocomplete

    +

    rctl credentials create

    +

    Creates a new set of Credentials

    +
    USAGE
    $ rctl credentials create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new set of Credentials

    EXAMPLES
    $ rctl credentials create
    Creating Credentials JDoe Access... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/credentials/create.ts

    +

    rctl credentials delete [REF]

    +

    Deletes a set of Credentials

    +
    USAGE
    $ rctl credentials delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a set of Credentials

    EXAMPLES
    $ rctl credentials delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/credentials/delete.ts

    +

    rctl credentials describe [REF]

    +

    shows details for a set of Credentials

    +
    USAGE
    $ rctl credentials describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a set of Credentials
    +

    See code: dist/commands/credentials/describe.ts

    +

    rctl credentials get [REF]

    +

    Shows a list of paginated Credentials or a single set if ref is provided

    +
    USAGE
    $ rctl credentials get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Credentials or a single set if ref is provided

    EXAMPLES
    $ rctl credentials get
    Ref Name Deny List Allow List
    80181ca6-d4aa-4575-9375-8f72b07d6666 Europe ACL 0.0.0.0/0 10.0.0.25
    +

    See code: dist/commands/credentials/get.ts

    +

    rctl credentials update REF

    +

    Updates an existing set of Credentials

    +
    USAGE
    $ rctl credentials update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing set of Credentials

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing set of Credentials

    EXAMPLES
    $ rctl credentials update
    Updating Credentials JDoe Credentials... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/credentials/update.ts

    +

    rctl domains create

    +

    Creates a new set Domain

    +
    USAGE
    $ rctl domains create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new set Domain

    EXAMPLES
    $ rctl domains create
    Creating Domain Local Domain... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/domains/create.ts

    +

    rctl domains delete [REF]

    +

    Deletes a Domain

    +
    USAGE
    $ rctl domains delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Domain

    EXAMPLES
    $ rctl domains delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/domains/delete.ts

    +

    rctl domains describe [REF]

    +

    show details of a Domain

    +
    USAGE
    $ rctl domains describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    show details of a Domain
    +

    See code: dist/commands/domains/describe.ts

    +

    rctl domains get [REF]

    +

    Shows a list of paginated Domains or a single Domain if ref is provided

    +
    USAGE
    $ rctl domains get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Domains or a single Domain if ref is provided

    EXAMPLES
    $ rctl domains get
    Ref Name URI
    ab2b6959-f497-4b14-903b-85a7c464b564 Local Domain sip.local
    +

    See code: dist/commands/domains/get.ts

    +

    rctl domains update REF

    +

    Updates an existing Domain

    +
    USAGE
    $ rctl domains update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Domain

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Domain

    EXAMPLES
    $ rctl domains update
    Updating Domain Local... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/domains/update.ts

    +

    rctl numbers create

    +

    Creates a new Number

    +
    USAGE
    $ rctl numbers create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Number

    EXAMPLES
    $ rctl numbers create
    Creating Number (784) 317-8170... a134487f-a668-4509-9ddd-dcbc98175468
    +

    See code: dist/commands/numbers/create.ts

    +

    rctl numbers delete [REF]

    +

    Deletes a Number

    +
    USAGE
    $ rctl numbers delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Number

    EXAMPLES
    $ rctl numbers delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/numbers/delete.ts

    +

    rctl numbers describe [REF]

    +

    shows details for a Number

    +
    USAGE
    $ rctl numbers describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Number
    +

    See code: dist/commands/numbers/describe.ts

    +

    rctl numbers get [REF]

    +

    Shows a list of paginated Numbers or a single Number if ref is provided

    +
    USAGE
    $ rctl numbers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Numbers or a single Number if ref is provided

    EXAMPLES
    $ rctl numbers get
    Ref Name Telephony URL AOR Link Geo
    a134487f-a668-4509-9ddd-dcbc98175468 (785) 317-8070 +17853178070 sip:1001@sip.local Cameron, USA (US)
    +

    See code: dist/commands/numbers/get.ts

    +

    rctl numbers update REF

    +

    Updates an existing set of Credentials

    +
    USAGE
    $ rctl numbers update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Number

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing set of Credentials

    EXAMPLES
    $ rctl numbers update
    Updating Number (785) 317-8070... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/numbers/update.ts

    +

    rctl peers create

    +

    Creates a new Peer

    +
    USAGE
    $ rctl peers create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Peer

    EXAMPLES
    $ rctl peers create
    Creating Peer Asterisk Conference... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/peers/create.ts

    +

    rctl peers delete [REF]

    +

    Deletes a Peer

    +
    USAGE
    $ rctl peers delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Peer

    EXAMPLES
    $ rctl peers delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/peers/delete.ts

    +

    rctl peers describe [REF]

    +

    shows details for a Peer

    +
    USAGE
    $ rctl peers describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Peer
    +

    See code: dist/commands/peers/describe.ts

    +

    rctl peers get [REF]

    +

    Shows a list of paginated Peers or a single Peer if ref is provided

    +
    USAGE
    $ rctl peers get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Peers or a single Peer if ref is provided

    EXAMPLES
    $ rctl peers get
    Ref Name Username AOR Balancing Algorithm Session Affinity
    6f941c63-880c-419a-a72a-4a107cbaf5c5 Asterisk Conference conference sip:conference@sip.local ROUND_ROBIN Yes
    +

    See code: dist/commands/peers/get.ts

    +

    rctl peers update REF

    +

    Updates an existing Peer

    +
    USAGE
    $ rctl peers update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Peer

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Peer

    EXAMPLES
    $ rctl peers update
    Updating Peer Asterisk Conf... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/peers/update.ts

    +

    rctl plugins

    +

    List installed plugins.

    +
    USAGE
    $ rctl plugins [--core]

    FLAGS
    --core Show core plugins.

    DESCRIPTION
    List installed plugins.

    EXAMPLES
    $ rctl plugins
    +

    See code: @oclif/plugin-plugins

    +

    rctl plugins:install PLUGIN...

    +

    Installs a plugin into the CLI.

    +
    USAGE
    $ rctl plugins:install PLUGIN...

    ARGUMENTS
    PLUGIN Plugin to install.

    FLAGS
    -f, --force Run yarn install with force flag.
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Installs a plugin into the CLI.
    Can be installed from npm or a git url.

    Installation of a user-installed plugin will override a core plugin.

    e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
    will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
    the CLI without the need to patch and update the whole CLI.


    ALIASES
    $ rctl plugins add

    EXAMPLES
    $ rctl plugins:install myplugin

    $ rctl plugins:install https://github.com/someuser/someplugin

    $ rctl plugins:install someuser/someplugin
    +

    rctl plugins:inspect PLUGIN...

    +

    Displays installation properties of a plugin.

    +
    USAGE
    $ rctl plugins:inspect PLUGIN...

    ARGUMENTS
    PLUGIN [default: .] Plugin to inspect.

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    GLOBAL FLAGS
    --json Format output as json.

    DESCRIPTION
    Displays installation properties of a plugin.

    EXAMPLES
    $ rctl plugins:inspect myplugin
    +

    See code: @oclif/plugin-plugins

    +

    rctl plugins:install PLUGIN...

    +

    Installs a plugin into the CLI.

    +
    USAGE
    $ rctl plugins:install PLUGIN...

    ARGUMENTS
    PLUGIN Plugin to install.

    FLAGS
    -f, --force Run yarn install with force flag.
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Installs a plugin into the CLI.
    Can be installed from npm or a git url.

    Installation of a user-installed plugin will override a core plugin.

    e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
    will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
    the CLI without the need to patch and update the whole CLI.


    ALIASES
    $ rctl plugins add

    EXAMPLES
    $ rctl plugins:install myplugin

    $ rctl plugins:install https://github.com/someuser/someplugin

    $ rctl plugins:install someuser/someplugin
    +

    See code: @oclif/plugin-plugins

    + +

    Links a plugin into the CLI for development.

    +
    USAGE
    $ rctl plugins:link PLUGIN

    ARGUMENTS
    PATH [default: .] path to plugin

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Links a plugin into the CLI for development.
    Installation of a linked plugin will override a user-installed or core plugin.

    e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
    command will override the user-installed or core plugin implementation. This is useful for development work.


    EXAMPLES
    $ rctl plugins:link myplugin
    +

    See code: @oclif/plugin-plugins

    +

    rctl plugins:uninstall PLUGIN...

    +

    Removes a plugin from the CLI.

    +
    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove
    +

    rctl plugins:uninstall PLUGIN...

    +

    Removes a plugin from the CLI.

    +
    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove
    +

    See code: @oclif/plugin-plugins

    +

    rctl plugins:uninstall PLUGIN...

    +

    Removes a plugin from the CLI.

    +
    USAGE
    $ rctl plugins:uninstall PLUGIN...

    ARGUMENTS
    PLUGIN plugin to uninstall

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Removes a plugin from the CLI.

    ALIASES
    $ rctl plugins unlink
    $ rctl plugins remove
    +

    rctl plugins update

    +

    Update installed plugins.

    +
    USAGE
    $ rctl plugins update [-h] [-v]

    FLAGS
    -h, --help Show CLI help.
    -v, --verbose

    DESCRIPTION
    Update installed plugins.
    +

    See code: @oclif/plugin-plugins

    +

    rctl trunks create

    +

    Creates a new Trunk

    +
    USAGE
    $ rctl trunks create [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Creates a new Trunk

    EXAMPLES
    $ rctl trunks create
    Creating Trunk T01... b148b4b4-6884-4c06-bb7e-bd098f5fe793
    +

    See code: dist/commands/trunks/create.ts

    +

    rctl trunks delete [REF]

    +

    Deletes a Trunk

    +
    USAGE
    $ rctl trunks delete [REF] [-i] [-c <value>] [-e <value>]

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Deletes a Trunk

    EXAMPLES
    $ rctl trunks delete
    Deleting item 80181ca6-d4aa-4575-9375-8f72b071111... Done
    +

    See code: dist/commands/trunks/delete.ts

    +

    rctl trunks describe [REF]

    +

    shows details for a Trunk

    +
    USAGE
    $ rctl trunks describe [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to the Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    shows details for a Trunk
    +

    See code: dist/commands/trunks/describe.ts

    +

    rctl trunks get [REF]

    +

    Shows a list of paginated Trunks or a single Trunk if ref is provided

    +
    USAGE
    $ rctl trunks get [REF] [-i] [-c <value>] [-e <value>] [-s <value>] [-x]

    ARGUMENTS
    REF optional reference to a Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server
    -s, --size=<value> [default: 50] the number of items to return
    -x, --extended extended output format

    DESCRIPTION
    Shows a list of paginated Trunks or a single Trunk if ref is provided

    EXAMPLES
    $ rctl trunks get
    Ref Name Inbound SIP URI
    8cde8ea9-3c58-4dbe-b2cf-23c4413dd4cc Local sip.t01.provider.net
    +

    See code: dist/commands/trunks/get.ts

    +

    rctl trunks update REF

    +

    Updates an existing Trunk

    +
    USAGE
    $ rctl trunks update [REF] [-i] [-c <value>] [-e <value>]

    ARGUMENTS
    REF reference to an existing Trunk

    FLAGS
    -c, --cacert=<value> path to the CA certificate to verify the server
    -e, --endpoint=<value> [default: localhost:51908] endpoint to connect to the routr server
    -i, --insecure allow insecure connections to the routr server

    DESCRIPTION
    Updates an existing Trunk

    EXAMPLES
    $ rctl trunks update
    Updating Trunk T01... 80181ca6-d4aa-4575-9375-8f72b07d5555
    +

    See code: dist/commands/trunks/update.ts

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/command-line/overview/index.html b/docs/2.11.5/connect/command-line/overview/index.html new file mode 100644 index 000000000..7d2b55cec --- /dev/null +++ b/docs/2.11.5/connect/command-line/overview/index.html @@ -0,0 +1,24 @@ + + + + + +Overview | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Overview

    +

    The command-line tool contains all commands you will need to manage your Routr Connect server.

    +

    To install Routr with npm, you will need to run the following command:

    +
    npm install --location=global @routr/ctl
    +

    Most commands follow a CRUD pattern. For example, to manage your Agents you can use create, delete, describe, and get. Also, most commands follow the {substantive} {verb} pattern. For example, "rctl agents get" will return a list of agents.

    +

    Please see the following sections for more information on each command.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/concepts/index.html b/docs/2.11.5/connect/concepts/index.html new file mode 100644 index 000000000..1e91d3f33 --- /dev/null +++ b/docs/2.11.5/connect/concepts/index.html @@ -0,0 +1,49 @@ + + + + + +Concepts | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Concepts

    +

    The Connect Mode is Routr's implementation of the SIPConnect standard. Routr introduces the Connect Processor and five routing types as part of the implementation.

    +

    The Connect Mode introduces the Connect Processor, a built-in Processor with the necessary logic to implement the "SIP Connect v1.1" specification.

    +

    The following routing types are supported:

    +

    Agent-to-Agent

    +

    The agent-to-agent routing type allows an Agent to call another Agent in the same Domain. The following yaml configuration shows a simple setup involving one Domain and two Agents:

    +

    Domain configuration

    +
    - apiVersion: v2beta1
    kind: Domain
    ref: domain-01
    metadata:
    name: Local Domain
    spec:
    context:
    domainUri: sip.local
    +

    Agents configuration

    +
    - apiVersion: v2beta1
    kind: Agent
    ref: agent-01
    metadata:
    name: John Doe
    spec:
    username: "1001"
    domainRef: domain-01
    credentialsRef: credentials-01

    - apiVersion: v2beta1
    kind: Agent
    ref: agent-02
    metadata:
    name: Jane Doe
    spec:
    username: "1002"
    domainRef: domain-01
    credentialsRef: credentials-02
    +

    With the configuration above, John and Jane can call each other using their usernames.

    +
    +

    Here, we are showing the yaml representation of the resources for illustration purposes. However, we typically use the CTL or the SDK to create resources.

    +
    +

    Agent-to-PSTN

    +

    In the Connect Mode, the agent-to-pstn routing type allows an Agent to call numbers in the Private Switch Telephone Network (PSTN) using a Number and Trunking.

    +

    The egressPolicies section of the Domain resource handles the routing. The examples below show how these resources relate to each other.

    +

    Domain configuration

    +
    - apiVersion: v2beta1
    kind: Domain
    ref: domain-01
    metadata:
    name: Local Domain
    spec:
    accessControlListRef: acl-01
    context:
    domainUri: sip.local
    egressPolicies:
    - rule: ".*"
    numberRef: number-01
    +

    Number configuration

    +
    - apiVersion: v2beta1
    kind: Number
    ref: number-01
    metadata:
    name: "(910)343-4434"
    geoInfo:
    city: Durham, NC
    country: USA
    countryIsoCode: US
    spec:
    trunkRef: trunk-01
    location:
    telUrl: tel:+19103434434
    +

    With the previous configuration, any Agent in the Domain can call the PSTN using the Number (910)343-4434.

    +

    From-PSTN

    +

    The from-pstn routing type outlines how a call from the PSTN connects to an Agent or a Peer using a Number and Trunking. The location section of the Number resource manages this routing. For instance, to route calls from the PSTN to an Agent, you can use the following configuration:

    +
    - apiVersion: v2beta1
    kind: Number
    ref: number-01
    metadata:
    name: "(910)343-4434"
    geoInfo:
    city: Durham, NC
    country: USA
    countryIsoCode: US
    spec:
    trunkRef: trunk-01
    location:
    telUrl: tel:+19103434434
    aorLink: sip:john@sip.local
    +

    You can apply the same configuration to route calls from the PSTN to a Peer. For instance, to direct calls from the PSTN to an Asterisk server, you can adopt this configuration, provided the endpoint is registered with Routr.

    +

    Peer-to-PSTN

    +

    The peer-to-pstn routing type describes how a Peer such as Asterisk can reach the PSTN. Unlike agent-to-pstn, this routing is not bound to a Domain. Because Peers are trusted entities, they can call the PSTN using the Trunking resource. This routing type is automatically selected when the number dialed by the Peer is not in the location table.

    +

    Agent-to-Peer

    +

    This routing type allows any Agent to call a Peer. Because the Agent is going "outside" of the Domain's boundaries, the Agent must have a valid JWT token in the X-Connect-Token header. Incidentally, required claims in the JWT token include fields similar to the Agent resource. Here is an example of the payload of a JWT token:

    +
    {
    "ref": "agent-01",
    "domainRef": "domain-01",
    "aor": "sip:1001@sip.local",
    "aorLink": "sip:asterisk@default",
    "domain": "sip.local",
    "privacy": "NONE",
    "allowedMethods": ["INVITE", "REGISTER"]
    }
    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/home-or-office-setup/index.html b/docs/2.11.5/connect/home-or-office-setup/index.html new file mode 100644 index 000000000..2d318d937 --- /dev/null +++ b/docs/2.11.5/connect/home-or-office-setup/index.html @@ -0,0 +1,20 @@ + + + + + +Home or Office Setup | Routr Docs + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/2.11.5/connect/introduction/index.html b/docs/2.11.5/connect/introduction/index.html new file mode 100644 index 000000000..f8fa1e4b7 --- /dev/null +++ b/docs/2.11.5/connect/introduction/index.html @@ -0,0 +1,30 @@ + + + + + +Introduction | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Introduction

    +

    The Connect Mode, sometimes called Routr Connect, is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing in terms of Agents, Peers, Trunks, Numbers, Credentials, and ACL. It is the most common way to deploy Routr.

    +

    In this mode, all the various components of the system are orchestrated for you by either Docker Compose or Kubernetes. The Connect Mode is the most common way to deploy Routr.

    +

    Some of the use cases for the Connect Mode are:

    +
      +
    • Power your office or home phone system
    • +
    • Create an Intercom network
    • +
    • Power a SIP network on a CPaaS
    • +
    • Connect your phone system to the PSTN
    • +
    • Connect your phone system to Microsoft Teams (coming soon)
    • +
    • Connect your phone system to AWS Chime (coming soon)
    • +
    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/nodesdk/overview/index.html b/docs/2.11.5/connect/nodesdk/overview/index.html new file mode 100644 index 000000000..a3bcc1de1 --- /dev/null +++ b/docs/2.11.5/connect/nodesdk/overview/index.html @@ -0,0 +1,37 @@ + + + + + +Overview | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Overview

    +

    Node.js SDK is a library that you can use to manage your Routr Connect server. It is available as an npm package that allows you to create, read, update, and delete (CRUD) resources in your server.

    +

    This tool serves as an important component of the Routr Connect server. It is used by the command-line tool to manage your server and the Routr Connect API to manage the server.

    +

    The following example demonstrates how you can use the Node.js SDK to create a new Domain.

    +

    To begin using the Node.js SDK, first make sure you have Node and NPM installed. Then, start by creating a new project and installing the Routr Connect SDK.

    +

    Let’s begin by creating a new project:

    +
    mkdir my-project 
    cd my-project
    npm init -y
    +

    The previous command will create a new directory called "my-project" and initialize a new npm project using the default settings. +Next, install the SDK width:

    +
    npm install --save @routr/sdk
    +

    The --save flag will add the SDK as a dependency to your project. Now, create a new file called index.js and add the following code:

    +

    Filename: index.js

    +
    const SDK = require("@routr/sdk");
    const domains = new SDK.Domains();

    const request = {
    name: "Local domain",
    domainUri: "sip.local",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    egressPolicies: [{
    rule: ".*",
    numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }],
    extended: { "key": "value" }
    };

    domains.createDomain(request)
    .then(console.log)
    .catch(console.error); // an error occurred
    +

    In the example above, we assume that the ACL and Number already exist. However, if you need to create those resources, you can use the SDK to do so or use the command-line tool.

    +

    The extended field is available for you to add custom fields to your resources. This is useful when you want to add metadata to your resources (e.g., an external ID)

    +

    Now, go ahead and run the code:

    +
    node index.js
    +

    If everything executed properly, you should now have a new Domain created in your Routr Connect server. This is just a simple example of how to use the Node.js SDK. For complete documentation, please visit the npm page for @routr/sdk at https://www.npmjs.com/package/@routr/sdk.

    +

    Also, If you prefer using a different language, you can use the gRPC API directly by leveraging the proto files available at https://github.com/fonoster/routr/tree/main/mods/common/src/connect/protos.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/nodesdk/sdk/index.html b/docs/2.11.5/connect/nodesdk/sdk/index.html new file mode 100644 index 000000000..f2f98efc8 --- /dev/null +++ b/docs/2.11.5/connect/nodesdk/sdk/index.html @@ -0,0 +1,511 @@ + + + + + +SDK | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    SDK

    + +

    Installation

    +
    $ npm install --save @routr/sdk
    +

    APIs

    + + +

    ACL ⇐ APIClient

    +

    Use Routr ACL, a capability of Routr SIP Proxy, to create, update, get +and delete Access Control Lists. The ACL API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new ACL(options)

    +

    Constructs a new ACL API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const acl = new SDK.ACL()

    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acL.createACL(request) ⇒ Promise.<CreateACLResponse>

    +

    Creates a new AccessControlList on Routr.

    +

    Kind: instance method of ACL
    +Returns: Promise.<CreateACLResponse> - The newly created AccessControlList
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateACLRequestThe request to create an ACL
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Peer network",
    allow: "27.116.56.0/22",
    deny: "0.0.0.0/0"
    }

    acl.createACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acL.updateACL(request) ⇒ Promise.<UpdateACLResponse>

    +

    Updates an already existing AccessControlList on Routr.

    +

    Kind: instance method of ACL
    +Returns: Promise.<UpdateACLResponse> - The AccessControlList

    +
    ParamTypeDescription
    requestUpdateACLRequestPartial with the fields to update
    request.namestringName of the ACL
    request.allowArray.<string>List of IP addresses or CIDR blocks to allow
    request.denyArray.<string>List of IP addresses or CIDR blocks to deny
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Peer network updated",
    }

    acl.updateACL(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acL.getACL(ref) ⇒ Promise.<GetACLResponse>

    +

    Gets an AccessControlList from Routr.

    +

    Kind: instance method of ACL
    +Returns: Promise.<GetACLResponse> - The AccessControlList

    +
    ParamTypeDescription
    refstringThe ACL reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.getACL(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acL.deleteACL(ref) ⇒ Promise.<void>

    +

    Deletes an AccessControlList from Routr.

    +

    Kind: instance method of ACL

    +
    ParamTypeDescription
    refstringThe ACL reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    acl.deleteACL(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    acL.listACLs(request) ⇒ Promise.<ListACLResponse>

    +

    Lists all AccessControlLists from Routr with pagination.

    +

    Kind: instance method of ACL
    +Returns: Promise.<ListACLResponse> - The list of AccessControlLists

    +
    ParamTypeDescription
    requestListACLRequestThe request to list ACLs
    request.pageSizenumberThe number of ACLs to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    acl.listACLs(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Agents ⇐ APIClient

    +

    Use Routr Agents, a capability of Routr SIP Proxy, to create, update, get +and delete Agents. The Agents API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Agents(options)

    +

    Constructs a new Agent API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const agents = new SDK.Agents()

    const request = {
    name: "Jonh Doe",
    username: "jdoe",
    privacy: Privacy.PRIVATE,
    domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    agents.createAgent(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    agents.createAgent(request) ⇒ Promise.<CreateAgentResponse>

    +

    Creates a new Agent on Routr.

    +

    Kind: instance method of Agents
    +Returns: Promise.<CreateAgentResponse> - The newly created Agent
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateAgentRequestThe request to create an Agent
    request.namestringName of the Agent
    request.usernamestringUsername of the Agent
    request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
    request.domainRefstringDomain reference of the Domain the Agent belongs to
    request.credentialsRefstringCredentials reference of the Credentials for the Agent
    request.enabledbooleanWhether the Agent is enabled or not (for future use)
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Jonh Doe",
    username: "jdoe",
    privacy: Privacy.PRIVATE,
    domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    agents.createAgent(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    agents.updateAgent(request) ⇒ Promise.<UpdateAgentResponse>

    +

    Updates an already existing Agent on Routr.

    +

    Kind: instance method of Agents
    +Returns: Promise.<UpdateAgentResponse> - The updated Agent

    +
    ParamTypeDescription
    requestUpdateAgentRequestPartial with the fields to update
    request.namestringName of the Agent
    request.privacyPrivacyPrivacy of the Agent (e.g., Privacy.PRIVATE)
    request.domainRefstringDomain reference of the Domain the Agent belongs to
    request.credentialsRefstringCredentials reference of the Credentials for the Agent
    request.enabledbooleanWhether the Agent is enabled or not (for future use)
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "John D Doe",
    enabled: false
    }

    agents.updateAgent(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    agents.getAgent(ref) ⇒ Promise.<GetAgentResponse>

    +

    Gets an Agent from Routr.

    +

    Kind: instance method of Agents
    +Returns: Promise.<GetAgentResponse> - The Agent

    +
    ParamTypeDescription
    refstringThe Agent's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    agents.getAgent(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    agents.deleteAgent(ref) ⇒ Promise.<void>

    +

    Deletes an Agent from Routr.

    +

    Kind: instance method of Agents

    +
    ParamTypeDescription
    refstringThe Agent's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    agents.deleteAgent(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    agents.listAgents(request) ⇒ Promise.<ListAgentResponse>

    +

    Lists all Agents from Routr with pagination.

    +

    Kind: instance method of Agents
    +Returns: Promise.<ListAgentResponse> - The list of Agents in the current page

    +
    ParamTypeDescription
    requestListAgentRequestThe request to list Agents
    request.pageSizenumberThe number of Agents to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    agents.listAgents(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Credentials ⇐ APIClient

    +

    Use Routr Credentials, a capability of Routr SIP Proxy, to create, update, get +and delete Credentials. The Credentials API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Credentials(options)

    +

    Constructs a new Credentials API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const credentials = new SDK.Credentials()

    const request = {
    name: "Credentials for John Doe",
    username: "jdoe",
    password: "123456",
    extended: {
    "key": "value"
    }
    }

    credentials.createCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    credentials.createCredentials(request) ⇒ Promise.<CreateCredentialsResponse>

    +

    Creates a new Credentials on Routr.

    +

    Kind: instance method of Credentials
    +Returns: Promise.<CreateCredentialsResponse> - The newly created Credentials
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateCredentialsRequestThe request to create an Credentials
    request.namestringThe friendly name of the Credentials
    request.usernamestringUsername of the Credentials
    request.passwordstringPassword of the Credentials
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Credentials for John Doe",
    username: "jdoe",
    password: "123456",
    extended: {
    "key": "value"
    }
    }

    credentials.createCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    credentials.updateCredentials(request) ⇒ Promise.<UpdateCredentialsResponse>

    +

    Updates an already existing Credentials on Routr.

    +

    Kind: instance method of Credentials
    +Returns: Promise.<UpdateCredentialsResponse> - The updated Credentials

    +
    ParamTypeDescription
    requestUpdateCredentialsRequestPartial with the fields to update
    request.namestringThe friendly name of the Credentials
    request.usernamestringUsername of the Credentials
    request.passwordstringPassword of the Credentials
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "John Doe's Credentials"
    }

    credentials.updateCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    credentials.getCredentials(ref) ⇒ Promise.<GetCredentialsResponse>

    +

    Gets an Credentials from Routr.

    +

    Kind: instance method of Credentials
    +Returns: Promise.<GetCredentialsResponse> - The Credentials

    +
    ParamTypeDescription
    refstringThe Credentials's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    credentials.getCredentials(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    credentials.deleteCredentials(ref) ⇒ Promise.<void>

    +

    Deletes an Credentials from Routr.

    +

    Kind: instance method of Credentials

    +
    ParamTypeDescription
    refstringThe Credentials's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    credentials.deleteCredentials(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    credentials.listCredentials(request) ⇒ Promise.<ListCredentialsResponse>

    +

    Lists all Credentials from Routr with pagination.

    +

    Kind: instance method of Credentials
    +Returns: Promise.<ListCredentialsResponse> - The list of Credentials in the current page

    +
    ParamTypeDescription
    requestListCredentialsRequestThe request to list Credentials
    request.pageSizenumberThe number of Credentials to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    credentials.listCredentials(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Domains ⇐ APIClient

    +

    Use Routr Domains, a capability of Routr SIP Proxy, to create, update, get +and delete Domains. The Domains API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Domains(options)

    +

    Constructs a new Domain API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const domains = new SDK.Domains()

    const request = {
    name: "Local domain",
    domainUri: "sip.local",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    egressPolicies: [{
    rule: ".*",
    numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }],
    extended: {
    "key": "value"
    }
    }

    domains.createDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    domains.createDomain(request) ⇒ Promise.<CreateDomainResponse>

    +

    Creates a new Domain on Routr.

    +

    Kind: instance method of Domains
    +Returns: Promise.<CreateDomainResponse> - The newly created Domain
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateDomainRequestThe request to create an Domain
    request.namestringName of the Domain
    request.domainUristringThe FQDN of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Local domain",
    domainUri: "sip.local",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    egressPolicies: [{
    rule: ".*",
    numberRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }],
    extended: {
    "key": "value"
    }
    }

    domains.createDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    domains.updateDomain(request) ⇒ Promise.<UpdateDomainResponse>

    +

    Updates an already existing Domain on Routr.

    +

    Kind: instance method of Domains
    +Returns: Promise.<UpdateDomainResponse> - The updated Domain

    +
    ParamTypeDescription
    requestUpdateDomainRequestPartial with the fields to update
    request.namestringName of the Domain
    request.accessControlListRefstringThe reference to the AccessControlList for the Domain
    request.egressPoliciesArray.<CC.EgressPolicy>The list of EgressPolicies for the Domain
    request.extendedstringOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Local domain updated",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"
    }

    domains.updateDomain(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    domains.getDomain(ref) ⇒ Promise.<GetDomainResponse>

    +

    Gets a Domain from Routr.

    +

    Kind: instance method of Domains
    +Returns: Promise.<GetDomainResponse> - The Domain

    +
    ParamTypeDescription
    refstringThe Domain's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    domains.getDomain(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    domains.deleteDomain(ref) ⇒ Promise.<void>

    +

    Deletes a Domain from Routr.

    +

    Kind: instance method of Domains

    +
    ParamTypeDescription
    refstringThe Domain's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    domains.deleteDomain(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    domains.listDomains(request) ⇒ Promise.<ListDomainResponse>

    +

    Lists all Domains from Routr with pagination.

    +

    Kind: instance method of Domains
    +Returns: Promise.<ListDomainResponse> - The list of Domains

    +
    ParamTypeDescription
    requestListDomainRequestThe request to list Domains
    request.pageSizenumberThe number of Domains to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    domains.listDomains(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Numbers ⇐ APIClient

    +

    Use Routr Numbers, a capability of Routr SIP Proxy, to create, update, get +and delete Numbers. The Number API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Numbers(options)

    +

    Constructs a new Number API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const numbers = new SDK.Numbers()

    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryISOCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    numbers.createNumber(request) ⇒ Promise.<CreateNumberResponse>

    +

    Creates a new Number on Routr.

    +

    Kind: instance method of Numbers
    +Returns: Promise.<CreateNumberResponse> - The newly created Number
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateNumberRequestThe request to create an Number
    request.namestringName of the Number
    request.telUrlstringThe number URI to be used (e.g., te:+1234567890)
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.citystringThe city where the number is located
    request.countrystringThe country where the number is located
    request.countryISOCodestringThe country ISO code where the number is located
    request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes
    +

    Example

    +
    const request = {
    name: "(415) 555-1212",
    telUrl: "teL:+14155551212",
    trunkRef: "6f941c63-880c-419a-a72a-4a107cbaf5c5",
    aorLink: "sip:100@sip.local",
    city: "San Francisco",
    country: "United States",
    countryISOCode: "US",
    sessionAffinityHeader: "X-Room-Id"
    extraHeaders: [{
    name: "X-Room-Id",
    value: "abc-us-123"
    }],
    extended: {
    "key": "value"
    }
    }

    numbers.createNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    numbers.updateNumber(request) ⇒ Promise.<UpdateNumberResponse>

    +

    Updates an already existing Number on Routr.

    +

    Kind: instance method of Numbers
    +Returns: Promise.<UpdateNumberResponse> - The updated Number

    +
    ParamTypeDescription
    requestUpdateNumberRequestPartial with the fields to update
    request.namestringName of the Number
    request.aorLinkstringThe AOR link to be used (e.g., sip:1001@sip.local)
    request.extraHeadersArray.<Object>Extra headers to be used (e.g., [{name: "X-Room-Id", value: "abc-us-123"}])
    request.trunkRefstringThe Trunk reference to be used
    request.sessionAffinityHeaderstringOptional session affinity header
    request.extendedstringOptional extended attributes
    +

    Example

    +
    const request = {
    name: "(415) 555-1212 (friendly name)",
    aorLink: "sip:2001@sip.local"
    }

    numbers.updateNumber(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    numbers.getNumber(ref) ⇒ Promise.<GetNumberResponse>

    +

    Gets a Number from Routr.

    +

    Kind: instance method of Numbers
    +Returns: Promise.<GetNumberResponse> - The Number

    +
    ParamTypeDescription
    refstringThe Number's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    numbers.getNumber(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    numbers.deleteNumber(ref) ⇒ Promise.<void>

    +

    Deletes a Number from Routr.

    +

    Kind: instance method of Numbers

    +
    ParamTypeDescription
    refstringThe Number's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    numbers.deleteNumber(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    numbers.listNumbers(request) ⇒ Promise.<ListNumberResponse>

    +

    Lists all Numbers from Routr with pagination.

    +

    Kind: instance method of Numbers
    +Returns: Promise.<ListNumberResponse> - The list of Numbers

    +
    ParamTypeDescription
    requestListNumberRequestThe request to list Numbers
    request.pageSizenumberThe number of Numbers to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    numbers.listNumbers(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Peers ⇐ APIClient

    +

    Use Routr Peers, a capability of Routr SIP Proxy, to create, update, get +and delete Peers. The Peers API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Peers(options)

    +

    Constructs a new Peer API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const peers = new SDK.Peers()

    const request = {
    name: "Asterisk Conference Server",
    username: "conference",
    aor: "sip:conference@sip.local",
    contactAddr: "10.0.0.1:5060",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
    withSessionAffinity: true,
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    peers.createPeer(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    peers.createPeer(request) ⇒ Promise.<CreatePeerResponse>

    +

    Creates a new Peer on Routr.

    +

    Kind: instance method of Peers
    +Returns: Promise.<CreatePeerResponse> - The newly created Peer
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreatePeerRequestThe request to create an Peer
    request.namestringName of the Peer
    request.aorstringAddress of Record of the Peer
    request.contactAddrstringOptional contact address of the Peer
    request.accessControlListRefstringAccess Control List reference of the Peer
    request.credentialsRefstringCredentials reference of the Credentials for the Peer
    request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
    request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
    request.enabledbooleanWhether the Peer is enabled or not (for future use)
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    name: "Asterisk Conference Server",
    username: "conference",
    aor: "sip:conference@sip.local",
    contactAddr: "10.0.0.1:5060",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    balancingAlgorithm: LoadBalancingAlgorithm.LEAST_SESSIONS,
    withSessionAffinity: true,
    enabled: true,
    extended: {
    "key": "value"
    }
    }

    peers.createPeer(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    peers.updatePeer(request) ⇒ Promise.<UpdatePeerResponse>

    +

    Updates an already existing Peer on Routr.

    +

    Kind: instance method of Peers
    +Returns: Promise.<UpdatePeerResponse> - The updated Peer

    +
    ParamTypeDescription
    requestUpdatePeerRequestPartial with the fields to update
    request.namestringName of the Peer
    request.aorstringAddress of Record of the Peer
    request.contactAddrstringOptional contact address of the Peer
    request.accessControlListRefstringAccess Control List reference of the Peer
    request.credentialsRefstringCredentials reference of the Credentials for the Peer
    request.balancingAlgorithmLoadBalancingAlgorithmOptional balancing algorithm for the Peer (defaults to "round-robin")
    request.withSessionAffinitybooleanWhether the Peer has session affinity or not (defaults to false)
    request.enabledbooleanWhether the Peer is enabled or not (for future use)
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Feature Server"
    }

    peers.updatePeer(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    peers.getPeer(ref) ⇒ Promise.<GetPeerResponse>

    +

    Gets an Peer from Routr.

    +

    Kind: instance method of Peers
    +Returns: Promise.<GetPeerResponse> - The Peer

    +
    ParamTypeDescription
    refstringThe Peer's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    peers.getPeer(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    peers.deletePeer(ref) ⇒ Promise.<void>

    +

    Deletes an Peer from Routr.

    +

    Kind: instance method of Peers

    +
    ParamTypeDescription
    refstringThe Peer's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    peers.deletePeer(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    peers.listPeers(request) ⇒ Promise.<ListPeerResponse>

    +

    Lists all Peers from Routr with pagination.

    +

    Kind: instance method of Peers
    +Returns: Promise.<ListPeerResponse> - The list of Peers in the current page

    +
    ParamTypeDescription
    requestListPeerRequestThe request to list Peers
    request.pageSizenumberThe number of Peers to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    peers.listPeers(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    Trunks ⇐ APIClient

    +

    Use Routr Trunks, a capability of Routr SIP Proxy, to create, update, get +and delete Trunks. The Trunks API requires of a running Routr deployment.

    +

    Kind: global class
    +Extends: APIClient
    +See: module:core:APIClient

    + + +

    new Trunks(options)

    +

    Constructs a new Trunk API object.

    +
    ParamTypeDescription
    optionsClientOptionsOptions to indicate the objects endpoint
    +

    Example

    +
    const SDK = require("@routr/sdk")
    const trunks = new SDK.Trunks()

    const request = {
    name: "Trunk from Twilio",
    inboundUri: "sip:twilio.sip.acme.io",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    uris: [{
    host: "acme.sip.twilio.com",
    port: 5060,
    transport: "udp",
    user: "AC1234567890",
    weight: 1,
    priority: 1
    }],
    extended: {
    "key": "value"
    }
    }

    trunks.createTrunk(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    trunks.createTrunk(request) ⇒ Promise.<CreateTrunkResponse>

    +

    Creates a new Trunk on Routr.

    +

    Kind: instance method of Trunks
    +Returns: Promise.<CreateTrunkResponse> - The newly created Trunk
    +Throws:

    +
      +
    • if request is null
    • +
    +
    ParamTypeDescription
    requestCreateTrunkRequestThe request to create an Trunk
    request.namestringName of the Trunk
    request.inboundUristringInbound URI of the Trunk
    request.accessControlListRefstringAccess Control List reference
    request.inboundCredentialsRefstringThe reference of the inbound credentials
    request.outboundCredentialsRefstringThe reference of the outbound credentials
    request.urisArray.<TrunkURI>The outbound URIs of the Trunk
    +

    Example

    +
    const request = {
    name: "Trunk from Twilio",
    inboundUri: "sip:twilio.sip.acme.io",
    accessControlListRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    inboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    outboundCredentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    uris: [{
    host: "acme.sip.twilio.com",
    port: 5060,
    transport: "udp",
    user: "AC1234567890",
    weight: 1,
    priority: 1
    }],
    extended: {
    "key": "value"
    }
    }

    trunks.createTrunk(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    trunks.updateTrunk(request) ⇒ Promise.<UpdateTrunkResponse>

    +

    Updates an already existing Trunk on Routr.

    +

    Kind: instance method of Trunks
    +Returns: Promise.<UpdateTrunkResponse> - The updated Trunk

    +
    ParamTypeDescription
    requestUpdateTrunkRequestPartial with the fields to update
    request.namestringName of the Trunk
    request.inboundUristringInbound URI of the Trunk
    request.accessControlListRefstringAccess Control List reference
    request.inboundCredentialsRefstringThe reference of the inbound credentials
    request.outboundCredentialsRefstringThe reference of the outbound credentials
    request.urisArray.<TrunkURI>The outbound URIs of the Trunk
    request.extendedObjectOptional extended attributes
    +

    Example

    +
    const request = {
    ref: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    name: "Trunk from Twilio (US-East)",
    }

    trunks.updateTrunk(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    trunks.getTrunk(ref) ⇒ Promise.<GetTrunkResponse>

    +

    Gets an Trunk from Routr.

    +

    Kind: instance method of Trunks
    +Returns: Promise.<GetTrunkResponse> - The Trunk

    +
    ParamTypeDescription
    refstringThe Trunk's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    trunks.getTrunk(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    trunks.deleteTrunk(ref) ⇒ Promise.<void>

    +

    Deletes an Trunk from Routr.

    +

    Kind: instance method of Trunks

    +
    ParamTypeDescription
    refstringThe Trunk's reference
    +

    Example

    +
    const ref = "4671371b-ff5d-48b1-aabe-d3c5ca5317a3"

    trunks.deleteTrunk(ref)
    .then(console.log)
    .catch(console.error) // an error occurred
    + +

    trunks.listTrunks(request) ⇒ Promise.<ListTrunkResponse>

    +

    Lists all Trunks from Routr with pagination.

    +

    Kind: instance method of Trunks
    +Returns: Promise.<ListTrunkResponse> - The list of Trunks in the current page

    +
    ParamTypeDescription
    requestListTrunkRequestThe request to list Trunks
    request.pageSizenumberThe number of Trunks to return
    request.pageTokenstringThe page token to use for pagination
    +

    Example

    +
    const request = {
    pageSize: 10
    }

    trunks.listTrunks(request)
    .then(console.log)
    .catch(console.error) // an error occurred
    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/quick-start/docker/index.html b/docs/2.11.5/connect/quick-start/docker/index.html new file mode 100644 index 000000000..88ff8c4d1 --- /dev/null +++ b/docs/2.11.5/connect/quick-start/docker/index.html @@ -0,0 +1,38 @@ + + + + + +Docker installation | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Docker installation

    +

    First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

    +

    Filename: compose.yaml

    +
    version: "3"

    services:

    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    ports:
    - 51908:51908
    - 5060:5060/udp

    volumes:
    shared:
    +

    Then, start the server with:

    +
    # Be sure to replace with your IP address
    DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up
    +

    Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

    +
    docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'
    +

    You should see a containers with its status. Your output should look like the one below:

    +
    CONTAINER ID  IMAGE                                     STATUS
    6c63fd573768 fonoster/routr-one:latest Up About a minute
    +

    If the status of your service is "Up," you are ready to go.

    +

    Finally, install the command-line tool and start building your SIP Network.

    +

    You can install the tool with npm as follows:

    +
    npm install --location=global @routr/ctl
    +

    And here is an example of creating a SIP Domain:

    +
    rctl domains create --insecure
    +
    +

    The --insecure flag is required as we did not set up the TLS settings.

    +
    +

    For additional examples, refer to the command line documentation.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/quick-start/kubernetes/index.html b/docs/2.11.5/connect/quick-start/kubernetes/index.html new file mode 100644 index 000000000..036e386fd --- /dev/null +++ b/docs/2.11.5/connect/quick-start/kubernetes/index.html @@ -0,0 +1,34 @@ + + + + + +Installing in Kubernetes | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Installing in Kubernetes

    +

    Routr can be installed in Kubernetes using Helm. The following instructions assume that you have a Kubernetes cluster up and running.

    +
    +

    You can use Minikube or Docker Desktop to create a local Kubernetes cluster.

    +
    +

    First, add the Helm repository:

    +
    helm repo add routr https://routr.io/charts
    helm repo update
    +

    Then, create a namespace for Routr:

    +
    kubectl create namespace sipnet
    +

    Next, install Routr with the following command:

    +
    helm install sipnet routr/routr-connect --namespace sipnet
    +

    Finally, wait a few minutes for the pods to start. You can check the status of the pods with the following command:

    +
    kubectl get pods -n sipnet
    +

    You should see a list of pods and their status. If the status is Running, then you are ready to go.

    +

    For more details, please refer to the chart's README.

    +

    Please see the Command-Line Tools section for detauls on how to interact with Routr Connect via the CLI.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/securing-the-server/index.html b/docs/2.11.5/connect/securing-the-server/index.html new file mode 100644 index 000000000..567adb552 --- /dev/null +++ b/docs/2.11.5/connect/securing-the-server/index.html @@ -0,0 +1,20 @@ + + + + + +Securing the Server | Routr Docs + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/2.11.5/connect/sending-call-events-to-nats/index.html b/docs/2.11.5/connect/sending-call-events-to-nats/index.html new file mode 100644 index 000000000..5a5e478cf --- /dev/null +++ b/docs/2.11.5/connect/sending-call-events-to-nats/index.html @@ -0,0 +1,66 @@ + + + + + +Sending Call Events to NATS | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Sending Call Events to NATS

    +

    Routr ships with a NATS publisher that can be used to send call events to a NATS server. Call events are a function of the EdgePort. To enable the NATS publisher, you will need to update your EdgePort service to set the environment variable NATS_PUBLISHER_ENABLED to true as well as the environment variable NATS_PUBLISHER_URL to the URL of your NATS server. For example:

    +
    version: "3"
    services:
    routr:
    image: fonoster/routr-one:latest
    ports:
    - 51908:51908
    - 5060:5060/udp
    environment:
    - NATS_PUBLISHER_ENABLED=true
    - NATS_PUBLISHER_URL=nats:4222
    +

    Once you have enabled the NATS publisher, you can subscribe to the routr.call.started or routr.call.ended subjects to receive call events. +As of the writing of this book, only the routr.call.started and routr.call.ended subjects are supported. However, we plan to add more subjects in the future. Be sure to check in later to see if any more have been added.

    +

    To begin receiving call events, you can use the nats sub command line tool. To do this, first connect to your NATS server by running the following command:

    +
    nats context add nats \
    --server demo.nats.io:4222 \
    --description "nats events" \
    --select
    +

    You should then see something like this:

    +

    NATS context add

    +

    In the previous command, we connected to the demo.nats.io server, which is a public NATS server. You can use your own NATS server if you have one.

    +

    Then, you can subscribe to the routr.call.started subject by running the following command:

    +
    nats sub routr.call.started
    +

    The routr.call.started event contains the following fields:

    +
      +
    • callId: The unique identifier of the call
    • +
    • from: The caller's phone number
    • +
    • to: The callee's phone number
    • +
    • startTime: The time the call started formatted as an ISO 8601 string
    • +
    • extraHeaders: Any extra headers that were sent with the call
    • +
    +

    Every header startarting with X- is considered an extra header. For example, if you send a call with the following headers:

    +
    X-My-Header: my-value
    X-Another-Header: another-value
    +

    Then, the extraHeaders field will contain the following:

    +
    {
    "X-My-Header": "my-value",
    "X-Another-Header": "another-value"
    }
    +

    After subscribing to the subject and making a call, you should see something like this:

    +

    NATS call started

    +

    Similarly, you can subscribe to the routr.call.ended subject to receive call-ended events.

    +
    nats sub routr.call.ended
    +

    The routr.call.ended event contains the following fields:

    +
      +
    • callId: The unique identifier of the call
    • +
    • endTime: The time the call ended formatted as an ISO 8601 string
    • +
    • hangupCause: The reason the call ended
    • +
    • extraHeaders: Any extra headers that were sent with the call
    • +
    +
    +

    Please see the HangupCause.java class for a list of possible hangup causes.

    +
    +

    Lastly, you can subscribe to the routr.endpoint.registered subject to receive endpoint registered events.

    +
    nats sub routr.endpoint.registered
    +

    The routr.endpoint.registered event contains the following fields:

    +
      +
    • aor: The address of record of the endpoint
    • +
    • registeredAt: The time the endpoint registered formatted as an ISO 8601 string
    • +
    • expires: The time in seconds the endpoint will remain registered
    • +
    • extraHeaders: Any extra headers that were sent with the call
    • +
    +

    You can use the NATS_PUBLISHER_SUBJECT environment variable to change the based subject name. For example, you can set it to myserver to receive call events in the myserver.calls.started subject.

    + + \ No newline at end of file diff --git a/docs/2.11.5/connect/webrtc-support/index.html b/docs/2.11.5/connect/webrtc-support/index.html new file mode 100644 index 000000000..e831045d8 --- /dev/null +++ b/docs/2.11.5/connect/webrtc-support/index.html @@ -0,0 +1,27 @@ + + + + + +WebRTC Support | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    WebRTC Support

    +

    The Connect Processor supports interoperability with WebRTC clients. This means that you can use any SIP client that also supports WebRTC to make and receive calls, such as with the JavaScript libraries SIP.js and JsSIP for example. However, because WebRTC mandates the use of specific codecs, transport protocols, and a certain version of RTP that might differ from those used by legacy SIP clients, you will need to make additional configuration changes to your server.

    +

    Let’s say you want to use SIP.js to make and receive calls. In that case, you will need to add a RTPRelay component to your setup. The RTPRelay component is a Routr middleware that takes control of an RTPengine instance for media relay between WebRTC and legacy SIP clients.

    +

    Note that this is only needed if you are using a mix of WebRTC and legacy SIP clients. If you are exclusively using WebRTC clients, then you can skip this step.

    +

    To enable WebRTC interoperability, you will need to update your compose.yaml file to include the RTPENGINE_HOST environment variable. Here is an example:

    +
    version: "3"

    services:

    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    RTPENGINE_HOST: ${RTPE_HOST}
    ports:
    - 51908:51908
    - 5060:5060/udp

    -- snip --
    +

    If using Helm, you will need to add the following configuration to your values.yaml file:

    +
    rtprelay:
    enabled: true
    rtpeHost: /* rtpengine */
    rtpPort: 22222
    +

    Keep in mind that this configuration will only work if you have an instance of RTPengine running somewhere.

    + + \ No newline at end of file diff --git a/docs/2.11.5/contributing/index.html b/docs/2.11.5/contributing/index.html new file mode 100644 index 000000000..9d35e3218 --- /dev/null +++ b/docs/2.11.5/contributing/index.html @@ -0,0 +1,105 @@ + + + + + +Contributing Guide | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Contributing Guide

    + +

    Welcome! We are glad that you want to contribute to our project! 💖

    +

    As you get started, you are in the best position to give us feedback on areas of our project that we need help with including:

    +
      +
    • Problems found during setting up a new developer environment
    • +
    • Gaps in our Quickstart Guide or documentation
    • +
    • Bugs in our automation scripts
    • +
    +

    If anything doesn't make sense, or doesn't work when you run it, please open a bug report and let us know!

    +

    Ways to Contribute

    +

    We welcome many different types of contributions including:

    +
      +
    • New features
    • +
    • Builds, CI/CD
    • +
    • Bug fixes
    • +
    • Documentation
    • +
    • Issue Triage
    • +
    • Answering questions on Discord/GitHub Discussions
    • +
    • Web design
    • +
    • UI/UX
    • +
    • Communications / Social Media / Blog Posts
    • +
    • Release management
    • +
    +

    Not everything happens through a GitHub pull request. Please come to our meetings or contact us and let's discuss how we can work +together.

    +

    Come to Meetings

    +

    Absolutely everyone is welcome to come to any of our meetings. You never need an invite to join us. In fact, we want you to join us, even if you don’t have anything you feel like you want to contribute. Just being there is enough!

    +

    You can find out more about our meetings here. You don’t have to turn on your video. The first time you come, introducing yourself is more than enough.

    +

    Over time, we hope that you feel comfortable voicing your opinions, giving feedback on others' ideas, and even sharing your own ideas, and experiences.

    +

    Find an Issue

    +

    We have good first issues for new contributors and help wanted issues suitable for any contributor. good first issue has extra information to help you make your first contribution. help wanted are issues suitable for someone who isn't a core maintainer and is good to move onto after your first pull request.

    +

    Sometimes there won’t be any issues with these labels. That’s ok! There is likely still something for you to work on. If you want to contribute but you don’t know where to start or can't find a suitable issue, you can reach out to us via Discord or GitHub Discussions and we will help you find something.

    +

    Once you see an issue that you'd like to work on, please post a comment saying that you want to work on it. Something like "I want to work on this" is fine.

    +

    Ask for Help

    +

    The best way to reach us with a question when contributing is to ask on:

    + +

    Pull Request Lifecycle

    +

    Before you start, ensure no one else is working on the same issue. If a related pull request exists, consider offering your assistance there. If you don't receive a response within a reasonable timeframe, you can proceed with your own pull request.

    +

    After you've submitted your pull request, it enters the review stage. During this time, the project maintainers or contributors will examine your changes. They might request modifications, such as:

    +
      +
    • Enhancements in your code
    • +
    • Additional tests or updates to the documentation
    • +
    • Changes in your implementation approach
    • +
    • Dividing your pull request into smaller, more manageable parts
    • +
    +

    Depending on the project’s roadmap and priorities, you might also be asked to:

    +
      +
    • Delay the integration of your pull request to align with future releases
    • +
    • Close your current pull request and, if needed, open a new one with revised changes
    • +
    +

    Development Environment Setup

    +

    See our Development environment setup guide to get started locally or using Gitpod.

    +

    Sign your Commits

    +

    DCO

    +

    Licensing is important to open source projects. It provides some assurances that the software will continue to be available based under the terms that the author(s) desired. We require that contributors sign off on commits submitted to our project's repositories. The Developer Certificate of Origin (DCO) is a way to certify that you wrote and have the right to contribute the code you are submitting to the project.

    +

    You sign-off by adding the following to your commit messages. Your sign-off must match the git user and email associated with the commit.

    +
    This is my commit message

    Signed-off-by: Your Name <your.name@example.com>
    +

    Git has a -s command line option to do this automatically:

    +
    git commit -s -m 'This is my commit message'
    +

    If you forgot to do this and have not yet pushed your changes to the remote repository, you can amend your commit with the sign-off by running

    +
    git commit --amend -s
    +

    Pull Request Checklist

    +

    When you submit your pull request, or you push new commits to it, our automated systems will run some checks on your new code. We require that your pull request passes these checks, but we also have more criteria than just that before we can accept and merge it. We recommend that you check the following things locally before you submit your code:

    +
      +
    • Your code builds and passes tests locally
    • +
    • Your code passes our automated checks
    • +
    • You have signed your commits
    • +
    • You have added tests for your code (if applicable)
    • +
    • You have updated the documentation (if applicable)
    • +
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/alterations/methods/index.html b/docs/2.11.5/development/alterations/methods/index.html new file mode 100644 index 000000000..53f2e9a6b --- /dev/null +++ b/docs/2.11.5/development/alterations/methods/index.html @@ -0,0 +1,20 @@ + + + + + +Alteration Methods | Routr Docs + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/2.11.5/development/alterations/overview/index.html b/docs/2.11.5/development/alterations/overview/index.html new file mode 100644 index 000000000..1f59bdd1d --- /dev/null +++ b/docs/2.11.5/development/alterations/overview/index.html @@ -0,0 +1,20 @@ + + + + + +Overview | Routr Docs + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/2.11.5/development/building-a-chat-application/index.html b/docs/2.11.5/development/building-a-chat-application/index.html new file mode 100644 index 000000000..b1820b0f9 --- /dev/null +++ b/docs/2.11.5/development/building-a-chat-application/index.html @@ -0,0 +1,20 @@ + + + + + +Building a Chat Application | Routr Docs + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/building-a-middleware/index.html b/docs/2.11.5/development/building-a-middleware/index.html new file mode 100644 index 000000000..61bf820ff --- /dev/null +++ b/docs/2.11.5/development/building-a-middleware/index.html @@ -0,0 +1,20 @@ + + + + + +Building a Middleware | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Building a Middleware

    +

    Building a Middleware is the same as building a Processor. Both share the same protobuf definition. Please refer to the Concepts Overview for more information on the differences between a Processor and a Middleware.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/building-a-processor/index.html b/docs/2.11.5/development/building-a-processor/index.html new file mode 100644 index 000000000..ab88f141a --- /dev/null +++ b/docs/2.11.5/development/building-a-processor/index.html @@ -0,0 +1,47 @@ + + + + + +Building a Processor | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Building a Processor

    +

    Processors are how we extend the signaling functionality of Routr. Processors are where we can add new SIP headers, modify existing ones, add endpoints to the Location Service, etc. Processors are implemented as gRPC services and use the Alterations API to modify SIP messages. A Processor is the last stop for a SIP message before it is sent out to the network.

    +

    Here is a non-exhaustive list of things you can do with a Processor:

    +
      +
    • Build an instant messaging application
    • +
    • Create a custom logic for a SCAIP system
    • +
    • Build a SIP Recorder when combined with RTPEngine
    • +
    • Doorbell Camera System integration
    • +
    • Custom logic for a SIP IoT system
    • +
    +

    Processor Contract

    +

    A Processor is a gRPC service that implements the Processor interface. The interface is defined in the processor.proto file.

    +

    Here is the definition of the Processor interface:

    +
    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid session information
    INFO = 12;
    // Asks the recipient to issue call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    +

    As you can see in the protobuf, the message contains the SIP message and metadata about the message. It includes things like the sender, the method, the listening points, etc. This metadata is necessary because it is how Routr processes messages statelessly.

    +

    You can write processors in any language that supports gRPC. However, at the moment, we provide better support for NodeJS.

    +

    One feature of using NodeJS is receiving the JSON representation of the gRPC message. That makes it easier to work with the message in JavaScript.

    +

    As an example, here is the JSON representation of a SIP REGISTER message:

    +
    {
    "ref": "AynhXaFtbdXwHrUEzt_rUQ..",
    "edgePortRef": "edgeport-01",
    "method": "REGISTER",
    "externalAddrs": ["200.22.21.42"],
    "localnets": ["127.0.0.1/8", "10.100.42.127/24", "10.100.43.128/31"],
    "listeningPoints": [
    {
    "host": "0.0.0.0",
    "port": 5060,
    "transport": "TCP"
    },
    {
    "host": "0.0.0.0",
    "port": 5060,
    "transport": "UDP"
    }
    ],
    "sender": {
    "host": "127.0.0.1",
    "port": 36214,
    "transport": "TCP"
    },
    "message": {
    "via": [
    {
    "host": "proxy",
    "port": 5060,
    "branch": "z9hG4bK-524287-1---7315a24d84546819",
    "transport": "TCP"
    },
    {
    "host": "127.0.0.1",
    "port": 36214,
    "branch": "z9hG4bK-524287-1---7315a24d84546819",
    "transport": "TCP"
    }
    ],
    "extensions": [
    {
    "name": "CSeq",
    "value": "14 REGISTER"
    },
    {
    "name": "Allow",
    "value": "INVITE"
    },
    {
    "name": "User-Agent",
    "value": "Z 5.4.12 v2.10.13.2"
    },
    {
    "name": "Allow-Events",
    "value": "presence"
    }
    ],
    "from": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "UDP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "John Doe",
    "wildcard": false
    },
    "tag": "9041462a"
    },
    "to": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    },
    "tag": ""
    },
    "contact": {
    "address": {
    "uri": {
    "user": "1001",
    "userPassword": "",
    "host": "127.0.0.1",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 36214,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    },
    "expires": -1,
    "qValue": -1
    },
    "callId": {
    "callId": "AynhXaFtbdXwHrUEzt_rUQ.."
    },
    "contentLength": {
    "contentLength": 0
    },
    "maxForwards": {
    "maxForwards": 70
    },
    "expires": {
    "expires": 60
    },
    "recordRoute": [
    {
    "parameters": {
    "a": "1",
    "b": "2"
    },
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    }
    ],
    "route": [
    {
    "parameters": null,
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "10.100.42.127",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    },
    {
    "parameters": null,
    "address": {
    "uri": {
    "user": "",
    "userPassword": "",
    "host": "10.100.42.128",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "displayName": "",
    "wildcard": false
    }
    }
    ],
    "authorization": {
    "realm": "sip.local",
    "scheme": "Digest",
    "cNonce": "acbcc60094edde23f49b01e18bafd34e",
    "nonce": "b8fe2321cf489ac475c80c6e5cfa1c22",
    "algorithm": "MD5",
    "qop": "",
    "opaque": "",
    "response": "227fe247ff0b9fa4fcf2706b587bf995",
    "username": "1001",
    "uri": "sip:sip.local;transport=TCP",
    "nonceCount": 13
    },
    "requestUri": {
    "user": "",
    "userPassword": "",
    "host": "sip.local",
    "transportParam": "TCP",
    "mAddrParam": "",
    "methodParam": "",
    "userParam": "",
    "ttlParam": -1,
    "port": 5060,
    "lrParam": false,
    "secure": false
    },
    "messageType": "REQUEST"
    }
    }
    +

    Building a Processor from a Template

    +

    To make it easier to build processors, we provide a template you can use to get started. The template is available in the routr-processor-template.

    +

    To use the template, you must have NodeJS installed in your system. Once you have NodeJS installed, you can use the following command to create a new processor:

    +
    npx degit fonoster/nodejs-processor my-processor
    +

    The previous command will create a new folder called my-processor with the following structure:

    +
    .
    ├── CONTRIBUTING.md
    ├── Dockerfile
    ├── LICENSE
    ├── README.md
    ├── commitlint.config.js
    ├── compose.yaml
    ├── package-lock.json
    ├── package.json
    ├── src
    │ ├── envs.ts
    │ ├── handlers.ts
    │ └── index.ts
    ├── test
    │ └── unit.test.ts
    └── tsconfig.json
    +

    The most important file is the handlers.ts file. This file is where you will write your processor logic. Feel free to review the file, as it contains an example of how to write an instant messaging processor.

    +

    From there, you can install the dependencies and start the processor:

    +
    cd my-processor
    npm install
    npm start
    +

    You may now start sending SIP messages to your processor from EdgePort or Dispatcher.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/building-a-scaip-processor/index.html b/docs/2.11.5/development/building-a-scaip-processor/index.html new file mode 100644 index 000000000..3da4ca7e3 --- /dev/null +++ b/docs/2.11.5/development/building-a-scaip-processor/index.html @@ -0,0 +1,20 @@ + + + + + +Building a SCAIP Processor | Routr Docs + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/apiserver/index.html b/docs/2.11.5/development/components/apiserver/index.html new file mode 100644 index 000000000..89728884d --- /dev/null +++ b/docs/2.11.5/development/components/apiserver/index.html @@ -0,0 +1,127 @@ + + + + + +APIServer | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    APIServer

    +

    The APIServer is an optional component that can be used to describe a VoIP network in terms of Domains, Agents, Trunks, Numbers, and Peers. The data is stored in a PostgreSQL database and is accessed by other components via gRPC.

    +

    The APIServer has two implementations: the pgdata for persistent data storage in a PostgreSQL database and the simpledata for storing data in files. The simpledata implementation is intended for testing and small deployments.

    +

    The pgdata has several advantages over the simpledata implementation. The first advantage is that the pgdata allows you to manage the data using the CTL and SDK. Additionally, all the data entities support the extended attribute, enabling you to store additional data in the database in JSON format—more on this in later sections.

    +

    Data Migration

    +

    The pgdata implementation uses Prisma to manage the database schema. Prisma is important because it allows us to migrate the database schema to newer versions of Routr easily.

    +

    Configuration Spec

    +

    pgdata

    +

    The pgdata has the following environment variables available for configuration:

    +
      +
    • DATABASE_URL - The URL of the PostgreSQL database. Example: postgresql://postgres:postgres@localhost:5432/routr
    • +
    • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907
    • +
    • EXTERNAL_SERVER_BIND_ADDR - The address where the APIServer will listen for HTTP requests. Default to 0.0.0.0:51908
    • +
    • TLS_ON - Enables TLS for the gRPC server. Default to false
    • +
    • VERIFY_CLIENT_CERT - Enables client certificate verification. Default to false
    • +
    • CACERT - The path to the CA certificate. Default to /etc/routr/certs/ca.crt
    • +
    • SERVER_CERT - The path to the server certificate. Default to /etc/routr/certs/server.crt
    • +
    • ENFORCE_E164 - Enables E164 validation for Numbers. Default to false
    • +
    • ENFORCE_E164_WITH_MOBILE_PREFIX - Enables E164 validation for Numbers with mobile prefixes. Default to false
    • +
    +

    For details about connecting to the pgdata to manage the data, see the CTL and SDK documentation.

    +

    simpledata

    +

    The simpledata has the following environment variables available for configuration:

    +
      +
    • PATH_TO_RESOURCES - The path to the directory where the data will be stored. Example: /etc/routr/resources
    • +
    • BIND_ADDR - The address where the APIServer will listen for gRPC requests. Default to 0.0.0.0:51907
    • +
    +

    Both implementations provide Routr with the same protobuf interface, so you can switch between them without changing the other components.

    +

    In your resources directory, you will find the following files:

    +
      +
    • agents.yaml - A list of Agents
    • +
    • domains.yaml - A list of Domains to which Agents belong
    • +
    • trunks.yaml - Represents the list of Trunks
    • +
    • numbers.yaml - A list of Numbers to which Trunks belong
    • +
    • peers.yaml - A list of Peers that cooperate with Routr (e.g., Asterisk, FreeSWITCH, etc.)
    • +
    • credentials.yaml - A list of Credentials for Peers and Agents
    • +
    • acl.yaml - The list of ACLs
    • +
    +
    +

    You may also provide a .json file instead of a .yaml file.

    +
    +

    The Agents configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the AgentYes
    kindThe kind of resourceYes
    refReference to the AgentYes
    metadata.nameA friendly name for the AgentYes
    spec.usernameThe username of the AgentYes
    spec.domainRefReference to the Domain of the AgentYes
    spec.credentialsRefReference to the Credentials of the AgentYes
    spec.privacyThe privacy settings of the Agent (Private or None)No
    spec.enabledThe enabled status of the Agent (reserved for future use)No
    +

    An example of an Agents configuration file:

    +

    Filename: agents.yaml

    +
    - apiVersion: v2beta1
    kind: Agent
    ref: agent-01
    metadata:
    name: John Doe
    spec:
    username: "1001"
    domainRef: domain-01
    credentialsRef: credentials-01
    privacy: Private
    +

    In the example above, the Agent agent-01 has the username 1001, belongs to the Domain domain-01, and uses the Credentials credentials-01. Both the Domain and the Credentials are required for the Agent to work.

    +

    The Domains configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the DomainYes
    kindThe kind of resourceYes
    refReference to the DomainYes
    metadata.nameA friendly name for the DomainYes
    spec.context.domainUriThe domain URIYes
    spec.context.egressPoliciesThe list of egress policiesNo
    spec.context.egressPolicies[*].ruleThe regular expression to match the numberYes
    spec.context.egressPolicies[*].numberRefReference to the NumberYes
    +

    An example of a Domains configuration file:

    +

    Filename: domains.yaml

    +
    - apiVersion: v2beta1
    kind: Domain
    ref: domain-01
    metadata:
    name: Local Domain
    spec:
    context:
    domainUri: sip.local
    egressPolicies:
    - rule: ".*"
    numberRef: number-01
    +

    In the example above, the Domain domain-01 has the Domain URI sip.local and the egress policy .* that matches all numbers. The egress policy is associated with the Number number-01. The Number number-01 is required for the Domain to work.

    +

    Numbers are used to route calls from and to the PSTN. The Numbers configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the NumberYes
    kindThe kind of resourceYes
    refReference to the NumberYes
    metadata.nameA friendly name for the NumberYes
    metadata.geoInfo.cityThe city where the Number is locatedNo
    metadata.geoInfo.countryThe country where the Number is locatedNo
    metadata.geoInfo.countryIsoCodeThe ISO code of the countryNo
    spec.trunkRefReference to the TrunkYes
    spec.location.telUrlThe tel URL of the NumberYes
    spec.location.aorLinkThe Address of Record (AOR) of the NumberYes
    spec.location.sessionAffinityHeaderThe session affinity header of the NumberNo
    spec.location.extraHeadersThe extra headers of the NumberNo
    spec.location.extraHeaders[*].nameThe name of the extra headerYes
    +

    Tthe ' tel: ' scheme is required when setting the spec.location.telUrl property. For example, tel:+17066041487. Here, tel: indicates that the URI is a telephone number. Please remember that it must match the number sent by your VoIP provider.

    +

    Another important property is the spec.location.aorLink. The important thing is that the AOR must be present in the location table in the Location Service. Otherwise, the call will fail. The AOR can be a SIP URI or a backend URI. Typically, you will use SIP URIs to route calls to Agents and backend URIs to route calls to Peers.

    +

    The spec.location.sessionAffinityHeader tells the Location Service to use a specific header to identify the session. This property is helpful in combination with "backend" URIs. For example, if you have a conference server and want to ensure that all calls to the same conference room are routed to the same server, you can use the X-Room-Id header to identify the session. The Location Service will use the header's value to identify the session.

    +

    An example of a Numbers configuration file:

    +

    Filename: numbers.yaml

    +
    - apiVersion: v2beta1
    kind: Number
    ref: number-01
    metadata:
    name: "(706)604-1487"
    geoInfo:
    city: Columbus, GA
    country: USA
    countryIsoCode: US
    spec:
    trunkRef: trunk-01
    location:
    telUrl: tel:+17066041487
    aorLink: sip:conference@sip.local
    sessionAffinityHeader: X-Room-Id
    extraHeaders:
    - name: X-Room-Id
    value: jsa-shqm-iyo
    +

    Numbers must be associated with a Trunk to work.

    +

    The Trunks configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the TrunkYes
    kindThe kind of resourceYes
    refReference to the TrunkYes
    metadata.nameA friendly name for the TrunkYes
    metadata.regionReserved for future useNo
    spec.inbound.uriThe inbound URI of the TrunkYes
    spec.inbound.accessControlListRefReference to the ACL of the TrunkNo
    spec.outbound.sendRegisterEnables outbound registrationNo
    spec.outbound.credentialsRefReference to the Credentials of the TrunkNo
    spec.outbound.urisThe list of outbound URIsNo
    spec.outbound.uris[*].uriThe outbound URIYes
    spec.outbound.uris[*].priorityReserved for future useNA
    spec.outbound.uris[*].weightReserved for future useNA
    spec.outbound.uris[*].enabledReserved for future useNA
    spec.outbound.uris[*].transportThe transport of the outbound URINo
    spec.outbound.uris[*].userThe user of the outbound URINo
    spec.outbound.uris[*].hostThe host of the outbound URINo
    spec.outbound.uris[*].portThe port of the outbound URINo
    +

    An example of a Trunks configuration file:

    +

    Filename: trunks.yaml

    +
    - apiVersion: v2beta1
    kind: Trunk
    ref: trunk-01
    metadata:
    name: Test Trunk
    region: us-east1
    spec:
    inbound:
    uri: trunk01.acme.com
    accessControlListRef: acl-01
    outbound:
    sendRegister: true
    credentialsRef: credentials-04
    uris:
    - uri:
    user: pbx-1
    host: sip.provider.net
    port: 7060
    transport: udp
    enabled: true
    +

    In the spec.inbound section, the uri property helps Routr to identify the Trunk. Calls from the PSTN using the uri will be routed to the Trunk. The accessControlListRef property restricts the access to the Trunk. The accessControlListRef is optional.

    +

    In the spec.outbound section, the sendRegister property enables registration outbound registrations while the credentialsRef property for authentication with your trunk provider.

    +

    In Routr, a Peer is a SIP entity that belongs to the same network as Routr. For example, Asterisk, FreeSWITCH, etc. The Peers configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the PeerYes
    kindThe kind of resourceYes
    refReference to the PeerYes
    metadata.nameA friendly name for the PeerYes
    spec.aorThe Address of Record (AOR) of the PeerYes
    spec.usernameThe username of the PeerYes
    spec.credentialsRefReference to the Credentials of the PeerYes
    spec.loadBalancing.withSessionAffinityEnables session affinityNo
    spec.loadBalancing.algorithmThe load balancing algorithmNo
    +

    The spec.loadBalancing.withSessionAffinity property enables session affinity, and the spec.loadBalancing.algorithm property sets the load-balancing algorithm. The available algorithms are least-sessions and round-robin.

    +

    Remember that for the least-sessions algorithm to work, your SIP backend includes the special header X-Session-Count with the number of active sessions as part of the registration request.

    +
    +

    We are evaluating more flexible options to provide the session count, but as of now, you also need to make sure that registration requests happen frequently enough to keep the session count up to date.

    +
    +

    An example of a Peers configuration file:

    +

    Filename: peers.yaml

    +
    - apiVersion: v2beta1
    kind: Peer
    ref: peer-01
    metadata:
    name: Asterisk (Media Server)
    spec:
    aor: sip:conference@sip.local
    username: asterisk
    credentialsRef: credentials-03
    loadBalancing:
    withSessionAffinity: true
    algorithm: least-sessions
    +

    Credentials in Routr help Agents and Peers authenticate with Routr.

    +

    The Credentials configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the CredentialsYes
    kindThe kind of resourceYes
    refReference to the CredentialsYes
    metadata.nameA friendly name for the CredentialsYes
    spec.credentials.usernameThe username of the CredentialsYes
    spec.credentials.passwordThe password of the CredentialsYes
    +

    An example of a Credentials configuration file:

    +

    Filename: credentials.yaml

    +
    - apiVersion: v2beta1
    kind: Credentials
    ref: credentials-01
    metadata:
    name: Agent Credentials
    spec:
    credentials:
    username: "1001"
    password: "1234"
    +

    Routr also supports ACLs. ACLs are used to restrict access to Trunks and Domains.

    +

    The ACLs configuration file has the following structure:

    +
    PropertyDescriptionRequired
    apiVersionThe API version of the ACLYes
    kindThe kind of resourceYes
    refReference to the ACLYes
    metadata.nameA friendly name for the ACLYes
    spec.accessControlList.denyThe list of deny rulesNo
    spec.accessControlList.deny[*]The deny ruleYes
    spec.accessControlList.allowThe list of allow rulesNo
    spec.accessControlList.allow[*]The allow ruleYes
    +

    An example of an ACLs configuration file:

    +

    Filename: acl.yaml

    +
    - apiVersion: v2beta1
    kind: AccessControlList
    ref: acl-01
    metadata:
    name: Europe ACL
    spec:
    accessControlList:
    deny:
    - 0.0.0.0/1
    allow:
    - 192.168.1.3/31
    - 127.0.0.1/8
    - 10.111.221.22/31
    +

    Communication and Protobuf Spec

    +

    Components communicate with the APIServer using gRPC. That includes SDKs, Command-line tools, Processors, Middleware, etc.

    +

    The following protobuf defines the Agent service interface:

    +
    syntax = "proto3";

    package fonoster.routr.connect.agents.v2beta1;

    // The Agents service definition
    service Agents {
    // Creates a new Agent
    rpc Create (CreateAgentRequest) returns (Agent) {}
    // Updates an existing Agent
    rpc Update (UpdateAgentRequest) returns (Agent) {}
    // Gets an existing Agent
    rpc Get (GetAgentRequest) returns (Agent) {}
    // Deletes an existing Agent
    rpc Delete (DeleteAgentRequest) returns (.google.protobuf.Empty) {}
    // Lists all Agents
    rpc List (ListAgentsRequest) returns (ListAgentsResponse) {}
    // Find Agents by field name and value
    rpc FindBy (FindByRequest) returns (FindByResponse) {}
    }

    enum Privacy {
    PRIVATE = 0;
    NONE = 1;
    }

    // The message for the Agent resource
    message Agent {
    // The API version of the Agent
    string api_version = 1;
    // The unique identifier of the Agent
    string ref = 2;
    // The name of the Agent
    string name = 3;
    // The username of the Agent
    string username = 4;
    // The password of the Agent
    Privacy privacy = 5;
    // The enabled status of the Agent
    bool enabled = 6;
    // The created_at timestamp of the Agent
    int32 created_at = 7;
    // The updated_at timestamp of the Agent
    int32 updated_at = 8;
    // The domain of the Agent
    fonoster.routr.connect.domains.v2beta1.Domain domain = 9;
    // The credentials of the Agent
    fonoster.routr.connect.credentials.v2beta1.Credentials credentials = 10;
    // The extended attributes of the Agent
    .google.protobuf.Struct extended = 11;
    }

    // The request message for the Agents.Create method
    message CreateAgentRequest {
    // The name of the Agent
    string name = 1;
    // The username of the Agent
    string username = 2;
    // The password of the Agent
    Privacy privacy = 3;
    // The enabled status of the Agent
    bool enabled = 4;
    // Reference to the Domain of the Agent
    string domain_ref = 5;
    // Reference to the Credentials of the Agent
    string credentials_ref = 6;
    // The extended attributes of the Agent
    .google.protobuf.Struct extended = 7;
    }

    // The request message for the Agents.Update method
    message UpdateAgentRequest {
    // The unique identifier of the Agent
    string ref = 1;
    // The name of the Agent
    string name = 2;
    // The privacy settings of the Agent
    Privacy privacy = 3;
    // The enabled status of the Agent
    bool enabled = 4;
    // Reference to the Domain of the Agent
    string domain_ref = 5;
    // Reference to the Credentials of the Agent
    string credentials_ref = 6;
    // The extended attributes of the Agent
    .google.protobuf.Struct extended = 7;
    }

    // The request message for the Agents.Get method
    message GetAgentRequest {
    // The unique identifier of the Agent
    string ref = 1;
    }

    // The request message for the Agents.Delete method
    message DeleteAgentRequest {
    // The unique identifier of the Agent
    string ref = 1;
    }

    // The request message for the Agents.FindBy method
    message FindByRequest {
    // The field name to search
    string field_name = 1;
    // The value to search
    string field_value = 2;
    }

    // The response message for the Agents.FindBy method
    message FindByResponse {
    // The list of Agents
    repeated Agent items = 1;
    }

    // The request message for the Agents.List method
    message ListAgentsRequest {
    // The maximum number of items in the list
    int32 page_size = 1;

    // The next_page_token value returned from the previous request, if any
    string page_token = 2;
    }

    // The response message for the Agents.List method
    message ListAgentsResponse {
    // List of Agents
    repeated Agent items = 1;

    // Token to retrieve the next page of results or empty if there are no more results in the list
    string next_page_token = 2;
    }
    +

    To see the complete protobuf spec, please visit the protobuf directory.

    +

    Launching the APIServer

    +

    Both implementations are available as Docker images from Docker Hub as fonoster/routr-pgdata and fonoster/routr-simpledata.

    +

    pgdata

    +

    To launch the pgdata implementation with Docker, you can use the following command:

    +
    docker run -it \
    -e DATABASE_URL="postgresql://postgres:postgres@localhost:5432/routr" \
    -p 51907:51907 \
    -p 51908:51908 \
    fonoster/routr-pgdata
    +

    The port 51907 is used for internal communication, and the port 51908 is used for external communication. The CTL and SDK use the external port to manage the data.

    +

    simpledata

    +

    To launch the simpledata implementation with Docker, you can use the following command:

    +
    docker run -it \
    -v /path/to/resources:/etc/routr/resources \
    -p 51907:51907 \
    fonoster/routr-simpledata
    +

    Quick Test with gRPCurl

    +

    One easy way to interact with the APIServer for testing and development is to use gRPCurl. The following example shows how to send a request to the Agents service within the APIServer:

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto agents.proto -d '{...}' \
    localhost:51907 \
    fonoster.routr.connect.agents.v2beta1.Agents/Get
    +

    Please remember that the simpledata implementation does not accept write operations.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/dispatcher/index.html b/docs/2.11.5/development/components/dispatcher/index.html new file mode 100644 index 000000000..8af1f78f3 --- /dev/null +++ b/docs/2.11.5/development/components/dispatcher/index.html @@ -0,0 +1,54 @@ + + + + + +Message Dispatcher | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Message Dispatcher

    +

    The Message Dispatcher, or Dispatcher for short, is a component responsible for receiving messages from the EdgePort and routing them to the appropriate Processor and Middleware.

    +

    The Dispatcher is required when your deployment has more than one Processor or has at least one Middleware. If your deployment has only one Processor and no Middleware, you can skip the Dispatcher and connect the EdgePort directly to the Processor.

    +

    The following diagram shows the relation between the EdgePort, the Message Dispatcher, and the Message Processor.

    +
    ┌────────┐ ┌──────────────────┐             ┌─────────────────┐
    │EdgePort│ │Message Dispatcher│ │Message Processor│
    └───┬────┘ └──────┬───────────┘ └────────┬────────┘
    │ │ │
    │gRPC request │ │
    │────────────>│ │
    │ │ │
    │ │findProcessor() & forwardMessage()│
    │ │─────────────────────────────────>│
    │ │ │
    │ │ Processed Message │
    │ │<─────────────────────────────────│
    │ │ │
    │gRPC response│ │
    │<────────────│ │
    ┌───┴────┐ ┌──────┴───────────┐ ┌────────┴────────┐
    │EdgePort│ │Message Dispatcher│ │Message Processor│
    └────────┘ └──────────────────┘ └─────────────────┘
    +

    Configuration Spec

    +

    To configure the Dispatcher, you must provide a YAML or JSON configuration with the following structure.

    +

    You can configure the Dispatcher using a YAML or JSON file that has the following structure:

    +
    PropertyDescriptionRequired
    refReference to the DispatcherYes
    spec.bindAddrIpv4 interface to accept requests onNo
    spec.processorsList of ProcessorsYes
    spec.processors[*].refReference to the ProcessorYes
    spec.processors[*].matchFuncMatching functionYes
    spec.processors[*].addrAddress of the ProcessorYes
    spec.processors[*].methodsList of SIP Methods supported by the ProcessorYes
    spec.middlewaresList of MiddlewaresNo
    spec.middlewares[*].refReference to the MiddlewareYes
    spec.middlewares[*].addrAddress of the MiddlewareYes
    spec.middlewares[*].postProcessorWhether to process the SIP Message after the ProcessorYes
    +

    Here is an example of a configuration file:

    +

    Filename: dispatcher.yaml or dispatcher.json

    +
    kind: MessageDispatcher
    apiVersion: v2beta1
    ref: message-dispatcher
    spec:
    bindAddr: 0.0.0.0:51901
    processors:
    - ref: connect-processor
    addr: connect:51904
    matchFunc: req => true
    methods:
    - REGISTER
    - MESSAGE
    - INVITE
    - ACK
    - BYE
    - CANCEL
    +

    The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

    +

    The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

    +

    This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

    +
    kind: MessageDispatcher
    apiVersion: v2beta1
    ref: message-dispatcher
    spec:
    bindAddr: 0.0.0.0:51901
    processors:
    - ref: im-processor
    addr: im:51904
    matchFunc: req => req.method === "MESSAGE"
    methods:
    - MESSAGE
    - ref: connect-processor
    addr: connect:51904
    matchFunc: req => true
    methods:
    - REGISTER
    - INVITE
    - ACK
    - BYE
    - CANCEL
    +

    The following examples show typical matching functions:

    +

    Match all SIP Messages.

    +
    req => true
    +

    Match SIP Messages with a specific method.

    +
    req => req.method === "MESSAGE"
    +

    Match SIP Messages with a specific method and a specific header.

    +
    req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"
    +

    Match SIP Messages with a specific User-Agent header.

    +
    req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
    +

    Communication and Protobuf Spec

    +

    The Message Dispatcher uses gRPC to communicate with the Processors and Middlewares, which happen to share the protobuf definition:

    +
    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid-session information
    INFO = 12;
    // Asks the recipient to issue a call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    +

    Link to the protobuf definition.

    +

    Launching the Dispatcher with Docker

    +

    The Message Dispatcher is available as a Docker image from Docker Hub. To launch the Dispatcher with Docker, you can use the following command:

    +
    docker run -it -v $(pwd)/dispatcher.yaml:/etc/routr/dispatcher.yaml -p 51901:51901 fonoster/routr-dispatcher
    +

    The previous example will pull the latest version of the Dispatcher from Docker Hub and launch it with the default configuration. The Dispatcher will be listening on port 51901 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51901.

    +

    Quick Test with gRPCurl

    +

    One easy way to interact with the Dispatcher for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the Dispatcher.

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/edgeport/index.html b/docs/2.11.5/development/components/edgeport/index.html new file mode 100644 index 000000000..5ca973ee8 --- /dev/null +++ b/docs/2.11.5/development/components/edgeport/index.html @@ -0,0 +1,55 @@ + + + + + +EdgePort | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    EdgePort

    +

    The EdgePort component accepts SIP Messages, parses them into protobuf, and sends them to the Message Dispatcher. After a SIP Message is processed, the EdgePort will forward the SIP Message to the next hop.

    +

    The following diagram shows the relation between a SIP client, the EdgePort, and the Dispatcher.

    +
    ┌──────────┐  ┌────────┐ ┌──────────────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └────┬─────┘ └───┬────┘ └──────┬───────────┘
    │ │ │
    │SIP request │ │
    │───────────>│ │
    │ │ │
    │ │gRPC request │
    │ │────────────>│
    │ │ │
    │ │gRPC response│
    │ │<────────────│
    │ │ │
    │SIP response│ │
    │<───────────│ │
    ┌────┴─────┐ ┌───┴────┐ ┌──────┴───────────┐
    │SIP Client│ │EdgePort│ │Message Dispatcher│
    └──────────┘ └────────┘ └──────────────────┘
    +

    While we show the Dispatcher, we could also use a Processor. Both components share the same protobuf. However, the Dispatcher is required when you expect multiple Processors or at least one Middleware.

    +

    For example, if your use case requires having one Processor for SIP INVITE and another for SIP MESSAGE requests, you will need to use a Dispatcher. Similarly, if you want to use a Middleware, you will need to use a Dispatcher.

    +

    If you only have one Processor and have not Middleware, you can use the Processor directly. Running the Processor directly will make your deployment simpler and faster.

    +

    Configuration Spec

    +

    To configure the EdgePort, you must provide a YAML or JSON configuration with the following structure.

    +
    PropertyDescriptionRequired
    refReference to the EdgePortYes
    metadata.regionRegion where the EdgePort is located (reserved for future use)No
    spec.unknownMethodActionWhat to do if an incoming request type is not allowed (reserved for future use)No
    spec.transportEnabled Transport ProtocolsYes
    spec.transport[*].protocolTransport protocolYes
    spec.transport[*].bindAddrIpv4 interface to accept requests onNo
    spec.transport[*].portPort to listen onYes
    spec.methodsAcceptable SIP MethodsYes
    spec.processorAdjacent service for message routingYes
    spec.processor.addrAddress of the adjacent serviceYes
    spec.localnetsNetworks considered to be in the same local networkNo
    spec.externalAddrsEdgePort external ip addressesNo
    spec.bindAddrIpv4 interface to accept requests onNo
    spec.securityContextSecurity contextNo
    spec.securityContext.clientClient security contextNo
    spec.securityContext.client.protocolsTLS protocols used by the client (e.g., SSLv3, TLSv1.2)No
    spec.securityContext.client.authTypeClient authentication type (e.g., Disabled, DisabledAll, Required, Wanted)No
    spec.securityContext.keyStorePath to the key store fileNo
    spec.securityContext.trustStorePath to the trust store fileNo
    spec.securityContext.keyStorePasswordPassword for the key storeNo
    spec.securityContext.trustStorePasswordPassword for the trust storeNo
    spec.securityContext.keyStoreTypeType of the key store (e.g., pkcs12)No
    +

    The security context is required if the EdgePort is configured to use a secure protocol such as TLS or WSS.

    +
    +

    Please see JAINSIP docs for details on the security context properties.

    +
    +

    Here is an example of a configuration file:

    +

    Filename: dispatcher.yaml or dispatcher.json

    +
    kind: EdgePort
    apiVersion: v2beta1
    ref: edgeport-01
    metadata:
    region: default
    spec:
    unknownMethodAction: Discard
    processor:
    addr: dispatcher:51901
    securityContext:
    client:
    protocols:
    - SSLv3
    - TLSv1.2
    authType: DisabledAll
    keyStorePassword: changeme
    trustStorePassword: changeme
    keyStore: "/etc/routr/certs/signaling.p12"
    trustStore: "/etc/routr/certs/signaling.p12"
    keyStoreType: pkcs12
    externalAddrs:
    - 10.111.220.2
    - sip01.edgeport.net
    localnets:
    - 127.0.0.1/8
    - 10.111.221.2/24
    methods:
    - REGISTER
    - MESSAGE
    - INVITE
    - ACK
    - BYE
    - CANCEL
    transport:
    - protocol: tcp
    port: 5060
    - protocol: udp
    port: 5060
    - protocol: tls
    port: 5061
    - protocol: ws
    port: 5062
    - protocol: wss
    port: 5063
    +

    The EdgePort requires the spec.externalAddrs field to function properly in NATed environments like Docker. When provided, the spec.externalAddrs is added as metadata to the SIP message and can later be used by a Processor to determine the correct advertised address.

    +

    Environment Variables

    +

    The EdgePort provides the following environment variables as a convenient way to overwrite some configuration properties or provide additional behavior not covered by the configuration spec.

    +
      +
    • PROCESSOR_ADDR - Overwrites the spec.processor.addr property
    • +
    • HOSTNAME - Overwrites the ref property. If running in K8s, ref will be set to the pod's hostname.
    • +
    • IGNORE_LOOPBACK_FROM_LOCALNETS - If set to true, the EdgePort will ignore the loopback address from the localnets property. In Docker deployments, this is set to true by default.
    • +
    • CONSOLE_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the console publisher. Useful for debugging purposes.
    • +
    • NATS_PUBLISHER_ENABLED - If set to true, the EdgePort will publish SIP messages to the NATS publisher.
    • +
    • NATS_PUBLISHER_SUBJECT - Overwrites the default subject the NATS publisher uses. The default subject is routr.
    • +
    • NATS_PUBLISHER_URL - This is required if NATS_PUBLISHER_ENABLED is set to true. It should contain the NATS server URL. For example: nats://nats:4222.
    • +
    +

    Communication and Protobuf Spec

    +

    While the entry point to the EdgePort is SIP, the communication with downstream services happens via gRPC. The EdgePort uses the following protobuf messages to communicate with the Dispatcher or Processor, which shares the protobuf definition.

    +
    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of the calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid session information
    INFO = 12;
    // Asks the recipient to issue call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    +

    Link to the protobuf definition.

    +

    Launching the EdgePort with Docker

    +

    The EdgePort is available as a Docker image from Docker Hub. To launch the EdgePort with Docker, you can use the following command:

    +
    docker run -it -v $(pwd)/edgeport.yaml:/etc/routr/edgeport.yaml -p 5060:5060/udp fonoster/routr-edgeport
    +

    The previous example will pull the latest version of the EdgePort from Docker Hub and launch it with the default configuration. The EdgePort will be listening on port 5060 for UDP traffic. Remember, your Docker container must expose the ports in your configuration file. For example, if you want the port 5061 for TLS traffic, you must add the following flag to the docker run command: -p 5061:5061.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/location/index.html b/docs/2.11.5/development/components/location/index.html new file mode 100644 index 000000000..9139e1309 --- /dev/null +++ b/docs/2.11.5/development/components/location/index.html @@ -0,0 +1,50 @@ + + + + + +Location Service | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Location Service

    +

    In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

    +

    Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

    +

    For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

    +

    Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

    +

    Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

    +

    To do this, create a Peer configuration for your Asterisk server similar to the following:

    +
    apiVersion: v2beta1
    kind: Peer
    ref: peer-01
    metadata:
    name: Asterisk (Media Server)
    spec:
    aor: sip:conference@sip.local
    username: asterisk
    credentialsRef: credentials-01
    loadBalancing:
    withSessionAffinity: true
    algorithm: least-sessions
    +

    Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

    +

    Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

    +

    Configuration Spec

    +

    To configure the Location Service, you must provide a YAML or JSON configuration with the following structure.

    +
    PropertyDescriptionRequired
    regionReserved for future useNo
    bindAddrIPv4 interface on which to accept requestsNo
    cacheCache configurationNo
    cache.providerCache provider (Accepts either memory or redis)No
    cache.parametersCache parameters (Comma-separated key-value pairs)No
    +

    The cache.parameters property is only needed if you are using the Redis provider.

    +

    The following table shows the available parameters for the Redis provider.

    +
    PropertyDescriptionRequired
    usernameUsername (if required by Redis)No
    passwordPassword (if required by Redis)No
    hostRedis host (Defaults to localhost)No
    portRedis port (Defaults to 6379)No
    secureUse secure connection for RedisNo
    +

    Here is an example of a configuration file:

    +

    Filename: location.yaml or location.json

    +
    kind: Location
    apiVersion: v2beta1
    metadata:
    region: default
    spec:
    bindAddr: 0.0.0.0:51902
    cache:
    provider: redis
    parameters: "host=localhost,port=6379"
    +

    Notice that using the memory provider will only work for simple cases where you run a single instance of the Location Service. Suppose you need the least-session algorithm and run multiple instances of the Location Service. In such cases, you will need the redis provider.

    +

    Communication and Protobuf Spec

    +

    Upstream service can communicate with the Location Service using gRPC. The following protobuf contains the definition of the Location Service API.

    +
    syntax = "proto3";

    package fonoster.routr.location.v2beta1;

    import "google/protobuf/empty.proto";
    import "common.proto";
    import "processor.proto";

    service Location {
    rpc AddRoute (AddRouteRequest) returns (.google.protobuf.Empty) {}
    rpc FindRoutes (FindRoutesRequest) returns (FindRoutesResponse) {}
    rpc RemoveRoutes (RemoveRoutesRequest) returns (.google.protobuf.Empty) {}
    }

    // A binding created by an endpoint (Softphone, PBX, Conference System, etc.)
    message Route {
    string user = 1;
    string host = 2;
    string port = 3;
    string advertised_host = 13;
    string advertised_port = 14;
    fonoster.routr.common.v2beta1.Transport transport = 4;
    int64 registered_on = 5;
    int32 expires = 6;
    int32 session_count = 7;
    string edge_port_ref = 8;
    repeated fonoster.routr.processor.v2beta1.NetInterface listening_points = 9;
    repeated string localnets = 10;
    repeated string external_addrs = 11;
    // During route creation, an endpoint can request to add labels that can later be
    // used as selectors. For example, a Softphone can add a label `priority=1` to indicate
    // that it is the preferred endpoint for the given AOR.
    map<string, string> labels = 12;
    }

    message AddRouteRequest {
    // Address of record for the endpoint or trunk
    string aor = 1;
    Route route = 2;
    }

    message FindRoutesRequest {
    message Backend {
    enum Algoritm {
    ROUND_ROBIN = 0;
    LEAST_SESSIONS = 1;
    }
    string ref = 1;
    bool with_session_affinity = 2;
    Algoritm algorithm = 3;
    }
    string call_id = 1;
    string aor = 2;
    string session_affinity_ref = 3;
    Backend backend = 4;
    map<string, string> labels = 5;
    }

    message FindRoutesResponse {
    repeated Route routes = 1;
    }

    message RemoveRoutesRequest {
    string aor = 1;
    }
    +

    Upon receiving a valid AddRoute request, the Location Service will add the route to the location table. The structure of the new Route resembles that of the Route message in the protobuf definition.

    +

    Link to the protobuf definition.

    +

    Launching the Location Service with Docker

    +

    The Location Service is available as a Docker image from Docker Hub. To launch the Location Service with Docker, you can use the following command:

    +
    docker run -it -v $(pwd)/location.yaml:/etc/routr/location.yaml -p 51902:51902 fonoster/routr-location
    +

    The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Location Service will listen to port 51902 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Dispatcher listens on port 51902.

    +

    Quick Test with gRPCurl

    +

    One easy way to interact with the Location Service for testing and development is to use gRPCurl. The following example shows how to send a request to the Location Service using gRPCurl:

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto location.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.location.v2beta1.Location/AddRouteRequest
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/overview/index.html b/docs/2.11.5/development/components/overview/index.html new file mode 100644 index 000000000..f610807c5 --- /dev/null +++ b/docs/2.11.5/development/components/overview/index.html @@ -0,0 +1,22 @@ + + + + + +Overview | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Overview

    +
    ┌────────────┐┌────────────┐                           
    │EdgePort 001││EdgePort 002│
    └┬───────────┘└┬───────────┘
    ┌▽─────────────▽───────────────────────┐
    │Message Dispatcher │
    └┬────────────────┬───────────────────┬┘
    ┌▽──────────────┐┌▽─────────────────┐┌▽───────────────┐
    │IM Processor ││Connect Processor ││Twilio Processor│
    └┬──────────────┘└──────────────────┘└────────────────┘
    ┌▽────────────────────────────┐
    │Data APIs & External Services│
    └─────────────────────────────┘
    +

    This is the components sub-section of the development section. Here you will find information about the different components that make up the platform. Each component will have its own page with information about how to run it, how to configure it, and how to use it.

    +

    Also, within a component page, you will find information about available ports, protobuf contracts, environmenent variables, volumes, docker images, and more.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/registry/index.html b/docs/2.11.5/development/components/registry/index.html new file mode 100644 index 000000000..e6e35fd8d --- /dev/null +++ b/docs/2.11.5/development/components/registry/index.html @@ -0,0 +1,37 @@ + + + + + +Registry Service | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Registry Service

    +

    The Registry component sends outbound registration to trunking services. The service will activate for Trunks with the spec.sendRegister field set to true. The Registry service relies on the Requester service to send requests to the EdgePort.

    +

    Configuration Spec

    +

    To configure the Registry Service, you must provide a YAML or JSON configuration with the following structure.

    +
    PropertyDescriptionRequired
    requesterAddrAddress of service to send requestsYes
    apiAddrAddress of API serviceYes
    registerIntervalInterval for sending registration requests (Defaults to 60s)No
    cacheCache configurationNo
    cache.providerAccepts either memory or redisNo
    cache.parametersComma-separated key-value pairsNo
    methodsAcceptable SIP Methods (reserved for future use)No
    edgePortsList of EdgePorts for outbound registrationsYes
    edgePorts.addressAddress of EdgePortYes
    edgePorts.regionRegion of EdgePort (reserved for future use)No
    +

    The cache.parameters property is only needed if you are using the Redis provider.

    +

    The following table shows the available parameters for the Redis provider.

    +
    PropertyDescriptionRequired
    usernameUsername (if required by Redis)No
    passwordPassword (if required by Redis)No
    hostRedis host (Defaults to localhost)No
    portRedis port (Defaults to 6379)No
    secureUse secure connection for RedisNo
    +

    Here is an example of a configuration file:

    +

    Filename: registry.yaml or registry.json

    +
    kind: Registry
    apiVersion: v2beta1
    spec:
    requesterAddr: requester:51909
    apiAddr: apiserver:51907
    cache:
    provider: memory
    methods:
    - INVITE
    - MESSAGE
    edgePorts:
    - address: sip01.edgeport.net:5060
    region: us-east1
    - address: sip02.edgeport.net:6060
    +

    Communication and Protobuf Spec

    +

    The registry communicates with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

    +
    syntax = "proto3";

    package fonoster.routr.requester.v2beta1;

    import "common.proto";
    import "sipmessage.proto";
    import "processor.proto";

    // Requester service
    service Requester {
    // Send Message Request
    rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
    }

    message SendMessageRequest {
    string target = 1;
    fonoster.routr.processor.v2beta1.Method method = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
    }

    message SendMessageResponse {
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
    }
    +

    Link to the protobuf definition.

    +

    Launching the Registry Service with Docker

    +

    The Registry Service is available as a Docker image from Docker Hub. To launch the Registry Service with Docker, you can use the following command:

    +
    docker run -it -v $(pwd)/registry.yaml:/etc/routr/registry.yaml fonoster/routr-registry
    +

    The previous example will pull the latest version of the Location Service from Docker Hub and launch it with the default configuration. The Registry Service will connect to the Requester service using the address requester:51909 and the API service using the address apiserver:51907.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/requester/index.html b/docs/2.11.5/development/components/requester/index.html new file mode 100644 index 000000000..fc0ba0aed --- /dev/null +++ b/docs/2.11.5/development/components/requester/index.html @@ -0,0 +1,37 @@ + + + + + +Requester | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Requester

    +

    The Requester service is an optional service used when you want to reach an EdgePort using gRPC instead of SIP. As of the release of this publication, we only use this component when the network needs a Registry Service. However, this may change in the future, so be sure to check in to see if there are any other potential uses.

    +

    Configuration Spec

    +

    The Requester service does not have a configuration file. However the following environment variables are available:

    +
      +
    • BIND_ADDR - Address to bind the service (Defaults to 0.0.0.0:51909)
    • +
    • ENABLE_HEALTHCHECKS - Enable health checks (Defaults to true)
    • +
    +

    Communication and Protobuf Spec

    +

    Services communicate with the Requester service using gRPC. The Requester, in turn, communicates with the EdgePort using SIP. The contract for communication with the Requester service is defined in the following protobuf:

    +
    syntax = "proto3";

    package fonoster.routr.requester.v2beta1;

    import "common.proto";
    import "sipmessage.proto";
    import "processor.proto";

    // Requester service
    service Requester {
    // Send Message Request
    rpc SendMessage (SendMessageRequest) returns (SendMessageResponse) {}
    }

    message SendMessageRequest {
    string target = 1;
    fonoster.routr.processor.v2beta1.Method method = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 4;
    }

    message SendMessageResponse {
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 1;
    }
    +

    Link to the protobuf definition.

    +

    Launching the Requester with Docker

    +

    The Requester is available as a Docker image from Docker Hub. To launch the Requester with Docker, you can use the following command:

    +
    docker run -it -p 51909:51909 fonoster/routr-requester
    +

    The previous example will pull the latest version of the Requester from Docker Hub and launch it with the default configuration. The Requester will listen to port 51909 for gRPC requests. Remember, your Docker container must expose the ports in your configuration file. By default, the Requester listens on port 51909.

    +

    Quick Test with gRPCurl

    +

    One easy way to interact with the Requester for testing and development is to use gRPCurl. The following example shows how to send a request to the Requester using gRPCurl:

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto requester.proto -d '{...}' \
    localhost:51909 \
    fonoster.routr.requester.v2beta1.Requester/SendMessage
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/rtprelay/index.html b/docs/2.11.5/development/components/rtprelay/index.html new file mode 100644 index 000000000..e325da9f3 --- /dev/null +++ b/docs/2.11.5/development/components/rtprelay/index.html @@ -0,0 +1,39 @@ + + + + + +RTPRelay | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    RTPRelay

    +

    The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.

    +

    Configuration Spec

    +

    Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:

    +
      +
    • BIND_ADDR - The IP address and port to bind the gRPC server. Defaults to 0.0.0.0:51903
    • +
    • RTPENGINE_HOST - The IP address or hostname of the RTPEngine service. Required.
    • +
    • RTPENGINE_PORT - The port of the RTPEngine service. Defaults to 22222.
    • +
    • RTPENGINE_TIMEOUT - The timeout in milliseconds for the RTPEngine service. Defaults to 5000.
    • +
    +

    Communication and Protobuf Spec

    +

    Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:

    +
    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid-session information
    INFO = 12;
    // Asks the recipient to issue a call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    +

    Link to the protobuf definition.

    +

    Launching the RTPRelay with Docker

    +

    The RTPRelay is available as a Docker image from Docker Hub. To launch the RTPRelay with Docker, you can use the following command:

    +
    docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay
    +

    The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

    +

    Quick Test with gRPCurl

    +

    One easy way to interact with the RTPRelay for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the RTPRelay.

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51903 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/components/simpleauth/index.html b/docs/2.11.5/development/components/simpleauth/index.html new file mode 100644 index 000000000..099e797bb --- /dev/null +++ b/docs/2.11.5/development/components/simpleauth/index.html @@ -0,0 +1,43 @@ + + + + + +SimpleAuth Service | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    SimpleAuth Service

    +

    The SimpleAuth component is an optional middleware service to authenticate SIP requests in Routr. The SimpleAuth is ideal for testing and small deployments.

    +

    Configuration Spec

    +

    The SimpleAuth provides the following environment variables for configuration:

    +
      +
    • BIND_ADDR - The address where the service will listen for gRPC requests. Default: 0.0.0.0:51903
    • +
    • ALLOWLIST - A comma-separated list of Users allowed to bypass authentication
    • +
    • METHODS - A comma-separated list of SIP methods that require authentication (e.g., INVITE, REGISTER, MESSAGE). Required.
    • +
    • PATH_TO_AUTH - The path to a file containing the credentials for the users
    • +
    +

    Example of the authentication file:

    +

    Filename auth.json

    +
    [
    {
    "username": "1001",
    "secret": "1234"
    },
    {
    "username": "john",
    "secret": "1234"
    }
    ]
    +

    Communication and Protobuf Spec

    +

    The Message Dispatcher communicates SimpleAuth service using gRPC. The SimpleAuth, in turn, authenticates SIP requests and forwards them if the request is valid.

    +

    The following is the protobuf definition for the SimpleAuth service:

    +

    ```protobuf
    syntax = "proto3";

    package fonoster.routr.processor.v2beta1;

    import "common.proto";
    import "sipmessage.proto";

    // Processor service
    service Processor {
    // Process Message Request
    rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}
    }

    enum Method {
    UNKNOWN = 0;
    // Communicates user location (hostname, IP)
    REGISTER = 1;
    // Establishes a session
    INVITE = 2;
    // Transports Instant Messages
    MESSAGE = 3;
    // Publishes an event to the Server
    PUBLISH = 4;
    // Notifies the subscriber of a new event
    NOTIFY = 5;
    // Subscribes for Notification from the notifier
    SUBSCRIBE = 6;
    // Confirms an INVITE request
    ACK = 7;
    // Terminates a session
    BYE = 8;
    // Cancels establishing of a session
    CANCEL = 9;
    // Communicates information about the capabilities of calling and receiving SIP phones
    OPTIONS = 10;
    // Provisional Acknowledgement
    PRACK = 11;
    // Sends mid-session information
    INFO = 12;
    // Asks the recipient to issue a call transfer
    REFER = 13;
    // Modifies the state of a session
    UPDATE = 14;
    }

    message NetInterface {
    string host = 1;
    int32 port = 2;
    fonoster.routr.common.v2beta1.Transport transport = 3;
    }

    message MessageRequest {
    // Same as the Call-Id header
    string ref = 1;
    string edge_port_ref = 2;
    Method method = 3;
    NetInterface sender = 4;
    repeated NetInterface listening_points = 5;
    repeated string external_addrs = 6;
    repeated string localnets = 7;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;
    map<string, string> metadata = 9;
    }

    message MessageResponse {
    NetInterface sender = 1;
    fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;
    map<string, string> metadata = 3;
    }
    +

    Link to the protobuf definition.

    +

    Launching the SimpleAuth with Docker

    +

    The SimpleAuth is available as a Docker image from Docker Hub. To launch the SimpleAuth with Docker, you can use the following command:

    +
    docker run -it \
    -p 51903:51903 \
    -e ALLOWLIST=anonymous,1001 \
    -e METHODS=INVITE,REGISTER,MESSAGE \
    -e PATH_TO_AUTH=/path/to/auth.json \
    -v /path/to/auth.json:/path/to/auth.json \
    fonoster/routr-simpleauth
    +

    The previous example will pull the latest version of the SimpleAuth from Docker Hub and launch the service. The service will listen on the default port, 51903, for gRPC requests. Remember, your Docker container must expose the service's ports, too.

    +

    Quick Test with gRPCurl

    +

    One easy way to interact with SimpleAuth for testing and development is to use gRPCurl. The following example shows how to send a SIP Message to the SimpleAuth.

    +
    grpcurl -plaintext \
    -import-path /path/to/protos \
    -proto processor.proto -d '{...}' \
    localhost:51901 \
    fonoster.routr.processor.v2beta1.Processor/ProcessMessage
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/custom-data-with-the-apiserver/index.html b/docs/2.11.5/development/custom-data-with-the-apiserver/index.html new file mode 100644 index 000000000..43b9fadaa --- /dev/null +++ b/docs/2.11.5/development/custom-data-with-the-apiserver/index.html @@ -0,0 +1,31 @@ + + + + + +Custom data with the APIServer | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Custom data with the APIServer

    +

    Whether you run the Routr Connect distribution or build a custom Processor, you can store custom data with the APIServer.

    +

    The APIServer, typically used for Routr Connect, consists of objects with an extended property to store custom data. This extended property is a JSON object you can use to store any data you want.

    +

    When to store custom data

    +

    Store custom data when you need information not part of the standard object. For instance, you might need to store an external identifier for an object, such as keeping the external identifier of a user in your external system.

    +

    You might also need to store information a Processor requires, like the User-Agent of a device an Agent uses, and use that information to adjust the signaling process.

    +

    How to store custom data

    +

    To store custom data, add a property to the extended object. For instance, to add the external identifier of an Agent in your external system, do the following:

    +
    const request = {
    name: "John Doe",
    username: "jdoe",
    privacy: Privacy.PRIVATE,
    domainRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    credentialsRef: "4671371b-ff5d-48b1-aabe-d3c5ca5317a3",
    enabled: true,
    extended: {
    "externalId": "123456789"
    }
    };

    agents.createAgent(request)
    .then(console.log)
    .catch(console.error); // an error occurred
    +

    For additional examples of how to store custom data, see the Node SDK and search for "extended."

    +

    How to retrieve custom data

    +

    To retrieve custom data, read the extended property. For instance, to retrieve the external identifier of a user in your external system, do the following:

    +
    agents.getAgent("8571371b-6f5d-78b1-aabe-93c5c75317a3")
    .then(agent => {
    console.log(agent.extended.externalId);
    })
    .catch(console.error); // an error occurred
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/development-mode-with-gitpod/index.html b/docs/2.11.5/development/development-mode-with-gitpod/index.html new file mode 100644 index 000000000..55662a849 --- /dev/null +++ b/docs/2.11.5/development/development-mode-with-gitpod/index.html @@ -0,0 +1,49 @@ + + + + + +Development with Gitpod | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Development with Gitpod

    +

    Development mode with Gitpod is a great way to get familiar with Routr. Gitpod is a cloud-based IDE that allows you to develop and test your code in a browser. Gitpod is free for open-source projects and offers a free trial for private repositories.

    +

    To launch a Gitpod workspace, click the button below:

    +

    Open in Gitpod

    +

    This link will open a new tab on your browser and start a new workspace, which may take a few minutes. The starting process might take a few minutes. Once the workspace is ready, you will see a terminal and a file explorer similar to VSCode.

    +

    While the workspace starts, let's review the steps required to forward SIP signaling traffic from your local computer to Gitpod.

    +

    First, add your public SSH keys to your Gitpod account by going to the Gitpod account keys and adding your public key. You can do this using the link below:

    +

    https://gitpod.io/user/keys

    +

    Gitpod account keys

    +

    On Linux or macOS, you can find your public key by running the following command in your terminal:

    +
    cat ~/.ssh/id_rsa.pub
    +

    Or, if you are using Windows, you can find your public key using this command in your terminal:

    +
    cat %USERPROFILE%\.ssh\id_rsa.pub
    +

    If you don't have a public key, you can generate one by running the following command in your terminal:

    +
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    +

    Once you add your key, find your Gitpod workspace and click the "More" button. Then, select "Connect via SSH."

    +

    https://gitpod.io/workspaces

    +

    Gitpod workspace

    +

    You want to be able to access port 5060 from your local computer to connect to Routr using a SIPUA. We must create a port-forward from our local machine to the Gitpod workspace to do that.

    +

    To create the port forward, take the SSH connection string and add -L 5060:localhost:5060 to the end of the line. For example, your command might look like this:

    +
    ssh <workspace-ssh-connection> -L 5060:localhost:5060
    +

    Be sure to replace "workspace SSH connection" with your local connection.

    +

    Here is an example of what the command might look like:

    +
    ssh fonoster-routr-mn8nsx0d9px@fonoster-routr-mn8nsx0d9px.ssh.ws-us90.gitpod.io -L 5060:localhost:5060 
    +

    This command forwards traffic from your local port 5060 to your Gitpod workspace's port 5060, allowing you to connect via SIP.

    +
    +

    Unfortunately, SSH does not natively support forwarding UDP traffic. It only provides port forwarding functionality for TCP connections. Therefore, you cannot enable UDP delivering directly with the previous SSH Command.

    +
    +

    This setup uses the "simpledata" implementation of the APIServer, which uses YAML files as the data source. Here is a list of the YAML files that make up the configuration:

    +

    https://github.com/fonoster/routr/blob/main/config/resources

    +

    Feel free to explore these files and make changes as needed.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/extending-the-ctl/index.html b/docs/2.11.5/development/extending-the-ctl/index.html new file mode 100644 index 000000000..f420d4c9d --- /dev/null +++ b/docs/2.11.5/development/extending-the-ctl/index.html @@ -0,0 +1,45 @@ + + + + + +Extending the Command-Line Tool | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Extending the Command-Line Tool

    +

    Routr's command-line tool (CTL) is a powerful tool that lets you manage your Routr Connect server. Our team built the CTL with Oclif, a framework for creating command-line tools in Node.js.

    +

    You can extend the CTL by creating plugins with Oclif. This section guides you on how to extend the CTL with plugins.

    +

    Installing the Command-Line Tool

    +

    The CTL comes as an npm package. To install it, you run the following command:

    +
    npm install --location=global @routr/ctl
    +

    Using the Command-Line Tool

    +

    The CTL includes all the commands you need to interact with your Routr Connect server. Most commands follow a CRUD pattern. For managing your Agents, for instance, you have to create, delete, describe, and get commands.

    +

    Most commands adopt the {substantive} {verb} pattern. For instance, rctl agents get retrieves a list of agents.

    +

    If you want to extend the CTL, you create a plugin. Since developers built the CTL with Oclif, you can use the same framework to develop new plugins.

    +

    Creating a plugin

    +

    To create a new plugin, you start by running the following command:

    +
    npx oclif generate mycommand
    +

    The system will prompt you for some information about your plugin. For this example, let's choose mycommand as the name.

    +

    In your mycommand directory, you'll find the following structure:

    +

    [Directory structure omitted for brevity]

    +

    Looking at the src/commands/hello/index.ts file, you see the following code:

    +

    [Sample TypeScript code omitted for brevity]

    +

    This code defines a simple command that takes two arguments, person and from, and then prints a greeting to the console.

    +

    After you update your plugin, you install and test it by running the following command from within the plugin directory:

    +
    rctl plugins link . # Installing in development mode
    +

    For production mode installation of your plugin, you use the following command:

    +
    rctl plugins install .
    +

    If you have published your plugin to NPM, you can install it with this command:

    +
    rctl plugins install mycommand
    +

    To see your new command in action, you run the command with the --help flag and follow the instructions.

    +

    With this example, you see how straightforward it is to create a new command. You can use the same pattern to create commands for Routr Connect and even utilize the Node.js SDK to interact with the server.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/introduction/index.html b/docs/2.11.5/development/introduction/index.html new file mode 100644 index 000000000..54e59ffee --- /dev/null +++ b/docs/2.11.5/development/introduction/index.html @@ -0,0 +1,35 @@ + + + + + +Introduction | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Introduction

    +

    Developers and implementors looking to customize Routr for their specific use cases should refer to this section. Here, you'll learn about the core components, their interactions, and the steps to create custom Processors and Middleware.

    +

    Additionally, we'll cover how to use tools such as Docker, Docker Compose, Helm, and Kubernetes for orchestrating the components. You'll also discover how to extend the APIServer for your needs and build plugins for the Command-line Tool.

    +

    How to read this section

    +

    The concepts in this section build on top of each other. Therefore, we recommend reading the information sequence. However, if you are already familiar with the concepts, you can jump to the page that interests you the most.

    +

    Tooling and dependencies

    +

    The only requirements to build and run Routr are Java and NodeJS. However, we recommend considering the following tools to make the development process easier:

    +
      +
    • Docker: We use Docker to build and run individual components
    • +
    • Docker Compose: We use Docker Compose to orchestrate the components
    • +
    • Helm: Helm helps us to deploy Routr in Kubernetes
    • +
    • Kubernetes: Kubernetes is the platform where we deploy Routr for large scale deployments
    • +
    • Kubectl: Kubectl is the command-line tool for Kubernetes
    • +
    • sngrep: A tool for monitoring SIP traffic (You could use Wireshark as well)
    • +
    • grpcurl: A command-line tool for interacting with gRPC servers
    • +
    +

    If you don't have a Kubernetes cluster, you can use Minikube or Docker Desktop with Kubernetes enabled.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/metrics-events-logs-and-traces/index.html b/docs/2.11.5/development/metrics-events-logs-and-traces/index.html new file mode 100644 index 000000000..20c53cefa --- /dev/null +++ b/docs/2.11.5/development/metrics-events-logs-and-traces/index.html @@ -0,0 +1,20 @@ + + + + + +Everything about MELT | Routr Docs + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/orchestration-with-docker/index.html b/docs/2.11.5/development/orchestration-with-docker/index.html new file mode 100644 index 000000000..bca106f75 --- /dev/null +++ b/docs/2.11.5/development/orchestration-with-docker/index.html @@ -0,0 +1,20 @@ + + + + + +Orchestration with Docker | Routr Docs + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/docs/2.11.5/development/orchestration-with-kubernetes/index.html b/docs/2.11.5/development/orchestration-with-kubernetes/index.html new file mode 100644 index 000000000..8ab271765 --- /dev/null +++ b/docs/2.11.5/development/orchestration-with-kubernetes/index.html @@ -0,0 +1,20 @@ + + + + + +Orchestration with Kubernetes | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Orchestration with Kubernetes

    +

    Coming soon.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/quick-start/index.html b/docs/2.11.5/development/quick-start/index.html new file mode 100644 index 000000000..595c29626 --- /dev/null +++ b/docs/2.11.5/development/quick-start/index.html @@ -0,0 +1,49 @@ + + + + + +Quick Start | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Quick Start

    +

    Before starting the development, you need to install the following tools:

    +
      +
    • NodeJS (>=16.14)
    • +
    • JDK (>=11)
    • +
    +

    For NodeJS, we recommend using nvm to manage your NodeJS versions.

    +

    Clone and Build the Project

    +

    To get started, first, clone the repository:

    +
    git clone https://github.com/fonoster/routr
    +

    The previous command will create a directory called routr with the project's source code.

    +

    Next, set the JAVA_HOME environment variable to the location of your JDK installation:

    +
    export JAVA_HOME=/path/to/jdk
    +

    Finally, build the project:

    +
    cd routr
    npm run make
    +

    The previous command will install all the dependencies and build the project. If everything goes well, you should see no errors.

    +

    Run the Project

    +

    To run all the components, you can use the following command:

    +
    npm run start
    +

    The previous command will start the EdgePort, Location Service, MessageDispatcher, Connect Processor, Requester, APIServer (simpledata), and Registry.

    +

    As you change the source code, Nodemon will automatically restart the components except for the EdgePort and Requester, which are written in Java and require a manual build and restart.

    +

    You also have the option to run each component individually. For example, if your use case only requires the EdgePort and the Location Service, you can run the following command:

    +

    In one terminal:

    +
    npm run start:edgeport
    +

    Example output:

    +
    > start:edgeport
    > cross-env NODE_ENV=dev LOGS_LEVEL=verbose ./mods/edgeport/edgeport.sh

    2023-09-22 12:40:48.454 [info]: (edgeport) GRPCSipListener.java starting edgeport ref = edgeport-01 at 0.0.0.0
    2023-09-22 12:40:48.455 [info]: (edgeport) GRPCSipListener.java localnets list [127.0.0.1/8,10.111.221.2/24]
    2023-09-22 12:40:48.456 [info]: (edgeport) GRPCSipListener.java external hosts list [10.111.220.2,sip01.edgeport.net]
    2023-09-22 12:40:48.578 [info]: (edgeport) HealthCheck.java starting health check on port 8080 and endpoint /healthz
    +

    In a separate terminal:

    +
    npm run start:location
    +

    Example output:

    +
    > start:location
    > cross-env NODE_ENV=dev LOGS_LEVEL=verbose CONFIG_PATH=$(pwd)/config/location.yaml nodemon mods/location/src/runner

    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): mods/**/*
    [nodemon] watching extensions: ts
    [nodemon] starting `ts-node mods/location/src/runner.ts`
    2023-09-05 12:41:38.735 [info]: (location) using memory as cache provider {}
    2023-09-05 12:41:38.739 [info]: (common) starting routr service {"name":"location","bindAddr":"0.0.0.0:51902"}
    +

    Please see the scripts section of package.json for a complete list of available commands.

    + + \ No newline at end of file diff --git a/docs/2.11.5/development/testing-with-seet/index.html b/docs/2.11.5/development/testing-with-seet/index.html new file mode 100644 index 000000000..c0a0451c2 --- /dev/null +++ b/docs/2.11.5/development/testing-with-seet/index.html @@ -0,0 +1,20 @@ + + + + + +Testing with SEET | Routr Docs + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/docs/2.11.5/faqs/index.html b/docs/2.11.5/faqs/index.html new file mode 100644 index 000000000..f53e2ed86 --- /dev/null +++ b/docs/2.11.5/faqs/index.html @@ -0,0 +1,36 @@ + + + + + +FAQs | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    FAQs

    +

    What is Routr?

    +

    Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

    +

    What dependencies does Routr have?

    +

    The Core of Routr has no external dependencies, although you might need Redis in certain situations. For example, if you need to scale the Location service horizontally, use Redis as a shared cache.

    +

    In Connect Mode, Routr relies on PostgreSQL and Redis. However, you can orchestrate both dependencies using Docker Compose or Kubernetes.

    +

    How does Routr compare with other SIP servers

    +

    Routr is similar to Kamalio and OpenSIPS because it is a programmable SIP server. However, Routr architecture is different. In Routr, we use a microservice architecture, meaning each component is a separate service. This design allows you to scale each service independently.

    +

    For example, adding more service instances can scale the Location service horizontally. This design also allows you to replace any component with your implementation. For example, you can implement your security Middleware and replace the default one.

    +

    Is Routr a Media Server?

    +

    Routr is not a media server. By itself, Routr does not handle media. However, you can use Routr as a frontend for FreeSWITCH or Asterisk.

    +
    +

    This is useful when you need load balancing

    +
    +

    Which language is the team using to build Routr?

    +

    The EdgePort, which processes SIP messages, is written in Java. We implement the rest of the services using NodeJS.

    +

    What license does Routr use?

    +

    We release Routr under the MIT license.

    + + \ No newline at end of file diff --git a/docs/2.11.5/overview/architecture/index.html b/docs/2.11.5/overview/architecture/index.html new file mode 100644 index 000000000..495bbd875 --- /dev/null +++ b/docs/2.11.5/overview/architecture/index.html @@ -0,0 +1,31 @@ + + + + + +Architecture | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Architecture

    +

    Routr&#39;s architecture diagram

    +

    Summary

    +

    Routr takes a radically different approach to SIP servers. Instead of using a monolithic architecture, Routr comprises a set of loosely coupled services that communicate with each other using gRPC. This approach allows Routr to be easily extended, customized, and scaled.

    +

    Specification

    +

    With Routr v2, we introduced a set of specifications describing each service's behavior. The specifications are the following:

    + +

    The Core specification describes the core components and their behavior. It explains how to transform SIP messages into protocol buffers and how to handle SIP routing.

    +

    The Connect specification describes how Routr implements the SIP Connect specification. It explains how to handle SIP routing for Agents, Peers, Trunks, Numbers, ACL, and more.

    +

    Most users will not need to read the specifications. However, if you want to extend Routr's functionality, we recommend you read them.

    + + \ No newline at end of file diff --git a/docs/2.11.5/overview/concepts/index.html b/docs/2.11.5/overview/concepts/index.html new file mode 100644 index 000000000..f41b12c25 --- /dev/null +++ b/docs/2.11.5/overview/concepts/index.html @@ -0,0 +1,87 @@ + + + + + +Concepts | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Concepts

    +

    Routr's approach to SIP is different from other SIP servers. For example, Routr aims to be cloud-native first. It is designed to run in a containerized environment, like Docker or Kubernetes, and features a microservices architecture.

    +

    The following concepts are essential to understand when working with Routr, but remember that we will cover them in more detail in later sections.

    +

    EdgePort

    +

    The EdgePort component sits at the network's edge and is part of the CORE specification. It is responsible for receiving and forwarding SIP Messages.

    +

    The EdgePort service takes SIP Messages and converts them into protobuf messages. In addition to the SIP Message, we add all the metadata required for routing, including the IP of the entry point of the request, which allows us to calculate the correct path for the message statelessly.

    +

    Another essential aspect of EdgePort is that it cooperates to ensure messages follow the correct path. That means you don't need a specialized load balance in front of Routr.

    +

    Below is a diagram that demonstrates the collaboration between EdgePort and the Message Dispatcher

    +EdgePort diagram +

    One important consideration when deploying a network is the protocol for Transport. We recommend always using a connection-oriented transport such as TCP,TLS, WS, or WSS.

    +

    Downstream Processors and Middleware all use the same gRPC interface. Because they all share the same structure, we can create processing services in any programming language while maintaining the same core functionality.

    +

    A minimal EdgePort configuration looks as follows:

    +
    # Example EdgePort configuration
    kind: EdgePort
    apiVersion: v2beta1
    ref: edgeport-01
    metadata:
    region: default
    spec:
    processor:
    addr: dispatcher:51901
    methods:
    - REGISTER
    - INVITE
    - ACK
    - BYE
    - CANCEL
    transport:
    - protocol: udp
    port: 5060
    +

    Message Dispatcher

    +

    The Message Dispatcher, or Dispatcher for short, is a service between the EdgePort and the Processor. It is responsible for routing SIP Messages to the correct Processor.

    +

    The Dispatcher is a stateless service that uses a simple algorithm to determine the correct processing service. The component takes the SIP Messages and applies a matching function to choose the proper Processor.

    +

    The matching function is a Javascript function that takes the SIP Message and returns a boolean value. The Dispatcher will forward the message to the first Processor that matches the criteria. Therefore, the order of the Processors and the matching function is essential to ensure the correct routing.

    +

    The matchFunc is a javascript function that leverages the JSON representation of the SIPMessage protobuf.

    +

    This example features a Dispatcher that matches MESSAGE requests to the IM Processor and all others to the Connect Processor.

    +
    kind: MessageDispatcher
    apiVersion: v2beta1
    ref: message-dispatcher
    spec:
    bindAddr: 0.0.0.0:51901
    processors:
    - ref: im-processor
    addr: im:51904
    matchFunc: req => req.method === "MESSAGE"
    methods:
    - MESSAGE
    - ref: connect-processor
    addr: connect:51904
    matchFunc: req => true
    methods:
    - REGISTER
    - INVITE
    - ACK
    - BYE
    - CANCEL
    +

    The following examples show typical matching functions:

    +

    Match all SIP Messages.

    +
    req => true
    +

    Match SIP Messages with a specific method.

    +
    req => req.method === "MESSAGE"
    +

    Match SIP Messages with a specific method and a specific header.

    +
    req => req.method === "MESSAGE" && req.message.from.address.uri.user === "alice"
    +

    Match SIP Messages with a specific User-Agent header.

    +
    req => req.message.extensions.find(e => e.name === "User-Agent" && e.value.includes("Zoiper"))
    +

    Location service

    +

    In Routr, the Location Service serves two primary purposes. The first purpose is to locate the route to an endpoint in the location table. The second is to load balance requests.

    +

    Routr's load balancing is done at the Location Service level and occurs in the context of Peers. To better explain this, let's take a closer look at some applications where this is useful.

    +

    For example, you can create a Peer configuration and share the same credentials if you have multiple Asterisk servers. By doing this, Routr will send a request to the instance of Asterisk according to the load-balancing algorithm you have selected.

    +

    Two balancing algorithms are available. The first is round-robin, and the second is least-sessions.

    +

    Now, let's consider a situation where you want to deploy the server and send all PSTN traffic to a conference room in Asterisk. For such a scenario, you must configure a Peer to represent your feature server and a Number to route calls from the PSTN.

    +

    To do this, create a Peer configuration for your Asterisk server similar to the following:

    +
    apiVersion: v2beta1
    kind: Peer
    ref: peer-01
    metadata:
    name: Asterisk (Media Server)
    spec:
    aor: sip:conference@sip.local
    username: asterisk
    credentialsRef: credentials-01
    loadBalancing:
    withSessionAffinity: true
    algorithm: least-sessions
    +

    Notice that the load balancing section sets the withSessionAffinity to true. We need session affinity to ensure that all calls related to the conference arrive on the same Asterisk server.

    +

    Every Asterisk server that registers using the asterisk username will join the same group under the sip:conference@sip.local Address of Record (AOR).

    +

    Middlewares

    +

    Middleware resembles Processors because they both use the same protobuf contract but serve different purposes. While Processors hold feature logic, Middlewares addresses cross-cutting concerns like authentication, authorization, rate limiting, etc.

    +

    Some use cases for Middlewares include:

    +
      +
    • Authentication and Authorization
    • +
    • Rate limiting
    • +
    • Circuit breaking
    • +
    • Logging, Metrics, and Tracing
    • +
    • Request and response validation
    • +
    • Data transformation and normalization
    • +
    • CDRs generation
    • +
    +

    Processors and Middlewares differ in that you execute Middlewares in a chain, making their execution order crucial. Additionally, you can include multiple Middlewares in your deployment but only one Processor.

    +

    Processors

    +

    Processors are a way to extend the functionality of Routr, and implementors can add custom logic to the system. Processors are implemented as a gRPC service and use the Alterations API to modify SIP messages.

    +

    The simplest possible Processor is the "Echo Processor," which returns the SIP Message to the EdgePort. The following example shows how to create an Echo Processor using Node.js.

    +
    const Processor = require("@routr/processor").default;
    const { MessageRequest, Response } = require("@routr/processor");

    new Processor({ bindAddr: "0.0.0.0:51904", name: "echo" }).listen(
    (req: MessageRequest, res: Response) => {
    logger.verbose("got new request: ")
    logger.verbose(JSON.stringify(req, null, " "))
    res.sendOk()
    }
    )
    +

    Alterations

    +

    Alterations let you modify SIP messages. We implement Alterations as Javascript functions that a Processor or Middleware executes.

    +

    The methods for Alterations adhere to a functional programming style. In this approach, one function's output becomes the following function's input. Here's an example of how to use the Alterations API to change a SIP message:

    +
    const { Alterations } = require('@routr/processor')
    const { pipe } = require("fp-ts/function");

    function messageProcessing(req: MessageRequest, route: Route): MessageRequest {
    const requestOut = pipe(
    reqIn,
    //example of an Alteration method with two arities
    Alterations.addSelfVia(route),
    Alterations.addSelfRecordRoute(route),
    Alterations.addRouteToPeerEdgePort(route),
    Alterations.addRouteToNextHop(route),
    //example of an Alteration method with one arity
    Alterations.addXEdgePortRef,
    Alterations.decreaseMaxForwards
    )

    return requestOut
    }
    +

    If you need to create a new Alteration, we suggest you follow a similar approach to the one used by the Alterations API. That is, create a function that takes a SIP message as input and returns a SIP message as output.

    +

    Registry service

    +

    The Registry component sends outbound registration to trunking services. You need this component when you set the sendRegister option of your Trunks to true. To send requests to the EdgePort, the Registry service depends on the Requester service.

    +

    Available configurations include the following:

    +
    PropertyDescriptionRequired
    requesterAddrAddress of service to send requestsYes
    apiAddrAddress of API serviceYes
    registerIntervalInterval to send registration requestsYes
    cacheCache configurationYes
    methodsAcceptable SIP Methods (reserved for future use)No
    edgePortsList of EdgePorts for outbound registrationsYes
    edgePorts.addressAddress of EdgePortYes
    edgePorts.regionRegion of EdgePort (reserved for future use)No
    +

    Here is an example of a Trunk configuration that requires registration:

    +
    kind: Registry
    apiVersion: v2beta1
    spec:
    requesterAddr: requester:51909
    apiAddr: apiserver:51907
    registerInterval: 20
    cache:
    provider: memory
    methods:
    - INVITE
    - MESSAGE
    edgePorts:
    - address: sip01.edgeport.net:5060
    region: us-east1
    - address: sip02.edgeport.net:6060
    +

    Requester

    +

    The Requester is a service that takes a gRPC request, converts it into a SIP message, and forwards it to its destination. It is a dependency of the Registry service.

    + + \ No newline at end of file diff --git a/docs/2.11.5/overview/deploy-with-docker/index.html b/docs/2.11.5/overview/deploy-with-docker/index.html new file mode 100644 index 000000000..59288f467 --- /dev/null +++ b/docs/2.11.5/overview/deploy-with-docker/index.html @@ -0,0 +1,44 @@ + + + + + +Deploy with Docker | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Deploy with Docker

    +

    Deploying Routr with Docker is the easiest way to get started. This guide will walk you through the process of deploying Routr with Docker.

    +

    You will need Docker and Docker Compose installed on your machine as a prerequisite. If you don't have them installed, you can follow the instructions here.

    +
    +

    Connect Mode is the most common way to deploy Routr. It is our implementation of the SIPConnect standard. The Connect Mode describes SIP routing regarding Agents, Peers, Trunks, Numbers, and ACL. More on this later.

    +
    +

    Deploying Routr

    +

    First, create a directory named "routr". Navigate into the new folder, and then copy the content below:

    +

    Filename: compose.yaml

    +
    version: "3"

    services:
    routr:
    image: fonoster/routr-one:latest
    environment:
    EXTERNAL_ADDRS: ${DOCKER_HOST_ADDRESS}
    ports:
    - 51908:51908
    - 5060:5060/udp
    volumes:
    - shared:/var/lib/postgresql/data

    volumes:
    shared:
    +

    Then, start the server with:

    +
    # Be sure to replace with your IP address
    DOCKER_HOST_ADDRESS=192.168.1.3 docker-compose up
    +

    Wait a few seconds for the container to initialize. Afterward, you can verify the status of the container using:

    +
    docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'
    +

    You should see something like this:

    +
    CONTAINER ID  IMAGE                                     STATUS
    6c63fd573768 fonoster/routr-one:latest Up About a minute
    +

    If the status of your service is "Up," you are ready to go.

    +

    Finally, install the command-line tool and start building your SIP Network.

    +

    You can install the tool with npm as follows:

    +
    npm install --location=global @routr/ctl
    +

    Here is an example of creating an SIP Domain:

    +
    rctl domains create --insecure
    +
    +

    The --insecure flag is required as we did not set up the TLS settings.

    +
    +

    For additional examples, refer to the command-line documentation.

    + + \ No newline at end of file diff --git a/docs/2.11.5/overview/introduction/index.html b/docs/2.11.5/overview/introduction/index.html new file mode 100644 index 000000000..a0bbc71dd --- /dev/null +++ b/docs/2.11.5/overview/introduction/index.html @@ -0,0 +1,32 @@ + + + + + +introduction | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    +

    Community banner

    +

    Welcome

    +

    On behalf of the Routr team, welcome to this documentation, and thank you for your interest in the project. We are thrilled to have you here and are committed to assisting you in meeting your real-time communication needs.

    +

    What is Routr?

    +

    Routr is a lightweight SIP proxy, location server, registrar, and foundational element for your SIP infrastructure. Due to its modular design, you can enhance Routr's capabilities by integrating custom modules, which we call Processors and Middlewares. Our primary objective is to help you incorporate real-time communication into your application or service.

    +

    Why Routr?

    +

    At Fonoster Inc., we are building an open-source alternative to Twilio. We quickly realized the need for a SIP server to power our SIP infrastructure. We needed a SIP server that was easy to deploy in the cloud and easily integrated with our services. However, we noticed that the existing SIP servers in the market were either too complex or expensive to deploy. Because of this, we decided to build our own SIP server. We called it Routr.

    +

    We hope that by making Routr open-source, we can help companies and developers build their own SIP infrastructure. We also hope that by making Routr open-source, we can help the SIP community to grow.

    +

    Who is Routr for?

    +

    Routr is for anyone who wants to build a SIP infrastructure. It is for developers who want to add real-time communication to their applications. It is for companies that want to develop their own SIP infrastructure. It is for the SIP community.

    +

    What is the difference between Routr and other SIP servers?

    +

    Routr goes beyond the SIP server functionality and could be considered a framework for SIP applications. Unlike other SIP servers, Routr stands out as a cloud-native application. Orchestrating Routr with Docker or Kubernetes is a breeze.

    +

    We also aspired to make Routr developer-friendly. We aim to provide tools for developers to extend every aspect of Routr's functionality.

    + + \ No newline at end of file diff --git a/docs/2.11.5/tutorials/deploying-to-civo-with-helm/index.html b/docs/2.11.5/tutorials/deploying-to-civo-with-helm/index.html new file mode 100644 index 000000000..e464dafe3 --- /dev/null +++ b/docs/2.11.5/tutorials/deploying-to-civo-with-helm/index.html @@ -0,0 +1,20 @@ + + + + + +Deploying to Civo with Helm | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Deploying to Civo with Helm

    +

    Coming soon.

    + + \ No newline at end of file diff --git a/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser/index.html b/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser/index.html new file mode 100644 index 000000000..42365ec75 --- /dev/null +++ b/docs/2.11.5/tutorials/ephemeral-agents-in-the-browser/index.html @@ -0,0 +1,20 @@ + + + + + +Ephemeral Agents in the Browser | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Ephemeral Agents in the Browser

    +

    Coming soon.

    + + \ No newline at end of file diff --git a/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes/index.html b/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes/index.html new file mode 100644 index 000000000..8dfcc48dd --- /dev/null +++ b/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetes/index.html @@ -0,0 +1,20 @@ + + + + + +Intercom System with Routr and Kubernetes | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Intercom System with Routr and Kubernetes

    +

    Coming soon.

    + + \ No newline at end of file diff --git a/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr/index.html b/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr/index.html new file mode 100644 index 000000000..001211bf8 --- /dev/null +++ b/docs/2.11.5/tutorials/load-balancing-asterisk-with-routr/index.html @@ -0,0 +1,20 @@ + + + + + +Load-balancing Asterisk with Routr | Routr Docs + + + + + + + + + + +
    Version: 2.11.5

    Load-balancing Asterisk with Routr

    +

    Coming soon.

    + + \ No newline at end of file diff --git a/img/architecture_v2.png b/img/architecture_v2.png index 38d37811c..38677403a 100644 Binary files a/img/architecture_v2.png and b/img/architecture_v2.png differ diff --git a/search/index.html b/search/index.html index ed7e35252..43e9a1673 100644 --- a/search/index.html +++ b/search/index.html @@ -2,18 +2,18 @@ - + Search the documentation | Routr Docs - - - + + + -

    Search the documentation

    +

    Search the documentation

    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 44b8792b4..37863ec8a 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://routr.io/searchweekly0.5https://routr.io/docs/1.x.x/administration/cli/cheatsheetweekly0.5https://routr.io/docs/1.x.x/administration/cli/installationweekly0.5https://routr.io/docs/1.x.x/administration/cli/remote-accessweekly0.5https://routr.io/docs/1.x.x/administration/webconsoleweekly0.5https://routr.io/docs/1.x.x/api/agents/createweekly0.5https://routr.io/docs/1.x.x/api/agents/deleteweekly0.5https://routr.io/docs/1.x.x/api/agents/getweekly0.5https://routr.io/docs/1.x.x/api/agents/listweekly0.5https://routr.io/docs/1.x.x/api/agents/updateweekly0.5https://routr.io/docs/1.x.x/api/config/getweekly0.5https://routr.io/docs/1.x.x/api/config/updateweekly0.5https://routr.io/docs/1.x.x/api/domains/createweekly0.5https://routr.io/docs/1.x.x/api/domains/deleteweekly0.5https://routr.io/docs/1.x.x/api/domains/getweekly0.5https://routr.io/docs/1.x.x/api/domains/listweekly0.5https://routr.io/docs/1.x.x/api/domains/updateweekly0.5https://routr.io/docs/1.x.x/api/gateways/createweekly0.5https://routr.io/docs/1.x.x/api/gateways/deleteweekly0.5https://routr.io/docs/1.x.x/api/gateways/getweekly0.5https://routr.io/docs/1.x.x/api/gateways/listweekly0.5https://routr.io/docs/1.x.x/api/gateways/updateweekly0.5https://routr.io/docs/1.x.x/api/location/createweekly0.5https://routr.io/docs/1.x.x/api/location/deleteweekly0.5https://routr.io/docs/1.x.x/api/location/listweekly0.5https://routr.io/docs/1.x.x/api/numbers/createweekly0.5https://routr.io/docs/1.x.x/api/numbers/deleteweekly0.5https://routr.io/docs/1.x.x/api/numbers/getweekly0.5https://routr.io/docs/1.x.x/api/numbers/listweekly0.5https://routr.io/docs/1.x.x/api/numbers/updateweekly0.5https://routr.io/docs/1.x.x/api/overviewweekly0.5https://routr.io/docs/1.x.x/api/peers/createweekly0.5https://routr.io/docs/1.x.x/api/peers/deleteweekly0.5https://routr.io/docs/1.x.x/api/peers/getweekly0.5https://routr.io/docs/1.x.x/api/peers/listweekly0.5https://routr.io/docs/1.x.x/api/peers/updateweekly0.5https://routr.io/docs/1.x.x/api/registryweekly0.5https://routr.io/docs/1.x.x/api/status/getweekly0.5https://routr.io/docs/1.x.x/api/status/updateweekly0.5https://routr.io/docs/1.x.x/api/sys/infoweekly0.5https://routr.io/docs/1.x.x/api/sys/logsweekly0.5https://routr.io/docs/1.x.x/api/tokenweekly0.5https://routr.io/docs/1.x.x/conceptsweekly0.5https://routr.io/docs/1.x.x/configuration/agentsweekly0.5https://routr.io/docs/1.x.x/configuration/domainsweekly0.5https://routr.io/docs/1.x.x/configuration/gatewaysweekly0.5https://routr.io/docs/1.x.x/configuration/generalweekly0.5https://routr.io/docs/1.x.x/configuration/numbersweekly0.5https://routr.io/docs/1.x.x/configuration/peersweekly0.5https://routr.io/docs/1.x.x/configuration/usersweekly0.5https://routr.io/docs/1.x.x/guides/basic-setupweekly0.5https://routr.io/docs/1.x.x/guides/routr-as-asterisk-frontendweekly0.5https://routr.io/docs/1.x.x/guides/running-on-kubernetesweekly0.5https://routr.io/docs/1.x.x/guides/running-with-docker-or-composeweekly0.5https://routr.io/docs/1.x.x/guides/securing-the-signaling-pathweekly0.5https://routr.io/docs/1.x.x/introduction/communityweekly0.5https://routr.io/docs/1.x.x/introduction/comparisonweekly0.5https://routr.io/docs/1.x.x/introduction/faqweekly0.5https://routr.io/docs/1.x.x/introduction/glossaryweekly0.5https://routr.io/docs/1.x.x/introduction/installationweekly0.5https://routr.io/docs/1.x.x/introduction/mediaweekly0.5https://routr.io/docs/1.x.x/introduction/overviewweekly0.5https://routr.io/docs/1.x.x/introduction/performance-tests/user-locationweekly0.5https://routr.io/docs/1.x.x/introduction/roadmapweekly0.5https://routr.io/docs/1.x.x/introduction/test-planweekly0.5https://routr.io/docs/1.x.x/welcomeweekly0.5https://routr.io/docs/2.0.0/changelogweekly0.5https://routr.io/docs/2.0.0/communityweekly0.5https://routr.io/docs/2.0.0/connect/command-line/ctlweekly0.5https://routr.io/docs/2.0.0/connect/command-line/overviewweekly0.5https://routr.io/docs/2.0.0/connect/conceptsweekly0.5https://routr.io/docs/2.0.0/connect/home-or-office-setupweekly0.5https://routr.io/docs/2.0.0/connect/introductionweekly0.5https://routr.io/docs/2.0.0/connect/nodesdk/overviewweekly0.5https://routr.io/docs/2.0.0/connect/nodesdk/sdkweekly0.5https://routr.io/docs/2.0.0/connect/quick-start/dockerweekly0.5https://routr.io/docs/2.0.0/connect/quick-start/kubernetesweekly0.5https://routr.io/docs/2.0.0/connect/securing-the-serverweekly0.5https://routr.io/docs/2.0.0/connect/sending-call-events-to-natsweekly0.5https://routr.io/docs/2.0.0/connect/webrtc-supportweekly0.5https://routr.io/docs/2.0.0/contributingweekly0.5https://routr.io/docs/2.0.0/development/alterations/methodsweekly0.5https://routr.io/docs/2.0.0/development/alterations/overviewweekly0.5https://routr.io/docs/2.0.0/development/building-a-chat-applicationweekly0.5https://routr.io/docs/2.0.0/development/building-a-middlewareweekly0.5https://routr.io/docs/2.0.0/development/building-a-processorweekly0.5https://routr.io/docs/2.0.0/development/building-a-scaip-processorweekly0.5https://routr.io/docs/2.0.0/development/components/apiserverweekly0.5https://routr.io/docs/2.0.0/development/components/dispatcherweekly0.5https://routr.io/docs/2.0.0/development/components/edgeportweekly0.5https://routr.io/docs/2.0.0/development/components/locationweekly0.5https://routr.io/docs/2.0.0/development/components/overviewweekly0.5https://routr.io/docs/2.0.0/development/components/registryweekly0.5https://routr.io/docs/2.0.0/development/components/requesterweekly0.5https://routr.io/docs/2.0.0/development/components/rtprelayweekly0.5https://routr.io/docs/2.0.0/development/components/simpleauthweekly0.5https://routr.io/docs/2.0.0/development/custom-data-with-the-apiserverweekly0.5https://routr.io/docs/2.0.0/development/development-mode-with-gitpodweekly0.5https://routr.io/docs/2.0.0/development/extending-the-ctlweekly0.5https://routr.io/docs/2.0.0/development/introductionweekly0.5https://routr.io/docs/2.0.0/development/metrics-events-logs-and-tracesweekly0.5https://routr.io/docs/2.0.0/development/orchestration-with-dockerweekly0.5https://routr.io/docs/2.0.0/development/orchestration-with-kubernetesweekly0.5https://routr.io/docs/2.0.0/development/quick-startweekly0.5https://routr.io/docs/2.0.0/development/testing-with-seetweekly0.5https://routr.io/docs/2.0.0/faqsweekly0.5https://routr.io/docs/2.0.0/overview/architectureweekly0.5https://routr.io/docs/2.0.0/overview/conceptsweekly0.5https://routr.io/docs/2.0.0/overview/deploy-with-dockerweekly0.5https://routr.io/docs/2.0.0/overview/introductionweekly0.5https://routr.io/docs/2.0.0/tutorials/deploying-to-civo-with-helmweekly0.5https://routr.io/docs/2.0.0/tutorials/ephemeral-agents-in-the-browserweekly0.5https://routr.io/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetesweekly0.5https://routr.io/docs/2.0.0/tutorials/load-balancing-asterisk-with-routrweekly0.5https://routr.io/weekly0.5 \ No newline at end of file +https://routr.io/searchweekly0.5https://routr.io/docs/1.x.x/administration/cli/cheatsheetweekly0.5https://routr.io/docs/1.x.x/administration/cli/installationweekly0.5https://routr.io/docs/1.x.x/administration/cli/remote-accessweekly0.5https://routr.io/docs/1.x.x/administration/webconsoleweekly0.5https://routr.io/docs/1.x.x/api/agents/createweekly0.5https://routr.io/docs/1.x.x/api/agents/deleteweekly0.5https://routr.io/docs/1.x.x/api/agents/getweekly0.5https://routr.io/docs/1.x.x/api/agents/listweekly0.5https://routr.io/docs/1.x.x/api/agents/updateweekly0.5https://routr.io/docs/1.x.x/api/config/getweekly0.5https://routr.io/docs/1.x.x/api/config/updateweekly0.5https://routr.io/docs/1.x.x/api/domains/createweekly0.5https://routr.io/docs/1.x.x/api/domains/deleteweekly0.5https://routr.io/docs/1.x.x/api/domains/getweekly0.5https://routr.io/docs/1.x.x/api/domains/listweekly0.5https://routr.io/docs/1.x.x/api/domains/updateweekly0.5https://routr.io/docs/1.x.x/api/gateways/createweekly0.5https://routr.io/docs/1.x.x/api/gateways/deleteweekly0.5https://routr.io/docs/1.x.x/api/gateways/getweekly0.5https://routr.io/docs/1.x.x/api/gateways/listweekly0.5https://routr.io/docs/1.x.x/api/gateways/updateweekly0.5https://routr.io/docs/1.x.x/api/location/createweekly0.5https://routr.io/docs/1.x.x/api/location/deleteweekly0.5https://routr.io/docs/1.x.x/api/location/listweekly0.5https://routr.io/docs/1.x.x/api/numbers/createweekly0.5https://routr.io/docs/1.x.x/api/numbers/deleteweekly0.5https://routr.io/docs/1.x.x/api/numbers/getweekly0.5https://routr.io/docs/1.x.x/api/numbers/listweekly0.5https://routr.io/docs/1.x.x/api/numbers/updateweekly0.5https://routr.io/docs/1.x.x/api/overviewweekly0.5https://routr.io/docs/1.x.x/api/peers/createweekly0.5https://routr.io/docs/1.x.x/api/peers/deleteweekly0.5https://routr.io/docs/1.x.x/api/peers/getweekly0.5https://routr.io/docs/1.x.x/api/peers/listweekly0.5https://routr.io/docs/1.x.x/api/peers/updateweekly0.5https://routr.io/docs/1.x.x/api/registryweekly0.5https://routr.io/docs/1.x.x/api/status/getweekly0.5https://routr.io/docs/1.x.x/api/status/updateweekly0.5https://routr.io/docs/1.x.x/api/sys/infoweekly0.5https://routr.io/docs/1.x.x/api/sys/logsweekly0.5https://routr.io/docs/1.x.x/api/tokenweekly0.5https://routr.io/docs/1.x.x/conceptsweekly0.5https://routr.io/docs/1.x.x/configuration/agentsweekly0.5https://routr.io/docs/1.x.x/configuration/domainsweekly0.5https://routr.io/docs/1.x.x/configuration/gatewaysweekly0.5https://routr.io/docs/1.x.x/configuration/generalweekly0.5https://routr.io/docs/1.x.x/configuration/numbersweekly0.5https://routr.io/docs/1.x.x/configuration/peersweekly0.5https://routr.io/docs/1.x.x/configuration/usersweekly0.5https://routr.io/docs/1.x.x/guides/basic-setupweekly0.5https://routr.io/docs/1.x.x/guides/routr-as-asterisk-frontendweekly0.5https://routr.io/docs/1.x.x/guides/running-on-kubernetesweekly0.5https://routr.io/docs/1.x.x/guides/running-with-docker-or-composeweekly0.5https://routr.io/docs/1.x.x/guides/securing-the-signaling-pathweekly0.5https://routr.io/docs/1.x.x/introduction/communityweekly0.5https://routr.io/docs/1.x.x/introduction/comparisonweekly0.5https://routr.io/docs/1.x.x/introduction/faqweekly0.5https://routr.io/docs/1.x.x/introduction/glossaryweekly0.5https://routr.io/docs/1.x.x/introduction/installationweekly0.5https://routr.io/docs/1.x.x/introduction/mediaweekly0.5https://routr.io/docs/1.x.x/introduction/overviewweekly0.5https://routr.io/docs/1.x.x/introduction/performance-tests/user-locationweekly0.5https://routr.io/docs/1.x.x/introduction/roadmapweekly0.5https://routr.io/docs/1.x.x/introduction/test-planweekly0.5https://routr.io/docs/1.x.x/welcomeweekly0.5https://routr.io/docs/2.0.0/changelogweekly0.5https://routr.io/docs/2.0.0/communityweekly0.5https://routr.io/docs/2.0.0/connect/command-line/ctlweekly0.5https://routr.io/docs/2.0.0/connect/command-line/overviewweekly0.5https://routr.io/docs/2.0.0/connect/conceptsweekly0.5https://routr.io/docs/2.0.0/connect/home-or-office-setupweekly0.5https://routr.io/docs/2.0.0/connect/introductionweekly0.5https://routr.io/docs/2.0.0/connect/nodesdk/overviewweekly0.5https://routr.io/docs/2.0.0/connect/nodesdk/sdkweekly0.5https://routr.io/docs/2.0.0/connect/quick-start/dockerweekly0.5https://routr.io/docs/2.0.0/connect/quick-start/kubernetesweekly0.5https://routr.io/docs/2.0.0/connect/securing-the-serverweekly0.5https://routr.io/docs/2.0.0/connect/sending-call-events-to-natsweekly0.5https://routr.io/docs/2.0.0/connect/webrtc-supportweekly0.5https://routr.io/docs/2.0.0/contributingweekly0.5https://routr.io/docs/2.0.0/development/alterations/methodsweekly0.5https://routr.io/docs/2.0.0/development/alterations/overviewweekly0.5https://routr.io/docs/2.0.0/development/building-a-chat-applicationweekly0.5https://routr.io/docs/2.0.0/development/building-a-middlewareweekly0.5https://routr.io/docs/2.0.0/development/building-a-processorweekly0.5https://routr.io/docs/2.0.0/development/building-a-scaip-processorweekly0.5https://routr.io/docs/2.0.0/development/components/apiserverweekly0.5https://routr.io/docs/2.0.0/development/components/dispatcherweekly0.5https://routr.io/docs/2.0.0/development/components/edgeportweekly0.5https://routr.io/docs/2.0.0/development/components/locationweekly0.5https://routr.io/docs/2.0.0/development/components/overviewweekly0.5https://routr.io/docs/2.0.0/development/components/registryweekly0.5https://routr.io/docs/2.0.0/development/components/requesterweekly0.5https://routr.io/docs/2.0.0/development/components/rtprelayweekly0.5https://routr.io/docs/2.0.0/development/components/simpleauthweekly0.5https://routr.io/docs/2.0.0/development/custom-data-with-the-apiserverweekly0.5https://routr.io/docs/2.0.0/development/development-mode-with-gitpodweekly0.5https://routr.io/docs/2.0.0/development/extending-the-ctlweekly0.5https://routr.io/docs/2.0.0/development/introductionweekly0.5https://routr.io/docs/2.0.0/development/metrics-events-logs-and-tracesweekly0.5https://routr.io/docs/2.0.0/development/orchestration-with-dockerweekly0.5https://routr.io/docs/2.0.0/development/orchestration-with-kubernetesweekly0.5https://routr.io/docs/2.0.0/development/quick-startweekly0.5https://routr.io/docs/2.0.0/development/testing-with-seetweekly0.5https://routr.io/docs/2.0.0/faqsweekly0.5https://routr.io/docs/2.0.0/overview/architectureweekly0.5https://routr.io/docs/2.0.0/overview/conceptsweekly0.5https://routr.io/docs/2.0.0/overview/deploy-with-dockerweekly0.5https://routr.io/docs/2.0.0/overview/introductionweekly0.5https://routr.io/docs/2.0.0/tutorials/deploying-to-civo-with-helmweekly0.5https://routr.io/docs/2.0.0/tutorials/ephemeral-agents-in-the-browserweekly0.5https://routr.io/docs/2.0.0/tutorials/intercom-system-with-routr-and-kubernetesweekly0.5https://routr.io/docs/2.0.0/tutorials/load-balancing-asterisk-with-routrweekly0.5https://routr.io/docs/2.11.5/changelogweekly0.5https://routr.io/docs/2.11.5/communityweekly0.5https://routr.io/docs/2.11.5/connect/command-line/ctlweekly0.5https://routr.io/docs/2.11.5/connect/command-line/overviewweekly0.5https://routr.io/docs/2.11.5/connect/conceptsweekly0.5https://routr.io/docs/2.11.5/connect/home-or-office-setupweekly0.5https://routr.io/docs/2.11.5/connect/introductionweekly0.5https://routr.io/docs/2.11.5/connect/nodesdk/overviewweekly0.5https://routr.io/docs/2.11.5/connect/nodesdk/sdkweekly0.5https://routr.io/docs/2.11.5/connect/quick-start/dockerweekly0.5https://routr.io/docs/2.11.5/connect/quick-start/kubernetesweekly0.5https://routr.io/docs/2.11.5/connect/securing-the-serverweekly0.5https://routr.io/docs/2.11.5/connect/sending-call-events-to-natsweekly0.5https://routr.io/docs/2.11.5/connect/webrtc-supportweekly0.5https://routr.io/docs/2.11.5/contributingweekly0.5https://routr.io/docs/2.11.5/development/alterations/methodsweekly0.5https://routr.io/docs/2.11.5/development/alterations/overviewweekly0.5https://routr.io/docs/2.11.5/development/building-a-chat-applicationweekly0.5https://routr.io/docs/2.11.5/development/building-a-middlewareweekly0.5https://routr.io/docs/2.11.5/development/building-a-processorweekly0.5https://routr.io/docs/2.11.5/development/building-a-scaip-processorweekly0.5https://routr.io/docs/2.11.5/development/components/apiserverweekly0.5https://routr.io/docs/2.11.5/development/components/dispatcherweekly0.5https://routr.io/docs/2.11.5/development/components/edgeportweekly0.5https://routr.io/docs/2.11.5/development/components/locationweekly0.5https://routr.io/docs/2.11.5/development/components/overviewweekly0.5https://routr.io/docs/2.11.5/development/components/registryweekly0.5https://routr.io/docs/2.11.5/development/components/requesterweekly0.5https://routr.io/docs/2.11.5/development/components/rtprelayweekly0.5https://routr.io/docs/2.11.5/development/components/simpleauthweekly0.5https://routr.io/docs/2.11.5/development/custom-data-with-the-apiserverweekly0.5https://routr.io/docs/2.11.5/development/development-mode-with-gitpodweekly0.5https://routr.io/docs/2.11.5/development/extending-the-ctlweekly0.5https://routr.io/docs/2.11.5/development/introductionweekly0.5https://routr.io/docs/2.11.5/development/metrics-events-logs-and-tracesweekly0.5https://routr.io/docs/2.11.5/development/orchestration-with-dockerweekly0.5https://routr.io/docs/2.11.5/development/orchestration-with-kubernetesweekly0.5https://routr.io/docs/2.11.5/development/quick-startweekly0.5https://routr.io/docs/2.11.5/development/testing-with-seetweekly0.5https://routr.io/docs/2.11.5/faqsweekly0.5https://routr.io/docs/2.11.5/overview/architectureweekly0.5https://routr.io/docs/2.11.5/overview/conceptsweekly0.5https://routr.io/docs/2.11.5/overview/deploy-with-dockerweekly0.5https://routr.io/docs/2.11.5/overview/introductionweekly0.5https://routr.io/docs/2.11.5/tutorials/deploying-to-civo-with-helmweekly0.5https://routr.io/docs/2.11.5/tutorials/ephemeral-agents-in-the-browserweekly0.5https://routr.io/docs/2.11.5/tutorials/intercom-system-with-routr-and-kubernetesweekly0.5https://routr.io/docs/2.11.5/tutorials/load-balancing-asterisk-with-routrweekly0.5https://routr.io/weekly0.5 \ No newline at end of file